2011-06-14 75 views
3

我無法使用委託爲$ .each等效語法寫入語法。jquery委託語法.each()

我讀過的所有例子都只是顯示點擊或懸停,但是我怎麼會用代理語法寫這個呢?

$("ul li a").each(function(){ 

    $(this).addClass("foo"); 

}); 

乾杯!

編輯:在大量的評論(感謝的方式)後,我想我最好發佈一個更明確的例子。我對之前的問題缺乏細節表示歉意。

說例如我想綁定工具提示到頁面上的錨點。我將有很多我想要設置爲提示的項目,並且我想通過使用委託來減少內存開銷。

按我的理解,這是我會怎麼開始:

$(document).delegate("a.tooltip", "click", function(event){ 

// run click event 

}).delegate("a.tooltip", "hover", function(event){ 

// run mousenter, mouseleave events. 

}); 

但讓說每一個我想刪除title屬性的錨,因此它不會在瀏覽器中顯示出來,當我徘徊。我會想象(雖然我在這裏猜測)任何像這樣的本地事件都會在我的懸停事件之前運行,所以我想在我懸停之前將其刪除。

通常我會使用這樣的:

$("a.tooltip").each(function() { 
    // Store our title attribute and remove it so we don't get browser 
    //tooltips showing up. 
    $.prop(this, "data-old-title", $.attr(this, "title")); 
}).removeAttr("title"); 

可以這樣做一個更好的辦法?

根據我在評論和答案中的理解,代表僅涵蓋事件,我仍然必須將這些事情分開。

+0

你是不是想用'live'代替'addClass'?你在談論這些代表嗎?:http://api.jquery.com/delegate/ – 2011-06-14 15:54:47

+2

'each'和'delegate'是兩回事。您想做什麼? – 2011-06-14 15:55:22

+0

@Felix Kling:書寫[here](http://api.jquery.com/delegate/)'委託'是使用'.live()'方法的替代方法,允許事件委託的每個綁定到特定的DOM元素。 – diEcho 2011-06-14 15:58:02

回答

6

你可能對.delegate()是什麼或它是如何工作有誤解。它是而不是某種魔術功能攔截所有的DOM操作,它只是利用了DOM的事件冒泡功能,因此它只能用於事件。

基本上如果你有一個<div>元素,到要添加一個<button>後,您可以使用.delegate()到Click事件的<div>自己綁定。

在未來,當你添加按鈕,點擊它會觸發按鈕的點擊事件,它會繼續向上冒泡的DOM,呼籲在繼承各父元素的click事件,直到它到達文檔根或其中一個處理程序調用event.stopPropagation()。有一次,它會到達你的<div>,你綁定了你的委託事件。委託事件將檢查最初觸發事件的元素是否與最初綁定事件的原始選擇器相匹配,如果是,則會觸發附加事件處理程序在您的上下文按鈕,因此在事件處理程序中,它將看起來像是按鈕引發了該事件。如你所見,沒有什麼魔力,它跟監視DOM的變化或類似的東西沒有任何關係。如果要在向DOM中添加元素時添加特殊類,則必須確保在發生這種情況時自己調用一個函數。

0
$("ul").delegate("a", "hover", function(){ 
    $(this).addClass("hover"); 
}); 
0

沒有的jQuery的.delegate()這將是相當於.each()

委託允許事件處理程序附加到目前存在的或將來的對象。

每次允許您遍歷對象

的集合,如果你想添加foo類基於關閉一些事件的錨標記,那麼你可以這樣做:

$('ul li').delegate('a', 'click', function(){ 
    $(this).addClass("foo"); 
}); 
+0

Mutt,請閱讀代表手冊... – diEcho 2011-06-14 16:07:57

+0

@diEcho特別是哪一部分? – Mutt 2011-06-14 16:14:00