document.getElementsByClassName打破由Prototype Override引起的jQuery类选择器

时间:2011-05-09 15:29:25

标签: javascript jquery prototypejs conflict getelementsbyclassname

IE6中出现问题(可能是所有浏览器都预先记录了document.getElementsByClassName)。 使用带有Prototype 1.5的jQuery 1.6

<script src="../js/jquery-1.6.js" language="javascript" type="text/javascript"> </script>
<script language="javascript" type="text/javascript">
    // Prototype will claim the '$' namespace so give jQuery '$j' instead.
   $j = jQuery.noConflict();
</script>
<script src="../js/prototype.js" language="javascript" type="text/javascript"> </script>

此处讨论的问题是:http://randomous.com/forum/topic.php?id=916(请参阅第2篇文章)和此处:http://ejohn.org/blog/getelementsbyclassname-pre-prototype-16

基本上,Prototype在浏览器中创建了document.getElementsByClassName,该函数早于该功能(现在大多数浏览器本身都支持它)。

然而,jQuery还检查document.getElementsByClassName的存在,当它找到它时,它假定它正在获得本机实现;但实际上它的Prototypes实现并不像jQuery所期望的那样。

我尝试了很多技巧来解决这个问题,但都没有奏效。 [试图告诉jQuery document.getElementsByClassName未定义,尝试停止声明document.getElementsByClassName等原型。]

该应用程序是旧的(因此旧的原型),不幸的是,它将主要在IE6&amp; IE7(是的,FML)。我正在尝试使用最新的jQuery,因为那是我很舒服的地方,我需要在应用程序中添加许多疯狂的UI控件 - combobox autocomplete dragdroppy madness ....基本上我需要jQuery。

这里的最终结果是我在使用jQuery的类选择器的任何时候都会出错 - $('。someClass')

有什么想法吗?我认为我用javascript很不错,但这让我很难过。

2 个答案:

答案 0 :(得分:1)

当调用没有任何标签的类选择器时,我遇到了同样的问题,例如$('.myClass') $('div.myClass')运作良好时导致错误。我将$('.myClass')替换为$('*.myClass')并开始工作

答案 1 :(得分:0)

这个答案可能看起来有点简单,但是,将原型更新到最新。他们放弃了那个糟糕的决定:http://www.prototypejs.org/api/utility/getElementsByClassName

我意识到你可能正在支持你自己没有构建的应用程序,但我也会说如果你将来可以选择,那么永远不要选择一个与其他框架功能相关的框架检测

伪造原生功能应被视为有害。我在看着你,原型。