【问题标题】:How do I bind a click event to an object that is not yet in the DOM?如何将点击事件绑定到尚未在 DOM 中的对象?
【发布时间】:2014-02-13 23:29:58
【问题描述】:

首先,我尝试了thisand this 类似问题中的答案,但这似乎对我根本不起作用。

我想对绑定到通过 ajax 创建的元素的点击事件做一些事情,所以它一开始不在 DOM 中。

我注意到my_asset.js.coffee 中的以下咖啡脚本按预期工作:

$ ->  
  $('#div').on "click", ".link", (e) -> 
    #do stuff 

根据 JQuery Doc: 此函数绑定到所有“selected_div”点击事件,即使它们稍后通过 ajax 添加到 DOM 中 do stuff 部分工作正常

但是我想:

$(this).after("<%= insert some long view here %>")

所以,为了做到这一点,我想我应该将$(this).after 部分从asset.js.coffee 移动到my_view.js.erb 我可以在哪里嵌入render partial

在那里,在my_view.js.erb,我尝试了以下(等效)javascript:

$(function() {  
  $("#div").on("click", ".link", function() {
    $(this).after("<%= render partial here %>");
  });
});

但它不适用于第一次点击,(但是,它适用于随后的点击)

我认为这与第一次加载页面时.link不在DOM中有关。

为什么会这样?是这个原因吗?我怎样才能在视图中获得与资产中相同的行为?

【问题讨论】:

  • 页面加载时#div 是否在 DOM 中?尝试使用: $("body").on("click", "#div .link", function() {
  • 是的,是的。试过了,还是不行

标签: javascript jquery ruby-on-rails dom coffeescript


【解决方案1】:

您将绑定到容器元素(通常为 documentbody),并将 delegate 事件绑定到要创建的对象:

$(document).on("click", "#div .link", function() {
    $(this).after("<%= insert some long view here %>");
});

绑定

正如您所指出的,JS 在页面加载时将事件绑定到 DOM 的元素

如果您的元素在加载时不存在,JS 将无法绑定,从而导致问题。要解决此问题,您必须将绑定委托给 DOM 层次结构中的元素更高,从而允许 JS 将事件绑定到与您的容器相关的任何新元素

【讨论】:

  • 好吧,我已经尝试过了,但它对我不起作用。我想明确一点,在我尝试过的操作中:$("#div").on("click", ".link", function() { #div IS 在页面加载时的 DOM 中。我也尝试过$(document).on("click", "#div .link", function() {,但我仍然无法得到我想要的。从第二次点击开始工作,但不适用于第一次
  • 我可以在my_asset.js.coffeemy_view.js.erb 中使用相同的功能(单击相同链接时相同)吗?为什么它在资产中起作用而不在视图中起作用?他们执行的顺序是什么?
  • 你能发布你的#div.link的HTML吗?
  • 当然,这是 .link 的 html:&lt;a class="sii_link" data-remote="true" data-sii-id="24337" format="js" href="/spectrum_identifications/8/results/24334/identification_item?sii_id=24337"&gt;SII_1_1_Mzid_2&lt;/a&gt;,而 #div 是一个表格(链接稍后在其中创建,但在页面加载时存在):&lt;table class="my_table" id="sii_table"&gt; 跨度>
猜你喜欢
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
相关资源
最近更新 更多