2010-07-21 106 views
1

我想在jQuery附加元素中檢測事件。在附加元素jQuery檢測事件

  • 你怎麼做到這一點,
  • 和/或爲什麼不是這方面的工作:

這裏是什麼,我已經嘗試了簡單的代碼片段。點擊「點擊我」後,輸入欄會觸發。點擊輸入後,警報不會觸發 - 此附加輸入上的其他事件也不會觸發。 :-(

腳本標籤下面的:

$(document).ready(function(){ 
    $(".clickme").click(function(){$(".extra").append('write: <input type="text" class="writesomething" />');}); 
    $("input").click(function(){alert("clicked")}); 
}); 

以下的體內:

<a href="#" onclick="return false" class="clickme">click me</a> 
<div class="extra"></div> 

回答

3

做這樣的:

試試看:http://jsfiddle.net/eDDeZ/1/

$(".clickme").click(function(){ 
    $('<input type="text" class="writesomething" />') 
      .click(function(){alert("clicked")}) 
      .appendTo('.extra') 
      .before('write: '); 
}); 

正在創建的新元素,直接分配單擊處理程序,它附加到.extra,然後在其之前添加write:文本。

這樣不需要.live()


編輯:

另一種選擇是使用.delegate()這將是更高效,.live()因爲它專注於一個特定的容器,而不是整個頁面。

試試看:http://jsfiddle.net/eDDeZ/2/

$(".clickme").click(function(){ 
    $('.extra').append('write: <input type="text" class="writesomething" />') 
}); 

$('.extra').delegate('input','click',function(){alert("clicked")}); 
+0

委託是非常有用的!謝謝! (和jsfiddle,太!) – ina 2010-07-22 02:14:27

+0

@ina - 不客氣。是的,'.delegate()'很好。我通常喜歡直接「綁定」事件,就像在第一個示例中一樣,但是如果容器中有許多相同類型,或者只是想要一些便利,'.delegate()'很棒。 – user113716 2010-07-22 02:36:38

1

使用方法現場的元素,而不是使用綁定動態綁定事件

例如:

$("input").live('click',function(){alert("clicked")}); 
4

第二事件處理程序的結合時,DOM被加載發生 - 而沒有匹配的元件的存在。當你點擊鏈接時,會添加一個元素,但沒有附加事件處理程序。

有三種方式來解決這個問題:

  1. 使用.live() API,而不是.click()

    $('input').live('click', function() { alert('clicked'); }); 
    
  2. 添加事件處理程序中單擊事件。

    $(document).ready(function(){ 
        $(".clickme").click(function() { 
         $(".extra").append('write: <input type="text" class="writesomething" />'); 
         $("input").click(function(){ alert("clicked") }); 
        }); 
    }); 
    
  3. 或者相似,但利用的jQuery鏈

    $(document).ready(function() { 
        $('.clickme').click(function() { 
         $('<input>') 
          .attr('type','text') 
          .addClass('writesomething') 
          .click(function() { alert('clicked!'); }) 
          .appendTo('.extra'); 
        }); 
    }); 
    
+0

每個都有性能損失/差異嗎? – ina 2010-07-22 00:52:19

+0

@說實話,我有neaver用他們兩人衡量表現。我希望'live'是最昂貴的,因爲它必須跟蹤整個DOM樹尋找新的元素,但是如果你看一下API文檔,可能有一種簡單的方法來限制你綁定的樹的哪一部分去,並避免在比你需要的地方看更多的地方。至於另外兩個,我希望他們或多或少是一樣的,至少只要你沒有這麼做十萬次。 – 2010-07-22 07:01:17