【问题标题】:document.getElementsByClassName breaking jQuery class selector caused by Prototype Override原型覆盖导致的 document.getElementsByClassName 破坏 jQuery 类选择器
【发布时间】:2011-08-21 19:08:05
【问题描述】:

问题出现在 IE6 中(可能所有浏览器都早于 document.getElementsByClassName)。 使用 jQuery 1.6 和 Prototype 1.5

<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 和 IE7 上运行(是的,FML)。我正在尝试使用最新的 jQuery,因为那是我很舒服的地方,我需要向应用程序添加许多疯狂的 UI 控件 - 组合框自动完成 Dragdroppy 疯狂......基本上我确实需要 jQuery。

这里的最终结果是每当我使用 jQuery 的类选择器 - $('.someClass') 时都会出错

这里有什么想法吗?我认为我在 javascript 方面做得不错,但这让我很生气。

【问题讨论】:

  • 你能展示一些你试过的代码吗?也许可以做个小技巧?

标签: javascript jquery prototypejs conflict getelementsbyclassname


【解决方案1】:

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

而且我意识到你可能支持一个不是你自己构建的应用程序,但我还要说,如果你将来有选择权,永远不要选择一个与其他框架执行功能的能力相冲突的框架检测。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      相关资源
      最近更新 更多