11

我对 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 之间存在一些潜在的冲突,这些冲突是使用 jQuerynoConflicts方法解决的。我试过从不同的地方打电话,但没有用。我认为这不是问题,因为a)noConflict函数仅与$变量相关,这似乎不是问题,并且b)我希望wordpress为我解决它,因为它可以......

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

4

4 回答 4

11

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

如果我是对的,Mootools 就是这样做的,它涉及在基本类上重载许多原型,并对其进行修补。

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

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

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

我建议您至少将迁移视为您的选择之一

还有一件事,写作时:

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

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

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

jQuery 插件

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

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

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

于 2009-01-06T06:27:05.697 回答
6

值得在 JQuery 网站上阅读这篇关于将 JQuery 与其他库一起使用的文章。它处理的不仅仅是 noConflict 选项。

于 2009-01-06T06:48:55.373 回答
5

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

jQuery.noConflict();

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

于 2009-01-06T12:42:09.917 回答
0

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

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

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

所以基本上我最终使用 jQuery 而不是 Prototype 重写了脚本,这实际上有自己的问题。无论如何,我已经在我的博客上发表了整个战争故事,如果你感兴趣的话。

于 2009-01-11T22:23:21.653 回答