【问题标题】:Bind event to sub element from AJAX将事件绑定到 AJAX 中的子元素
【发布时间】:2014-09-03 21:41:43
【问题描述】:

为了提高可维护性,我尝试将在脚本中动态生成的 HTML 替换为 AJAX 查询结果。但是将事件处理程序绑定到动态内容存在相当少见的问题,尽管有很多解决方案,其中大部分只是部分起作用。我的意思是,如果我写了

$("#m" + event.PeerId).live("hover", function (args) { debugger; }

它可以工作,但是

$("#m" + event.PeerId + " sendMessage").live("click", function (args) { debugger; }

不起作用,如果我单击,事件不会发生。我也可以跟踪根下载元素的悬停事件,但我无法跟踪加载、就绪等 - 它们也永远不会发生。

请告诉我如何处理作为加载内容的某些子元素的按钮点击。

【问题讨论】:

  • 试试 $("#m" + event.PeerId").find("sendMessage").on("click");
  • @Vaibhav Katole:它是动态加载的内容,因此在运行此代码时将不存在。它需要一个委托的事件处理程序。
  • 如果下面的代码不起作用,我需要查看您的 HTML 示例(或其余相关代码)

标签: javascript jquery html asp.net ajax


【解决方案1】:

如果您使用的是任何最新版本的 jQuery,您应该使用 委托事件处理程序

$(document).on("click", "#m" + event.PeerId + " sendMessage", function (args) {
     debugger;
});

如果你的 id 都以 m 开头,但 peerid 还不知道,使用这个:

$(document).on("click", "[id^=m] sendMessage", function (args) {
     debugger;
});

委托的事件处理程序应该附加到一个不变的祖先(document 是默认值,如果没有更接近变化的元素是方便的)。

它们的工作方式是侦听使祖先冒泡的事件,处理程序附加到的事件,然后应用jQuery过滤器,调用函数对于导致事件的每个匹配元素

注意:切勿将'body' 用于委托事件处理程序,因为它存在与样式相关的错误(这可能导致事件不发生)。如果您没有更接近的不变元素,请始终使用document

【讨论】:

  • jQuery 是 1.8.2(来自 Visual Studio 2012 提供的 ASP 4 模板)。我尝试过的上面的代码在单击按钮后不会运行事件处理程序。可能我只需要刷新 jQuery 吗?
  • 它是在 jQuery 1.7 中添加的:api.jquery.com/on 我缺少一个右括号。已修复 :) 如果您的 PeerId 值是稍后生成的,您可以使用 $(document).on("click", [id^=m] sendMessage', function()... 匹配所有这些值 ^= 是 startswith 选择器(基本上任何以 m 开头的 id)。
  • PeerId 在处理程序的代码中也将是必需的。这就是我动态添加处理程序的原因。
  • 您可以改为从元素中提取对等 id。从 id 属性值中提取该值应该很容易,因为它们是固定模式,例如var peerid = $(this).closest('[id^m]').attr('id').substr(1)。有关更具体的详细信息,您需要显示其余相关代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
相关资源
最近更新 更多