javascript - 两次包含 Prototype.js 会导致 IE7 中发生冲突

标签 javascript internet-explorer prototypejs explorer

我正在使用 Prototype javascript 框架。我已将其包含在 JavaScript 代码片段中,允许人们将其复制并粘贴到他们的网站上。他们的网站可能已经包含原型(prototype),或者他们想多次包含该片段。在这两种情况下,Prototype 都会被定义两次,因此 IE7 将无法运行。几乎所有 Prototype 库函数调用时都会显示“对象不支持此属性或方法”。我试过这个:

if (typeof(Prototype) === 'undefined') {
   alert('including Prototype');
   // minified Prototype code here
}
alert('running my code');
// all my code here

当我运行此命令时,仅收到“包括原型(prototype)”警报,但“运行我的代码”从未收到警报。为什么?

最佳答案

only "including Prototype" was alerted, but "running my code" never got alerted. Why?

如果没有看到代码,我不知道——你在 JavaScript 错误控制台中得到任何东西吗?——但一种可能性是代码中的某些内容依赖于未经修饰的全局范围。例如function语句不得在 if 内使用在标准 ECMAScript 中。如果您尝试,实际发生的情况取决于浏览器,但通常它可能会覆盖先前声明的函数版本,即使 if子句不评估 true .

这个问题可以通过将 Prototype 放在自己的 <script> 中来解决在主脚本执行之前通过 DOM 方法或 document.write 插入页面的 block 。但是:

I have included it in a javascript code snippet that I allow people to copy and paste onto their websites.

是的,我真的不会这么做。在单个页面上使用多个广泛的、侵入性的框架(例如 Prototype 或 jQuery)会导致冲突和潜在的难以调试的问题。 (与同一框架的两个副本/版本相同。)

当您是可粘贴的片段时,您是另一个网站管理员家里的客人,需要尽可能减少占地面积。 IMO 这意味着您不应该使用任何框架。

关于javascript - 两次包含 Prototype.js 会导致 IE7 中发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3215063/

相关文章:

javascript - 在 IE8 中替换大下拉列表的最快方法

javascript - 使用循环在事件监听器上传递参数

Javascript 模块化原型(prototype)模式

javascript - javascript 中的异常,我应该使用它们吗?如何使用?

javascript setInterval 在 ie8 中很慢

javascript - 在 JavaScript 中,为什么零除以零返回 NaN,而任何其他除以零返回 Infinity?

javascript - jquery可以像prototype一样实现类继承吗

javascript - 渲染集合时避免使用多个 javascript_include_tag

css - IE 8 上的定位和图像透明失败

css3 适用于 jfiddle 但不适用于 IE