原型和jQuery和平共处?

Posted

技术标签:

【中文标题】原型和jQuery和平共处?【英文标题】:prototype and jQuery peaceful co-existence? 【发布时间】:2010-09-29 18:08:33 【问题描述】:

我对 javascript 知之甚少,但尽管如此,我还是想在我的 wordpress 博客上拼凑一些东西。它不起作用,我不知道如何解决它,嘿,这就是 *** 的用途,对吧?

首先,错误信息是:

Error: element.dispatchEvent is not a function
Source File: http://.../wp-includes/js/prototype.js?ver=1.6
Line: 3936

它发生在页面加载时。我的页面加载处理程序是这样注册的:

Event.observe(window, 'load', show_dates_as_local_time);

如果我禁用其他一些插件,错误就会消失,而这(加上谷歌搜索)让我得出结论,这是原型和 jQuery (被其他一些插件使用)之间的冲突。

其次,我遵循 wordpress 推荐的做法,即使用 wp_enqeue_script 将我的 JavaScript 的依赖项添加到 Prototype 库,如下所示:

add_action( 'wp_print_scripts', 'depo_theme_add_javascript' );

function depo_theme_add_javascript() 
    wp_enqueue_script('friendly_dates', 'javascript/friendly_dates.js', array('prototype'));

现在我也知道 jQuery 和 Prototype 之间存在一些潜在的冲突,这些冲突可以使用 jQuery noConflicts 方法解决。我试过从不同的地方打电话,但没有用。我不认为这是问题所在,因为 a) noConflict 函数仅与 $ 变量相关,这似乎不是问题,并且 b) 我会 希望 wordpress 帮我解决,因为它可以...

最后,使用 Venkman 调试器,我确定错误消息中引用的element 确实是htmlDocument,但也缺少dispatchEvent。不知道这是怎么发生的,因为它是一个标准的 DOM 方法?

【问题讨论】:

【参考方案1】:

我非常喜欢许多库的一个令人讨厌的技巧,看起来原型就是其中之一。

Mootools 会这样做,如果我是对的,它涉及重载基本类上的许多原型,猴子修补它们。

同样,当 mootools 和 jQuery 存在时,我同样遇到了奇怪的行为,通常 jQuery 死了,因为它正在调用一些对象方法,该方法已被 Mootools 以某种方式重载/猴子修补。

此外,不可思议的是,将 mootools 从脚本使用列表中删除后,一切运行得更快,我的结论是对象污染更少。

现在我可能是错的,但根据我的经验,我得出的结论是,这些库根本不喜欢彼此共存,并且看到 mootools 代码在我看来如何降低完成正常事情的速度,我吸收所有基于 mootools 的代码并将其移植到 jQuery(我向您保证这是一项耗时的交易),结果是 fast 并且 没有奇怪错误的代码那是无法解释的。

我建议您将迁移视为至少 一个 选项。

还有一件事,写作时:

我倾向于在我所有的 jQuery 驱动代码中使用这种语法,以便在有人以某种方式破坏 '$' 的情况下进行一些安全封装。

运行时代码 这会在执行前等待 document.ready:

 jQuery(function($) 
      code_with_$_here; 
 ); 

jQuery 插件

(function($) 
    code_with_$_here; 
)(jQuery); 

使用这些将使人们更容易使用您碰巧编写的任何 jQuery 都能够使用它而不会出现太多冲突问题。

这基本上会让他们确保他们的代码没有做任何真正神奇的事情。

【讨论】:

谢谢,是的,这种可能性越来越大。当然,对于像我这样对 JavaScript 一无所知的人来说,jQuery 有点吓人……但它可能比解决这个特殊问题更容易!【参考方案2】:

JQuery 网站上关于Using JQuery With Other Libraries 的这篇文章值得一读。它处理的不仅仅是 noConflict 选项。

【讨论】:

【参考方案3】:

我认为你应该好好搜索一下,因为所有的 jQuery 插件都有一个原型版本,所有的原型插件都有一个 jQuery 版本。 如果你真的没有找到你所看到的并且你不能只使用一个库,请查看here@

jQuery.noConflict();

但是,我认为为每个库加载超过 15-20kb 是没有意义的 :)

【讨论】:

【参考方案4】:

感谢大家的建议。最后我认为肯特的解释是最接近的,基本上相当于“原型坏了”。 (对不起,如果我对你的总结不正确:)

至于jQuery.noConflict 选项 - 我已经在问题中提到了这一点。 什么时候你运行这个方法会有所不同,而我对此几乎没有控制权。正如我所说,我尝试在几个不同的地方(特别是页眉和我的脚本文件)运行它,但没有效果。因此,正如我们所希望的那样,“只使用 noConflict不是这个问题的答案,至少在没有其他信息的情况下不是。

此外,jQuery.noConflict 似乎$ 变量有关,并且错误点周围的代码根本不处理该变量。当然它们可能是间接相关的,我没有追查到。

所以基本上我最终使用 jQuery 而不是 Prototype 重写了脚本,这实际上有其自身的问题。无论如何我已经发布了整个war story on my blog,如果你有兴趣的话。

【讨论】:

以上是关于原型和jQuery和平共处?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery原型

原型和原型链

将 ES6 插件扩展为 jQuery 原型

使用构造函数模式和插件原型时如何在jquery中触发函数?

jQuery CVE-2019-11358 原型污染漏洞分析和修复建议

jQuery CVE-2019-11358原型污染漏洞分析和修复建议