2013-12-19 40 views
2

我有行數百表和每一行都有自己的點擊事件:如何通過JQuery減少點擊事件的數量?

$('#scorecard-table tbody > tr.accordion').on('click', function (event) {} 

我想這歸因於點擊事件,我想這會做到這一點?

$('#scorecard-table').on('click', 'tbody > tr.accordion', function (event) {} 

我認爲這會在表本身上分配一個單擊事件而不是每行事件?

第二個版本似乎只有第一個版本的事件數量一樣多。我究竟做錯了什麼?

+0

你想點擊做什麼...打開/關閉手風琴? – Dwza

+0

在點擊處理程序中,你需要知道點擊的行/單元格嗎? –

+0

你如何或在哪裏計數事件監聽器? –

回答

1

我發現jQuery的

http://api.jquery.com/on/

下面的解釋除了其處理能力關於尚未創建的後代元素的事件,委派事件的另一個優點是當必須監視許多元素時,它們的潛在開銷要低得多。在具有在其TBODY 1000行的數據表,該實施例中附加的處理程序的1,000個元素:

$("#dataTable tbody tr").on("click", function() { 
    alert($(this).text()); 
}); 

委派的事件的方法附着的事件處理程序僅一個元件,所述TBODY,和事件只需要氣泡上升一級(從點擊tr到tbody):

$("#dataTable tbody").on("click", "tr", function() { 
    alert($(this).text()); 
}); 

這應該回答你的問題嗎?

+0

這就是我的想法,但在我的場景中,我仍然得到了100多次點擊事件,也許這只是我使用的FireFox插件,當它們不是時,將它們顯示爲單獨的點擊事件。 – KevinUK

0

不是100%肯定你想在這裏做的......如果你想要做的整個表(只是一個事件)是什麼,爲什麼不只是做:

$('#scorecard-table').on('click', function (event) {} 

做這本儘管如此,除非你用鼠標X /鼠標Y弄亂了你,否則你將無法檢測到哪一行被點擊。您現在擁有像現在這樣的單一點擊事件的最佳狀態。

+0

你可以使用事件Object來知道用戶點擊的地方,看看我的答案。 –

+0

好東西,想到了:) –

0

second一個是fast作爲測試jsperf

$('#scorecard-table').on('click', 'tbody > tr.accordion', function(event) { 
    // your code 
}); 

如上將選擇$('#scorecard-table')第一然後綁定click eventtbody > tr.accordion

而在第一酮

$("#scorecard-table tbody > tr.accordion")從評估從右到左 - 即它最先找到的所有頁面的tr.accordion rows,然後範圍縮小到那些在#scorecard-table tbody

在這裏,您可以test the performance

閱讀Efficient-jquery-selector,看看performance of child selectors

0

只能添加一個事件監聽器到表格中,並檢查用戶是否點擊了一行。 (它會工作,即使你dinamically增加行數)

$('#myTable').on("click", function (e) { 

    if(e.target.tagName == "TD"){ 
     alert(e.target.parentNode.id); 

     // if you want the jQuery row object 
     // var rowClicked = $(e.target.parentNode) 
    } 
}); 

的jsfiddle例如:http://jsfiddle.net/utVzx/2/