【问题标题】:Binding a click event to content loaded via AJAX without making it delegated?将单击事件绑定到通过 AJAX 加载的内容而不进行委托?
【发布时间】:2015-09-25 13:21:16
【问题描述】:

我有一种情况,我在网站的特定部分的许多情况下使用名为 data-commanddata 属性,而不是绑定大量单独的点击事件,我决定只使用一个并使用开关如:

$('[data-command]').on('click', function(event) {

    // Prevent default click action
    event.preventDefault();

    // Get command
    var command = $(event.target).data('command');

    switch (command) {
        // Do stuff...
    }

    // Prevent default click action (IE 8)
    return false;

});

但是,当试图让它处理通过 AJAX 加载的数据时,它刚刚成为一个问题。

这显然有效..

$('#existing_element').on('click', '[data-command]', function(event) {

...但由于它应该适用于网站该部分的许多不同页面,因此上述内容不适用于所有页面。

可以只是确保将特定的id 提供给我加载所有 ajax 数据的父包装器,但这意味着使用一堆相同的代码创建两个单独的绑定事件.

我也可以这样做以覆盖所有基地..

$(document).on('click', '[data-command]', function(event) {

...但是将元素绑定到文档可能不是一个明智的想法。

编辑: Html 数据正在通过 jQuery 的 html 方法加载到 DOM

我可以用任何 clean 方法来处理这个问题,还是应该只创建两个不同的绑定事件来处理每种情况?

【问题讨论】:

  • 能否添加AJAX的代码以及如何在DOM中添加元素
  • ..but that's probably not such a wise idea binding an element to the document. - 为什么?
  • @raina77ow stackoverflow.com/questions/12824549/… - 我从中得到的是应该避免这种情况。
  • “我可以确保为父包装器提供一个特定的 id……,但这意味着要制作两个单独的绑定事件……” 为什么这需要两个事件?这行不通:$('<parent_wrapper_selector>').on('click', '[data-command]', function(event) {…})
  • 你的情况不是和...when the objects you are capturing events on are dynamically created/removed and you still want to capture events on them without having to explicitly rebind event handlers every time you create a new one一样吗?

标签: javascript jquery ajax event-delegation jquery-on


【解决方案1】:

事件委托是在动态创建的元素上绑定事件的最佳方法。由于您不想使用事件委托,请使用以下方法来绑定事件。

$('[data-command]').off('click').on('click', clickHandler);

// Somewhere in the same scope
function clickHandler(e) {
    // Handle click event here
}

在使用html() 添加动态创建的元素后添加此项。

off('click') 将首先取消绑定之前应用的点击事件处理程序,然后on('click', 将在所有匹配选择器的元素上绑定点击处理程序。


编辑

这似乎是一次又一次地重复相同的代码。我不能让它保持干燥吗?

是的,您可以通过创建一个函数来绑定事件并在您想要绑定事件时调用相同的函数来保持代码干爽和干净。

function clickHandler(e) {
    // Handle click event here
}

function bindEvent() {
    $('[data-command]').off('click').on('click', clickHandler);
}

$(document).ready(bindEvent);

...

$.ajax({
    ...
    success: bindEvent
....

【讨论】:

  • 这不是基本上只是将元素绑定两次,正如您所说的通过html将此代码添加到页面吗?我正在尝试找出一种方法可以将所有内容绑定在同一事物中。
  • @Brett 这不会为元素绑定两次事件,如果先删除之前绑定的事件,然后绑定新的事件。仅在需要使用事件委托时对所有元素执行相同的操作。
  • 抱歉,选词不当。我所说的两次是两次拥有相同的代码而不是被绑定两次。就像我可以很容易地在有和没有事件委托的情况下绑定它一样,但这只是意味着重复代码,这就是我用这个方法要做的事情。
  • @Brett 请检查更新并让我知道您的 cmets
猜你喜欢
  • 2023-04-04
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多