2012-02-14 86 views
2

我有一些動態創建的HTML代碼,並且可能包含數十個錨點。我想爲每個錨點添加一個點擊處理程序,我可以想到許多不同的方法,但不知道選擇哪一個。假設錨點有一個「myclass」類,點擊時執行的代碼每個都是相同的。實現jQuery點擊功能的最佳方式

方法1

$(document).delegate(".myclass", "click", function() { 
    // Do some work 
}); 

方法2:

var $a = $("<a href='#' class='myclass'>Text</a>"); 
$a.bind("click", function() { 
    // Do some work 
}); 

方法3:

function clickHandler() { 
    // Do some work 
} 

var $a = $("<a href='#' class='myclass'>Text</a>"); 
$a.bind("click", function() { 
    clickHandler(); 
}); 

我喜歡方法2作爲處理函數代碼就是在創建錨點並將其添加到DOM的地方,但是如果我有很多這樣的錨點,那麼JavaScript會有效地創建數十個單獨的函數,還是足夠聰明,只需使用一個?

+0

實際上,我認爲'委託'已被棄用無論如何。我認爲它現在已經開始。 – James 2012-02-14 15:44:27

+0

我很確定'delegate'代替'live'作爲jQuery 1.7,而'on'代替'bind'。來自api.jQuery.com的 – Rob 2012-02-14 15:49:41

+0

:「從jQuery 1.7開始,.delegate()已被.on()方法取代。」 – CompanyDroneFromSector7G 2012-02-14 15:56:26

回答

6

如果有一些容器,它包含了所有這些錨和你使用jQuery 1.7或以上,然後最好的解決辦法是on API

$('#theContainer').on('click', 'a.myclass', function() { 
    // Click Handler 
}); 

注:請務必選擇最接近的位置的容器,其中錨住。這提高了搜索在事件火災中找到它們的效率。

+4

我認爲同樣重要的是要注意,將DOM綁定到元素所在的位置,因爲每當事件觸發時,jQuery將需要搜索與其匹配的所有節點。 – Andrew 2012-02-14 15:48:29

0
$('.myclass').click(function() { 
    // do something 
}); 

這應該涵蓋所有基地。

據我所知,它應該爲每個控件創建一個單獨的實例,但它完全是OO,因此應該非常高效。

爲了解決「不,如果鏈接動態添加」點:

$('.myclass').unbind('click').click(function() { 
    clickHandler(); 
}); 

當然,這需要在每臺更多的HTML動態添加時間重新運行,但這是每一個解決方案相同在此列出。

+0

如果元素是動態添加的,則不適用。 – 2012-02-14 15:46:11

+0

這沒有用,因爲當動態添加元素時,事件不會被觸發! – 2012-02-14 15:50:05

+0

錯了EvilP - 見第二部分 – CompanyDroneFromSector7G 2012-02-14 15:50:32

1

使用live

$(".myClass").live("click", clickHandler); 

現場還增加了事件處理程序以新創建的元素。

編輯:
使用on相反,如果你使用jQuery 1.7:

$(".myClass").on("click", clickHandler); 
+0

.live()不推薦使用,可以在將來的任何版本的jquery中刪除... – 2012-02-14 15:46:28

2

方法2更好的是你不需要有'活'事件(即在綁定事件後在DOM中添加元素)。

但是對於jQuery 1.7,你有'on'來綁定事件。

+1

我相信你的意思是jQuery 1.7不是1.9 – JaredPar 2012-02-14 15:50:41

+0

是的!當然... – 2012-02-15 08:33:49

2

使用.on()有一種方法,您可以將一個事件偵聽器添加到div。所以,你會對DIV一個事件偵聽器,所有的錨放置:

$('#navigation').on('click', 'a.myclass', function() { 
    //Handler 
}); 
+0

我喜歡「關於」關鍵字(新對我來說!)。只要父母爲所有元素工作。 – CompanyDroneFromSector7G 2012-02-14 16:18:48