1

我们在我们的项目中使用 Mootools 和 JSF Richfaces 来构建应用程序组件。我们需要使用 Richfaces 模式面板在会话超时时显示警报。但是当同时使用 Mootools 和丰富的面孔模态面板时,我们会遇到一些错误,这表明两者使用的冲突prototype.js

我可以在浏览器控制台中看到的错误如下:

Uncaught TypeError: undefined is not a function localhost:8080/ca/faces/a4j/g/3_3_3.Finalorg.ajax4jsf.javascript.PrototypeScript:46 Uncaught TypeError: Illegal invocation localhost:8080/ca/faces/a4j/g/3_3_3。 Finalorg.ajax4jsf.javascript.PrototypeScript:31 未捕获的类型错误:非法调用 localhost:8080/ca/faces/a4j/g/3_3_3.Finalorg.ajax4jsf.javascript.PrototypeScript:265

高度赞赏对该问题的任何提示/解决方案。

~拉吉什

4

1 回答 1

4

这一点以前已经说过很多次了。所以让我们再做一次:

你不能同时运行 Mootools 和 Prototype.js。曾经。是不可能的。

为什么?

两者都是原型——即它们通过添加或更改诸如数组、函数、数字、字符串、元素之类的原型来扩展本机类型。

尽管像 jQuery 这样的库在单个入口点之后包装/链接方法$,允许您使用noConflict/ 闭包等,但您不能在通用类型的原型上拥有多个具有相同名称的方法实现。

实际上,如果说 MooTools 的实现String.prototype.contains不同于 Prototype 的实现(以及 ES6 的实现),它将破坏您的 MooTools 代码或原型代码,具体取决于最后加载的代码。此外,ES6 实现没有受到保护,并且被 MooTools 覆盖(例如)。

最后加载也不能确保一切正常。如果脚本有如下检查:

if (!String.prototype.trim) String.prototype.trim = function(){ ... }; 

...并且期望是,如果它在那里,它必须是本机规范实现,它也删除了诸如此类 的东西,然后框架不会重新定义它。因此,即使它看起来可以正常工作,您也可能会遇到意外行为并且难以捕捉错误。

tl; dr:不要使用两个框架或至少使用 jquery + 两者之一。Prototypal 框架使用起来并不安全,而且已经过时了——MooTools 和 Prototype 都比 jQuery 更强大,但是他们输掉了这场战争,因为它们更难维护和与其他人的代码一起使用。

于 2014-10-30T09:59:48.440 回答