ajax 调用后 Jquery 事件绑定两次

问题描述 投票:0回答:4

我想在通过ajax调用动态创建的元素上绑定一个事件。 某些元素已经存在,并且在页面加载时会与它们绑定一个事件。但是,当 ajax 调用后创建新元素时,新元素将失去其绑定。

我搜索并找到了一个非常好的解决方案。 ajax 调用后不会触发 Jquery 事件

在这个问题中“Jason Fingar”提出了两种解决方案来解决这个问题

  • 第二个解决方案是使用 on 方法,但它对我不起作用
  • 第一种方法有效,但有一些问题

这是他提出的第一个解决方案

“1) 封装您的“绑定”代码,并在页面加载时以及相关元素添加回页面后立即调用它。例如:“

$(document).ready(function(){
// bind event handlers when the page loads.
bindButtonClick();
});

function bindButtonClick(){
$('.myClickableElement').click(function(){
    ... event handler code ...
});
}

function updateContent(){
$.ajax({
    url : '/ajax-endpoint.php',
    data : {'onMyWay' : 'toServer'},
    dataType : 'html',
    type : 'post',
    success : function(responseHtml){
        // .myClickableElement is replaced with new (unbound) html 
     element(s)
        $('#container').html(responseHtml);

        // re-bind event handlers to '.myClickableElement'
        bindButtonClick();  
    }
});
}

我面临什么问题? 事件与新元素成功绑定,但对于旧元素或页面加载时加载的元素,事件被绑定两次。 这有什么问题吗?

javascript jquery ajax jquery-events
4个回答
8
投票

jQuery 在绑定同一事件的侦听器之前不会检查事件侦听器是否已绑定到元素。在您的代码中,

.myClickableElement
选择所有此类元素,对于现有元素,将添加重复的侦听器。

首先解除绑定事件监听器

解决此问题的一种方法是先删除侦听器,然后再次绑定它。这样,每个目标元素都会存在一次。

function bindButtonClick(){
  $('.myClickableElement').off('click').on('click', function(){
    ... event handler code ...
  });
}

通过在父元素上使用事件委托

另一种(但有效)方法是对子元素使用事件委托。我对你的 HTML 不太了解,但你可以在父元素上执行此操作(

.parent
这里是所有
.myClickableElement
元素的父元素):

$('.parent').on('click', '.myClickableElement', function() {
  ... event handler code ...
});

这也将为那些在执行此代码时不存在于 DOM 中的元素启用事件绑定。因此,这将是您问题的通用解决方案,并且 AJAX 完成时您不需要绑定侦听器。


0
投票

您可以使用

document.on
或父容器委托 cilck 事件,这适用于现有的以及动态创建的元素,无需从 ajax 调用内部一次又一次地绑定它

$(document).ready(function(){
   // If you know that elements for which click handler required can be anywhere in the document
   /*$(document).on('click', '.myClickableElement', function(){
    ... event handler code ...
   });*/

   //If you are sure that elements to which click event handler required is belongs to container elements
   $('#container').on('click', '.myClickableElement', function(){
    ... event handler code ...
   });
});

function updateContent(){
$.ajax({
    url : '/ajax-endpoint.php',
    data : {'onMyWay' : 'toServer'},
    dataType : 'html',
    type : 'post',
    success : function(responseHtml){
        // .myClickableElement is replaced with new (unbound) html 
     element(s)
        $('#container').html(responseHtml);

        // re-bind event handlers to '.myClickableElement'
        //bindButtonClick();   -- not required to bind again
    }
});
}

0
投票

您必须使用 unbind 方法取消绑定为您的元素委托的事件,然后重新绑定它。

$('.myClickableElement').unbind('click').bind('click', function(){
    // action goes here
});

如果您的

.myClickableElement
已经有附加事件,您可以通过解除绑定将其删除。

为了更好的方法,请查看此文档


0
投票

我在单击单选按钮时遇到了类似的情况,触发了多个 AJAX 请求,而不是一个。

为此我实现了以下代码

$(document).off('click', '.radio-class').on('click', '.radio-class', function() {
// AJAX request 
});
© www.soinside.com 2019 - 2024. All rights reserved.