javascript - 当 DOM 动态变化时,如何处理附加 `data-*` 属性的 JavaScript 事件?

标签 javascript jquery ruby-on-rails ajax ruby-on-rails-4

我正在使用 Ruby on Rails 4,我想处理 data-* 的链接当某些 HTML 元素动态添加到 DOM 时,以正确的方式添加属性。也就是说,在我的 View 文件中,我有以下内容:

<div id="css_id">
  <%= link_to("Title 1", link_path, :remote => true, "data-custom-target" => "css_id"}) %>
</div>

在我的application.js我有的文件:

$(function() {
  $('a[data-custom-target]').on('ajax:success', function(xhr, data, status) {
    css_selector = $(this).data('custom-target');
    target = $("#" + css_selector);

    target.replaceWith(data);
  });
});

当我单击上面的链接时(AJAX 响应成功)容器 div替换为以下呈现的代码:

<div id="css_id">
  <%= link_to("Title 2", link_path, :remote => true, "data-custom-target" => "css_id"}) %>
</div>

如您所见,新呈现的代码包含类似的链接元素 data-custom-target属性集。但是,如果我重新单击该链接,则 application.js似乎没有与第一种情况一样有效:它似乎没有“绑定(bind)” $('a[data-custom-target]').on('ajax:success', ...)到新呈现的链接。

有什么问题吗?我该如何解决这个问题?您有什么建议?

最佳答案

为此使用事件委托(delegate),这将帮助您将事件绑定(bind)到 future 的元素。

$(function() {
  $(document).on('ajax:success',"a[data-custom-target]", function(xhr, data, status) {
    css_selector = $(this).data('custom-target');
    target = $("#" + css_selector);

    target.replaceWith(data);
  });
});

关于javascript - 当 DOM 动态变化时,如何处理附加 `data-*` 属性的 JavaScript 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23917735/

相关文章:

javascript - List.js参数问题

javascript单选按钮验证

javascript - jqModal jQuery 插件 - 如何在模式弹出窗口上设置超时?

javascript - jquery可以打开本地目录路径吗? chrome.fileSystem 可以与 jquery 一起使用来实现此解决方案吗?

javascript - 传单触发功能弹出窗口

javascript - 空文本节点和行内 block 布局

javascript - 如何使文本框平行

ruby-on-rails - 如何设置Paperclip处理原始图像?

ruby-on-rails - (Rails) Twitter Bootstrap(响应式)使用 bootstrap-sass 水平滚动问题

python - (Errno::EACCES) pygments.rb 权限被拒绝