如何使用 ajax 和 UJS 将事件处理程序分配给页面对象

发布于 2024-09-18 13:14:27 字数 572 浏览 9 评论 0原文

有人可以建议解决此问题的好方法吗:

在页面加载时,将事件处理程序添加到页面元素。例如:

// Javascript
// when page is loaded...
jQuery(document).ready(function) {
  // assign this handler to the buttonDiv element...
  jQuery("#buttonDiv").click(function() {
    // to alert "hello"
    alert("hello");
  });
}


// HTML 5
<div id="buttonDiv">Click me </div>

这按预期工作 - 太棒了!

但是假设当加载文档并稍后使用 Ajax 将其添加到 DOM 时,div#buttonDiv 不存在。在这种情况下,不会添加 click() 事件处理程序,也不会调用任何警报。

如何在不使用内联 JavaScript 的情况下向该元素添加事件处理程序?

欢迎任何建议。

Can someone please advise a good approach to this problem:

On page load, an event handler is added to a page element. For example:

// Javascript
// when page is loaded...
jQuery(document).ready(function) {
  // assign this handler to the buttonDiv element...
  jQuery("#buttonDiv").click(function() {
    // to alert "hello"
    alert("hello");
  });
}


// HTML 5
<div id="buttonDiv">Click me </div>

This works as expected - GREAT!

But suppose the div#buttonDiv wasn't present when the document is loaded and is added to the DOM later using Ajax. In this case, the click() event handler is not added and no alert will be called.

How would one add an event handler to this element without using in-line javascript?

Any suggestions welcome.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

随波逐流 2024-09-25 13:14:27

这就是 .live() 的用途:)像这样:

jQuery(function) {
  jQuery("#buttonDiv").live("click", function() {
    alert("hello");
  });
});

.live() 在元素出现时不添加事件处理程序确实添加了,但是当您运行它时,它会向 document 添加一个事件处理程序,并侦听冒泡的 click 事件。由于新旧元素以相同的方式冒泡...它们何时添加并不重要,只要选择器匹配,click 处理程序仍然有效。

还有一个类似的 .delegate() (甚至使用 .live() 内部),如果您知道该按钮将在某个容器内,假设您通过 AJAX 重新加载 #content 容器,它看起来像这样:

jQuery(function) {
  jQuery("#content").delegate("#buttonDiv", "click", function() {
    alert("hello");
  });
});

这会在 #content 它只是在捕获它之前保存一些气泡,而不是让它一直到 document...实际上,两者都很好,并且您无法分辨性能差异,除非您'正在执行大量 .live() 事件处理程序。

This is what .live() is for :) Like this:

jQuery(function) {
  jQuery("#buttonDiv").live("click", function() {
    alert("hello");
  });
});

.live() doesn't add an event handler when an element is added really, but it adds an event handler to document when you run it, and listens for click events that bubble up. Since old and new elements bubble the same way...it doesn't matter when they were added, the click handler still works, as long as the selector matches.

There's also a similar .delegate() (which even uses .live() internally) that you can use if you know the button will be inside a certain container, say you're re-loading the #content container via AJAX, it'd look like this:

jQuery(function) {
  jQuery("#content").delegate("#buttonDiv", "click", function() {
    alert("hello");
  });
});

This adds that listener for bubbling events at #content which just saves a few bubbles before catching it, as opposed to having it go all the way to document...in practice either are fine and you can't tell the performance difference, unless you're doing a ton of .live() event handlers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文