【问题标题】:jquery .on() triggering event twicejquery .on() 触发事件两次
【发布时间】:2013-01-22 12:26:49
【问题描述】:

我有一些动态生成的表单域。我想根据刚刚更改的值更新输入字段。摆弄下面的代码后,事件似乎触发了两次(因为警报触发了两次)。第一次触发改变了我想要的文本字段,但是在第二次触发时将其更改为零。为什么下面的代码会触发两次?我怎样才能防止这种情况发生?

咖啡脚本

$(document).on 'change','#qty', ->
  $('#amount').val($(this).val())
  alert($(this).val())

Javascript 等价于上述

$(document).on('change', '#qty', function() {
  $('#amount').val($(this).val());
  return alert($(this).val());
});

【问题讨论】:

  • 很可能您将事件绑定了两次。
  • 动态添加元素后是否运行此代码?
  • 是的。我有一个添加表单字段的链接。生成字段后,我尝试更改值。
  • 你不需要.on的事件委托版本。

标签: javascript jquery


【解决方案1】:

on() 函数没有问题。见this fiddle。

代码:

$('body').append($('<input>').attr('id', 'dynamic'));
$(document).on('keyup', '#dynamic', function(e) {
    console.log(e, e.target);
    /*
    Since all functions in JavaScript has a return value, 
    and if you don't specify them they would default to undefined, 
    thus you might return something explicitly here. 
    But it has no effect upon the execution of the on() function.
    */
});

我猜你绑定了偶数处理程序两次。这是最有可能的情况。为了测试这一点,我建议您首先使用$('#dynamic').data('events') 检查#dynamic 元素的附加处理程序。如果它是未定义的,那么你还没有绑定任何处理程序,但如果它返回一个对象,那么你已经绑定了一些事件。

【讨论】:

    【解决方案2】:

    由于每次添加元素时都在运行代码,因此只需直接绑定即可。

    $("#qty").on("change",...
    

    【讨论】:

    • 由于某种原因似乎没有触发任何事件
    • @ctilley79 你能给我们更多的背景信息吗?与您添加元素相关的这段代码位于何处?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多