尽管调用NoConflict,jQuery Script src声明仍会抛出JavaScript错误

时间:2011-09-19 19:27:54

标签: javascript jquery prototypejs conflict

我正在使用调查设计程序,在编写自己的自定义函数/设计/等时提供(某些)自由。默认情况下,它使用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。对于那个很抱歉。有人可以帮我让这两个孩子一起玩吗?相关问题似乎没有任何答案。

编辑:这是我认为是我的问题的再现的一个小提琴: http://jsfiddle.net/vbzju/7/

选择Prototype作为框架(这是调查软件使用的),但后来我添加jQuery作为头文件,调用noConflict,然后尝试一个简单的jQuery函数。我认为抛出的错误与我在机器上出现的错误相同。

2 个答案:

答案 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);
}