我遇到了一個jquery live函數的問題,它不一致地爲我工作(或者我認爲的)。jquery live似乎不能在嵌套調用中工作
我有相同的html表單,用於添加新評論和編輯現有的html表單;這個表單是通過GET調用在服務器端使用php代碼傳播的。基於選項卡選項,這兩種形式顯示在兩個不同的選項卡中(選項卡1:添加評論,選項卡2:列出評論;選項卡3:編輯在選項卡2中選擇的評論)。 「添加評論」表單顯示爲tab1的主要內容;但是,「編輯」表單基於選擇需要在tab2中編輯的評論而出現,因此讓我們假設「編輯註釋」表單顯示爲tab3。當表單是該選項卡的主要內容時,以下代碼完全適用於tab1;但是當它是tab3的主要內容時它不能一致地工作,這是基於哪個註釋需要在tab2中編輯而顯示的。
$("input.sample_radio").live('change',function(){
if ($(this).val() == 'no')
$('#sample_table').hide();
else if ($(this).val() == 'yes')
$('#sample_table').show();
return false;
});
如果你能給我提供一些想法,將不勝感激。我的觀察是:
- 我用$(「輸入[名稱=‘sample_radio’]」),但這並沒有爲TAB3的形式工作,因爲它總是在TAB1的形式結束了
- 通過使用$(「input.sample_radio」)我假設所有'sample_radio'類型的類都可以工作,但它也不起作用。
- live應該將事件綁定到在jquery調用後添加到DOM樹中的新元素,但似乎並非如此。
感謝
以下標誌Schultheiss
看的建議到.delegate(),它是專門提出通過允許您指定上下文來解決這個問題。
我設法解決這個問題,將事件綁定到單選按鈕的選定父項(tab1和tab3),然後根據選擇器進行過濾,這裏是單選按鈕元素的名稱,如圖所示如下:
$('#tab1,#tab3').delegate('input[name="policy_radio"]','change',function(){
if ($(this).val() == 'no')
$('.policy_table').hide();
else if ($(this).val() == 'yes')
$('.policy_table').show();
return false;
});
感謝您指點我這一點。
你應該注意到,'.live()'不綁定處理程序的新元素。它將*一個*處理程序綁定到'document'。當一個事件從一個元素到達'document'時,jQuery將檢查接收事件的元素是否與給定的選擇器相匹配,比如'input.sample_radio'。因此,任何阻止事件冒泡的事件都會阻止'.live()'工作。這應該是你檢查的第一件事。 – user113716 2010-10-24 16:16:34
這值得多於一個+1 – jacob 2012-02-08 21:54:21