2013-02-07 170 views
1

我有一些動態生成的表單域。我想根據剛剛更改的值更新輸入字段。在擺弄下面的代碼之後,事件似乎發生了兩次(因爲警報觸發了兩次)。第一次觸發會像我所希望的那樣更改文本字段,但是第二次觸發會將其更改爲零。爲什麼下面的代碼發射兩次?我怎樣才能防止這一點?jquery .on()兩次觸發事件

的CoffeeScript

$(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()); 
}); 
+0

最有可能你綁定了兩次事件。 –

+0

您是否在動態添加元素後運行此代碼? – alex

+0

是的。我有一個添加表單域的鏈接。生成字段後,我嘗試更改值。 – ctilley79

回答

0

既然你正在運行,每次添加元素的時間碼,只需直接綁定到它。

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

出於某種原因,似乎沒有觸發任何事件 – ctilley79

+0

將上述代碼置於'$(document).ready(function(){.....})內' – Uttara

+0

它位於$(document).ready(函數() – ctilley79

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元素。如果它沒有定義,那麼你還沒有綁定任何處理程序,但是如果它返回一個對象,那麼你已經爲它綁定了一些事件。