我正在使用调查设计程序,在编写自己的自定义函数/设计/等时提供(某些)自由。默认情况下,它使用Prototype。我也想使用jQuery。在标题中,我声明了jQuery并调用noConflict,如下所示:
<script src="SurveyResource/jquery.js"> </script>
<script>
jQuery.noConflict();
</script>
当我尝试加载页面时,我得到经典的“对象不支持此属性或方法”错误。我也尝试删除noConflict脚本,只是声明仍然会出错。在快速调试之后,我发现在这个函数中,prototype.js中发生了错误:
fire: function(element, eventName, memo) {
element = $(element);
if (element == document && document.createEvent && !element.dispatchEvent)
element = document.documentElement;
var event;
if (document.createEvent) {
event = document.createEvent("HTMLEvents");
event.initEvent("dataavailable", true, true);
} else {
event = document.createEventObject();
event.eventType = "ondataavailable";
}
event.eventName = eventName;
event.memo = memo || { };
if (document.createEvent) {
element.dispatchEvent(event);
} else {
element.fireEvent(event.eventType, event);
}
return Event.extend(event);
}
具体来说,就在这一行:element.fireEvent(event.eventType, event);
。另外,我正在使用IE8。对于那个很抱歉。有人可以帮我让这两个孩子一起玩吗?相关问题似乎没有任何答案。
选择Prototype作为框架(这是调查软件使用的),但后来我添加jQuery作为头文件,调用noConflict,然后尝试一个简单的jQuery函数。我认为抛出的错误与我在机器上出现的错误相同。
答案 0 :(得分:1)
在你的小提琴中,jquery被加载了两次。下面是一个使用闭包的示例,以便您可以对jquery和prototype使用$符号。 http://jsfiddle.net/vbzju/14/此外,您应首先加载jquery然后再加载原型。
答案 1 :(得分:1)
我还发现NoConflict不足以使Internet Explorer看起来不那么错。对prototype.js函数fire(围绕5631行)的以下修改对我有用:因为Firefox,Safari和Chrome的一切正常,我在navigator.userAgent字符串中检查版本标记,如果找到MSIE则避免调用dispatchEvent。 我添加了str和n局部变量。对于MSIE以外的浏览器,n为null:
function fire(element, eventName, memo, bubble) {
element = $(element);
if (Object.isUndefined(bubble))
bubble = true;
if (element == document && document.createEvent && !element.dispatchEvent)
element = document.documentElement;
var event;
if (document.createEvent) {
event = document.createEvent('HTMLEvents');
event.initEvent('dataavailable', true, true);
} else {
event = document.createEventObject();
event.eventType = bubble ? 'ondataavailable' : 'onfilterchange';
}
event.eventName = eventName;
event.memo = memo || { };
var str=navigator.userAgent;
var n=str.match(/MSIE/g);
if ((document.createEvent) && (n == null))
element.dispatchEvent(event);
else
element.fireEvent(event.eventType, event);
return Event.extend(event);
}