2013-02-15 61 views
2

在我構建的JQM(1.3.0)應用程序中,我使用「on」將所有提交按鈕綁定到click事件,現在和將來的所有提交按鈕都會綁定此事件。我在$(document).ready()中執行這些綁定,因爲我認爲它只需要被調用一次...以前。.on()綁定在觸發器('創建')後無法工作

我使用一些內容更新JQM panel,並在該內容上調用.trigger('create')。 應該發生的是新創建的提交按鈕應單擊時觸發綁定點擊事件,但它不會。

這裏是一個fiddle展示我想要實現的。在演示中,每當你點擊一個提交按鈕時,消息框應該顯示「Clicked」...不幸的是,它只發生在第一個元素上。

$(function(){ 
    $('input[type="submit"]').on('click', function(e){ 
     $('#msg').append('<div>Clicked</div>'); 
     $('#panel').html('<input type="submit" value="New Button">').trigger('create'); 
    }); 
}); 

我在使用.on()不正確嗎?我想我可以將所有的綁定放入一個函數中,然後每當調用.trigger('create')時調用該函數......但這似乎效率低下。

+0

這不是。對如何運作 – Jack 2013-02-15 01:25:38

+0

你通常會(通過選擇常見)綁定到一個家長,在這種情況下,也許一個' form.class'。 ''.live'綁定到'document'我相信,*效率低下。但問題不在於監視點擊和委託,如果某些*選擇器指定*元素冒泡(或捕獲?)。 – 2013-02-15 01:27:54

+0

我認爲:(,文檔說,取代現場直播,但我將如何綁定「爲未來」? – 2013-02-15 01:28:43

回答

2

等價的方式有綁定使用.on方法事件的兩種方式。一個是使用事件委託,它將事件綁定到一個更高級的級別元素(一直到document,如果有必要,但更接近越好),然後當事件冒泡時它會監聽它,如果它匹配它觸發的傳入選擇器。使用.on的第二種方法是直接將其綁定到元素而不使用委派。

您正在使用.on第二版的方式,但您想要的是使用第一個(委派版本)。

例如,代替目​​前的代碼,你會做類似下面

$(function(){ 
    $('#someParentElement').on('click','input[type="submit"]', function(e){ 
     $('#msg').append('<div>Clicked</div>'); 
     $('#panel').html('<input type="submit" value="New Button">').trigger('create'); 
    }); 
}); 
+0

中指定了一個容器這就是我的意思*低* – Jack 2013-02-15 01:31:59

+0

@JaredFarrish好吧我同意,我相應地編輯它 – Jack 2013-02-15 01:33:29

+0

@JaredFarrish我最初使用「lower」與「higher」形成對比 – Jack 2013-02-15 01:35:53

3

你需要

$('#someParentElement').on('click', 'input[type="submit"]', function(e){ 
    //handler 
}); 

你有它的老

$('input[type="submit"]').bind('click', function(e){ 
    //handler 
}); 
+2

我不會*使用'document'。 * is * inefficient。 – 2013-02-15 01:28:22

+0

oops - 我沒有注意到在問題 – wheresrhys 2013-02-15 09:42:05