2013-07-18 63 views
1

fiddle of the issue無法理解的jQuery綁定的行爲及與點擊賽事直播

$('div').not('#logs').each(function() { 
    var id = $(this).attr('id'); 
    $("#" + id).bind('click', function() { 
     $('#logs').append('\n' + $(this).attr('id') + '\n'); 
    }); 
}); 

$(".test").live('click', function() { 
    alert('from x'); 
}); 

什麼,我會做的一樣,創建一些div和將通過所有的div使用每個功能都循環和將有綁定每個div的點擊事件。

在類名'test'的每個div內都有跨度,我將按照上面的指定綁定實時功能。當單擊跨度時,只會顯示「從x開始」的警報,但我無法理解行爲。

行爲就像,綁定功能也在工作,實時功能也在工作。

請道歉我的句子形成錯誤,我在解釋問題時有點低。 等待行爲的解釋。

謝謝

+2

事件冒泡DOM樹。所以當你點擊'div'元素內的'span'時,兩個事件處理程序都會被觸發。瞭解更多關於活動的信息:http://learn.jquery.com/events/,http://www.quirksmode.org/js/events_order.html。僅供參考,您可以簡化事件綁定到'$('div')。not('#logs')。bind('click',function(){...});',不需要'.each' 。 –

+3

旁註:'live()'已被棄用和刪除。 – adeneo

+0

你們可以請你建議如何正確地做到這一點 謝謝 – Beast

回答

0

事件冒泡DOM樹,觸發任何處理程序綁定元素。

您通常會通過調用event.stopPropagation()但是停止傳播,因爲.live()方法處理事件一旦他們傳播到文檔的頂部,你的父元素click()方法將已經被調用。

你可以讓你的代碼工作,改成如下預期:

$(".test").on('click', function (event) { 
    alert('from x'); 
    event.stopPropagation(); 
}); 

如果你真的需要使用.live()例如,如果你正在使用.bind()您的父元素動態創建這些,然後代替,還可以使用.live(),例如:

$('div').not('#logs').each(function() { 
    var id = $(this).attr('id'); 
    $("#" + id).live('click', function() { 
     $('#logs').append('\n' + $(this).attr('id') + '\n'); 
    }); 
}); 

$(".test").live('click', function (event) { 
    alert('from x'); 
    event.stopPropagation(); 
}); 

您也可以使用更受青睞的'。on()'方法而不是折舊的.live(),如下所示:

$('div').not('#logs').each(function() { 
    var id = $(this).attr('id'); 
    $(document).on('click', "#" + id, function() { 
     $('#logs').append('\n' + $(this).attr('id') + '\n'); 
    }); 
}); 

$(document).on('click', ".test", function (event) { 
    alert('from x'); 
    event.stopPropagation(); 
}); 
+0

該解決方案的工作,感謝很多兄弟,撓我的頭近2小時,我猜:) 但爲什麼Sushanth第二方法是不工作。 – Beast

+0

更新回答使用$(document).on – devrooms

+0

方法不停止事件傳播。 [小提琴](http://jsfiddle.net/9gKYC/4/) – Beast

0

事件綁定到事件附加時在頁面上存在的元素。

在你的情況下,發生這種情況時元素總是出現在頁面上。所以這兩種綁定事件的方式都會起作用。

第二種情況是事件代理,用於將事件綁定到動態創建的事件,即綁定事件後附加到DOM的元素。因此,當您使用live綁定事件時,事件將附加到始終存在的文檔。一個Ajax請求後,它使用事件冒泡插入到DOM

也許元素的概念

代碼

你不爲選擇器選擇通過它相匹配的所有元素所需要的$.each

$('div').not('#logs').click(function() { 
     $('#logs').append('\n' + this.id + '\n'); 
}); 

// live has be deprecated to delegate events as of jQuery 1.7 
// use on instead to bind the events for event delegation 
$(document).on('click', ".test", function() { 
    alert('from x'); 
}); 

Check Fiddle

+0

是的在我的情況下,元素是動態插入和刪除。 是否有任何正確的方法來實現這個 – Beast

+0

使用第二個方法簽名... –

+0

我剛剛做到了。沒有發揮出來 http://jsfiddle.net/9gKYC/1/ 這裏是更新後的小提琴 – Beast

相關問題