【问题标题】:JQuery events and double firing?JQuery事件和双重触发?
【发布时间】:2011-12-09 22:17:12
【问题描述】:

当我使用 AJAX 动态加载 JQuery 时,具有现有事件的元素会触发多次。

基本上,我有一个名为“myjs.js”的文件,它包含我所有的 JQuery,并在页面加载时包含在内,因此为元素设置事件等。

现在,当用户触发诸如发布新评论之类的事件时,它会发送(通过 Ajax)评论,然后返回一个包含新评论、编辑评论、回复等的页面。显然是在首次加载 myjs.js 时它没有为新加载的元素创建任何事件。因此,我在使用 AJAX 返回的页面中包含了myjs.js

由于页面已经加载了myjs.js,当返回包含myjs.js的Ajax页面时,它会在页面已经加载的元素上添加另一个事件。

我已经试过了

$('*').unbind();

但这引起了一些奇怪的影响。

那么关于动态加载 JQuery 同时不影响元素已经存在的任何事件的任何想法?

【问题讨论】:

  • 查看.on(),如果您使用的是 1.7 或更高版本,或者查看.delegate(),如果您低于 1.7
  • 使用livedelegate 方法为将来的(AJAX 生成的?)元素(或on 用于jQuery 1.7+)绑定事件监听器。另见:api.jquery.com/live
  • 听起来您可能想研究委派事件,以便事件在不注入 JavaScript 的情况下也适用于新元素。
  • UserB,这不是代码问题。谢谢 PeeHaa 和 Rob,我会调查这些,非常感谢。

标签: javascript jquery javascript-events


【解决方案1】:

没有看到 jQuery 代码,我怀疑用于绑定行为的选择器过于通用,所以正如您所发现的,所有现有元素加上新加载的元素每次都匹配:

您可以在 AJAX 响应中返回的 JavaScript 中使用更具体的绑定来向新加载的元素添加行为。

但是,为每个 AJAX 请求返回相同的 JavaScript 效率很低,因为浏览器无法缓存。理想情况下,您应该尝试在主页上加载一次 JavaScript,然后依靠 jQuery 为新加载的元素自动执行 .live() 绑定。这也称为事件委托 - .delegate()

请注意,从 jQuery 1.7 开始,这些方法已被弃用,取而代之的是更简洁的事件绑定基础架构 - .on()

【讨论】:

  • 注意:请避免使用.live(),使用.delegate()。它的性能(好得多)。
  • 注意,非常感谢您的帮助。设法用10个字母整理出来。我最终使用了.on
  • 很高兴为您提供帮助,也很高兴您可以使用 1.7。事件绑定比那个版本更简单更好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
相关资源
最近更新 更多