2010-10-24 36 views
1

我遇到了一個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; 
          }); 

如果你能給我提供一些想法,將不勝感激。我的觀察是:

  1. 我用$(「輸入[名稱=‘sample_radio’]」),但這並沒有爲TAB3的形式工作,因爲它總是在TAB1的形式結束了
  2. 通過使用$(「input.sample_radio」)我假設所有'sample_radio'類型的類都可以工作,但它也不起作用。
  3. 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; 
          }); 

感謝您指點我這一點。

+1

你應該注意到,'.live()'不綁定處理程序的新元素。它將*一個*處理程序綁定到'document'。當一個事件從一個元素到達'document'時,jQuery將檢查接收事件的元素是否與給定的選擇器相匹配,比如'input.sample_radio'。因此,任何阻止事件冒泡的事件都會阻止'.live()'工作。這應該是你檢查的第一件事。 – user113716 2010-10-24 16:16:34

+0

這值得多於一個+1 – jacob 2012-02-08 21:54:21

回答

2

通過使用.live,您遇到了挑戰之一。當您更改選擇上下文時,會阻止其正常工作。

查看.delegate(),它是專門爲解決此問題而提出的,它允許您指定上下文。

看到這個職位上代表的一些注意事項,從布蘭登·艾倫:http://brandonaaron.net/blog/2010/03/4/event-delegation-with-jquery

,看到背景下,這個漂亮的一個:http://brandonaaron.net/blog/2009/06/24/understanding-the-context-in-jquery

+1

馬克 - 你能解釋一下你說的意思嗎?*「當你改變選擇環境......」*?我不理解你的意思。 – user113716 2010-10-24 17:00:20

+1

他所做的(基於描述)是在另一個選項卡中添加新項目時更改.live的上下文。原始文件綁定到一個選項卡,但添加的元素位於另一個選項卡下,因此綁定的上下文沒有選取新元素。因此,這一改變使他不同地重視,因爲他的網頁的動態性不再是相關的。 – 2010-10-25 14:53:36

+1

XSLT中期流程中的動態dom變更非常類似,當前的「上下文」非常重要,但對於許多開發人員來說,這是一個難以理解的概念,因爲他們不習慣於「我現在與哪裏關係密切」,這就是XSLT恕我直言,強大但尚未充分利用的技術。 – 2010-10-25 14:58:06