【问题标题】:jQuery click event executes function one more time after ajax callajax调用后jQuery click事件再次执行函数
【发布时间】:2012-10-19 03:38:06
【问题描述】:
$(document).on('click', '#slider_icons_wrapper.play', function(event) {
        var slider_icons_wrapper = $('#slider_icons_wrapper');

        slider_icons_wrapper.attr('class', 'pause');
        autoSlider(cur_img_div_pos);
        showButton('play_icon');
        console.log('play');
    });

    $(document).on('click', '#slider_icons_wrapper.pause', function(event) {
        var slider_icons_wrapper = $('#slider_icons_wrapper');

        slider_icons_wrapper.attr('class', 'play');
        clearInterval(inter);
        showButton('pause_icon');
        console.log('pause');
    });

此代码在第一次加载文档时运行良好。 当用户通过ajax调用导航到另一个页面(文档不刷新),并返回到包含#slider_icons_wrapper div的页面时,当用户单击该div时,该函数会执行两次。如果用户再次导航并返回,则函数执行 3 次,以此类推!

我做错了什么?

编辑#1

当用户导航到另一个页面时,元素 #slider_icons_wrapper 将从 DOM 中删除。当它通过 ajax 调用注入回来时,click 事件每次都会触发更多时间。当用户离开此页面时,我试图解除点击事件的绑定,但同样的事情发生了

【问题讨论】:

  • 看起来有选择器冲突。我会将 html 中的 ID 更改为 #slider_icons_wrapper_play#slider_icons_wrapper_pause
  • 我想选择一个 id="slider_icons_wrapper" 和 class="play" 或 "pause" 的 div

标签: jquery click execute


【解决方案1】:

似乎每个页面返回都将事件侦听器添加到文档中。尝试将它们添加到 document.ready --

function init(e){

    $(document).on('click', '#slider_icons_wrapper.play', function(event) {
        var slider_icons_wrapper = $('#slider_icons_wrapper');

        slider_icons_wrapper.attr('class', 'pause');
        autoSlider(cur_img_div_pos);
        showButton('play_icon');
        console.log('play');
    });

    $(document).on('click', '#slider_icons_wrapper.pause', function(event) {
        var slider_icons_wrapper = $('#slider_icons_wrapper');

        slider_icons_wrapper.attr('class', 'play');
        clearInterval(inter);
        showButton('pause_icon');
        console.log('pause');
    });

}

$(document).ready(init);

user1026361 还提出了在再次添加监听器之前删除监听器的好方法。但是,我相信在没有选择器的情况下使用 .off() 将删除通过 .on() 添加到该元素的所有侦听器。如果您采用 .off( ).on( ) 方法,我建议使用命名空间:

$(document).off('click.clickPlay').on('click.clickPlay', '#slider_icons_wrapper.play', function(event) {
    ...
});

$(document).off('click.clickPause').on('click.clickPause', '#slider_icons_wrapper.pause', function(event) {
    ...
});

【讨论】:

  • 感谢您的帮助!我也试过你的想法和user1026361,但它不起作用。
【解决方案2】:

如果您正在执行代码,其中事件处理程序设置为“导航并返回”,则您可能将多个处理程序分配给同一事件。

尝试使用这些语句:

$(document).off().on('click', '#slider_icons_wrapper.play', function(event) {

$(document).off().on('click', '#slider_icons_wrapper.pause', function(event) {

在重新分配之前清除您的处理程序

您应该始终清除您的处理程序,并注意您分配它们的位置在每次页面视图中只能看到一次。

【讨论】:

  • .off() 将删除所有事件处理程序,更好的是使用 .off('click')
  • 烤是正确的。因为您知道元素上的事件,所以您可以明确地删除它。我通常在添加所有之前删除所有,所以以上对我来说效果更好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 2016-07-09
  • 1970-01-01
相关资源
最近更新 更多