2012-07-17 202 views
0

不要仔細看代碼,我會嘗試編寫僞代碼,只是爲了理解這個想法和我的問題。所以,想象我有這樣的功能(注意var name = $('#name').val();Javascript事件處理程序

function createFolder(button1, button2, element){ 

    var btns = {}; 
    btns[button1] = function(){ 
     var name = $('#name').val(); 
     ..... 
     $(this).dialog("close"); 
    }; 
    btns[button2] = function(){ 
     // Do nothing 
     $(this).dialog("close"); 
    }; 
    $("<form><input type='text' id='name' name='name'/></form>").dialog({ 
     autoOpen: true, 
     title: 'Condition', 
     modal:true, 
     buttons:btns 
    }); 
    } 

基本上它是僅僅指剛進行了對話,這將打開一個表格和2個按鈕。

好吧,當DOM加載我的插件激活做一些魔術時,運行公開表<tr>標籤和每個<a>標籤獲取附加到它的事件處理程序。事情是這樣的:

function initialize(){ 
    ...Some magic here... 
    ..... 

    node.find('#action-links').children().on('click',function(e){ 
    createFolder(node,'Create Folder', 'Cancle'); 

    } 
    ..... 
} 

會發生什麼事是是內createFolder功能我再次調用初始化,以及相同的元素#動作+鏈接獲得超過1個事件處理程序,當我點擊其中第二個被執行多次,第三等時間。我通過刪除舊的事件處理程序來處理它。 jquery停止傳播方法,據我所知,也有幫助。

我不明白的是爲什麼當我得到輸入值的變量'名稱',第一次它得到它漂亮,但是當我點擊第二,第三等時間我總是得到價值我插入第一次而不是我插入的新價值。如果我不在createFolder函數中調用initialize,並且不分配多個事件處理程序,那麼一切正常。我認爲事件處理程序有問題......但我不能確定。

回答

0

您不斷創建具有相同ID的新表單元素。由於ids應該是唯一的,它似乎只引用您創建的第一個元素。 createFolder函數的最後一部分應該是這樣的:

if (!$('#form-name').length) { 
    $('body').append($("<form id='form-name'><input type='text' id='name' name='name'/></form>")) 
} 
$("#form-name").dialog({ 
    // etc 
}); 
+0

非常感謝您的回答。這是有道理的,我不知道它每創造一個新形式。 – Viktor 2012-07-17 13:37:44