【问题标题】:jQuery SPA Dynamically created elements, trigger events multiple timesjQuery SPA 动态创建元素,多次触发事件
【发布时间】:2014-08-26 16:41:20
【问题描述】:

我使用 jquery 制作了一些“SPA 界面”,我的主要功能是加载页面,如下所示:

$('body').on('click', '.go-to', function(event) {
    event.preventDefault();
    var _this = $(this);
    var main_container = $('#main-container');
    main_container.fadeOut('fast');
    $('.preloader').delay(400).fadeIn('slow');
    $.get(_this.attr('href'), { id : _this.attr('data-id') }, function(result) {
        main_container.html(result);
        $('.preloader').fadeOut('fast');
        main_container.delay(1000).fadeIn('slow');
    });
    return false;
});

当我多次加载某个页面时,加载元素的事件会被触发多次。 例如,当我加载 page1 5 次时,此代码将返回 'Test' 5 次。

   $('body').on('click', '#select-all', function(event) {
      console.log('Test');
   });

有人知道怎么解决吗?

【问题讨论】:

  • 您是否多次加载脚本?
  • 是的,我是。这就是我的问题的原因。非常感谢您的帮助!

标签: javascript jquery dynamic eventtrigger


【解决方案1】:

您可以在再次加载.on() 之前安全地使用.off() 以删除您从加载的同一js 脚本发出的先前.on() 事件处理程序

$('body').off('click');
$('body').on('click', '#select-all', function(event) {
      console.log('Test');
   });

http://api.jquery.com/off/

但作为一种实践,为什么需要再次加载事件侦听器? 我建议您只加载一次事件侦听器,因为 .on() 将事件绑定到任何动态生成的元素

【讨论】:

  • 我认为找到问题的原因并修复它会更好,而不是通过某种方式修复错误的代码。
  • 这不是一个错误的代码,我只是给他一个建议来解决他目前的情况,我之前遇到过这个问题,因为我的事件监听器的代码是从 ajax 加载的,所以这意味着事件监听器将被加载为我从 ajax 响应中收到它们。
  • 你不明白是什么问题。我不会只触发一次事件。我的问题的原因是多次加载 .js 文件。所以 on() 函数会执行多次。
  • @KamilMichalski 这就是为什么我告诉你使用.off() 这样即使你包含.on() 的js 也会被多次加载,之前加载的.on() 代码将被.off() 删除从而解决您的问题
  • 好的,我明白了。非常感谢。但我认为,多次不加载 .on() 是更好的解决方案。无论如何,谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-11-23
  • 2014-05-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多