原型和jQuery和平共存?

时间:2009-01-06 05:17:54

标签: javascript jquery wordpress prototypejs

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

首先,错误信息是:

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方法,不确定如何发生这种情况?

4 个答案:

答案 0 :(得分:11)

许多图书馆都有一个令人讨厌的伎俩,我非常喜欢它,看起来原型就是其中之一。

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

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

另外,神秘的是,从脚本使用列表中取出mootools导致所有运行得更快,我得出结论是由于较少的对象污染。

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

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

写作时还有一件事:

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

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

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

jQuery插件

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

使用这些将使人们更容易使用您正在编写的任何jQuery,以便能够在没有太多冲突问题的情况下使用它。

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

答案 1 :(得分:6)

值得在JQuery网站上阅读有关Using JQuery With Other Libraries的文章。它不仅仅涉及noConflict选项。

答案 2 :(得分:5)

我认为你应该搜索好,因为所有jQuery插件都有一个原型版本,所有原型插件都有一个jQuery版本。 如果你真的找不到你的样子并且你不能只使用一个图书馆,那就去看看here

jQuery.noConflict();

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

答案 3 :(得分:0)

感谢所有建议。最后我认为肯特的解释是最接近的,基本上相当于“原型被打破”。 (对不起,如果我错误地总结了你:)

关于jQuery.noConflict选项 - 我在问题中已经提到了这一点。当运行此方法时,会有所不同,而我对此几乎没有控制权。正如我所说,我尝试在几个不同的地方(特别是页面标题和我的脚本文件)运行它,没有任何效果。所以,就像我们都喜欢它一样,“只使用noConflict这个问题的答案,至少在没有其他信息的情况下。

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

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