【问题标题】:jQuery conflict with native prototypejQuery 与原生原型冲突
【发布时间】:2014-03-10 21:27:52
【问题描述】:

我在使用带有原生 JavaScript 的 jQuery(NOTprototype.js)时遇到问题。使用以下代码时,jQuery 1.9.1 出现错误信息:

Object.prototype.myVeryGreatFunction = function() {
    // ...
}

[Error] TypeError: undefined is not a function (evaluating 'U[a].exec(s)')
ft (jquery.min.js, line 4)
wt (jquery.min.js, line 4)
st (jquery.min.js, line 4)
find (jquery.min.js, line 4)
init (jquery.min.js, line 3)
b (jquery.min.js, line 3)
(anonymous function) (read.control.js, line 59)
c (jquery.min.js, line 3)
fireWith (jquery.min.js, line 3)
ready (jquery.min.js, line 3)
H (jquery.min.js, line 3)

当我删除原型定义时,一切正常。不幸的是,我无法轻松更新 jQuery,因为它位于 CMS 的插件中,因此出于兼容性原因,它必须与旧版本一起使用。

是否有任何已知问题或解决方法?

谷歌搜索实际上向我展示了使用jQuery.noConflict() 和私有函数包装之类的解决方案。但如上所述,我使用的不是prototype.js,而是native JS 对象原型。

【问题讨论】:

标签: javascript jquery prototype conflict


【解决方案1】:

在旧版浏览器中没有安全的方法可以在不破坏 jQuery 的情况下扩展 Object.prototype。 jQuery 作者特别指出(在某处......)如果你只是将新的可枚举属性添加到 Object.prototype,jQuery 将会崩溃。

唯一的安全方式需要 ECMAScript 5 及其 Object.defineProperty 函数,该函数允许向对象添加不可枚举属性。

jQuery noconflict() 函数没有帮助 - 它是一个完全不同的问题的解决方案。

【讨论】:

    【解决方案2】:

    您可以通过将原生原型的扩展设置为不可枚举来避免这些问题:

    Object.defineProperty(Object.prototype, 'myVeryGreatFunction',{
      value : function() {},
      enumerable : false
    });
    

    Object.definePropertyMDN 上的文档

    正如 Jan Dvorak 提到的,此解决方案不适用于旧浏览器 (IE8-)。

    【讨论】:

    • 传奇!感谢分享。
    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 2010-11-01
    • 2012-01-09
    • 2011-01-29
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    相关资源
    最近更新 更多