当您加载新内容时,它将覆盖您的dom元素,并且由于事件被附加到特定元素,它会随元素一起消失。一个标准的解决方案是使用jQuery.delegate()到事件附加到一个元素越往上页上,像这样:
$('body').delegate('a.launch-js', 'click', function(ev) {
// same code as your function above
});
这工作,因为在DOM“泡沫”事件。当你点击一个元素时,它会向该元素以及它的所有祖先一直发送一个点击事件(假设没有自定义代码停止传播)。因此,您可以将事件处理程序附加到元素的祖先,并让事件处理程序本身确定点击是否来自您指定的元素。 jQuery隐藏了这个细节,并提供了一个很好的简单的委托方法来为你做这件事。
而在jQuery的1.7,这一方法已被所取代jQuery.on():
$('body').on('click', 'a.launch-js', function(ev) {
// same code as your function above
});
注意我用body
作为这里的选择,但你可以使用任何选择是所有的祖先可能的a.launch-js
es将始终存在。 dom越深(或者换一种说法,作为祖先,越靠近最终目标元素 - 在本例中为a.launch.js),效率越高,因为dom遍历越少完成检查事件。
更新:Hat @Clive,在Drupal 6仅支持jQuery 1.3版本的评论中指出了这一点。 1.3版本中没有上述方法(on
或delegate
)。取而代之的是一个叫jQuery.live()来完成这个任务的方法,和它的工作是这样的:
$('a.launch-js').live('click', function(ev) {
// same code as your function above
});
这种方法有一些性能缺陷,其他方法不(见API文档的具体细节,如果你是有兴趣的),它也被弃用,所以只有在必须使用它的时候(例如,如果你使用jQuery版本1.3并且不能升级)。
+1它可能值得一提[[live()'](http://api.jquery.com/live/),即使它已被弃用,Drupal 6仅支持1.3版本的jQuery – Clive
感谢提示@Clive。我已经更新了我的答案。 –
谢谢!使用Drupal 6与我一起工作 – jjei