2015-04-23 55 views
1

我添加事件監聽這樣的:爲什麼在點擊時應該執行一次函數1 + n次?

var runSingleTest = document.getElementById('runSingleTest'); 
runSingleTest.addEventListener('click', sendSingeleTestCase); 

當用戶單擊我的表格下面的代碼按鈕時,執行1 + n次,其中n是之前點擊該按鈕的數量。

function sendSingeleTestCase(){ 
    var frm = $('#scriptCodeForm'); 
    var btn = $('#runSingleTest'); 
    saveScriptToLocalStorage(); 
    frm.submit(function (ev){ 
     $.ajax({ 
      type: frm.attr('method'), 
      url: btn.attr('formaction'), 
      data: frm.serialize(), 
      success: function (data) { 
       console.log("Test would run once."); 
      } 
     }); 
     ev.preventDefault(); 
    });  
} 

它沒有像預期的那樣表現(當它只應執行一次時執行很多次)。

你能幫我理解爲什麼它不能按照假設工作嗎?

謝謝!

+0

嘗試'$('#runSingleTest')。one('click',sendSingeleTestCase)' –

+0

如果您也顯示您的表單HTML,我可以給出您在評論中提到的* multiple submit button *問題的示例。 –

+0

@TrueBlueAussie here:https://jsfiddle.net/93a5aok3/ – Abdizriel

回答

3

您正在連接點擊處理程序中的提交處理程序。將它們分開,以便只註冊一次提交處理程序。

例如是這樣的:

function sendSingeleTestCase(){ 
    saveScriptToLocalStorage(); 
} 

var frm = $('#scriptCodeForm'); 
var btn = $('#runSingleTest'); 
frm.submit(function (ev){ 
    $.ajax({ 
     type: frm.attr('method'), 
     url: btn.attr('formaction'), 
     data: frm.serialize(), 
     success: function (data) { 
      console.log("Test would run once."); 
     } 
    }); 
    ev.preventDefault(); 
});  

另外請注意:當你正在使用jQuery,請您點擊處理程序轉換爲眼前這個:

$('#runSingleTest').click(sendSingeleTestCase); 

或放置anoymous函數內部的處理代碼:

$('#runSingleTest').click(function(){ 
    saveScriptToLocalStorage(); 
    // Do other stuff 
}); 
+0

如果我在同一個表單中沒有提交按鈕,那麼情況如何呢? – Abdizriel

+0

他們都觸發'submit'。你需要檢查哪個按鈕觸發了它。你可以在'submit'事件中用'ev.target'來實現。 –