2016-01-04 119 views
-1

我正在動態構建表tr。每一行都有一個表格單元格td和每個單元都有一個按鈕:刪除元素及其兒童事件

var openButton = $('<button class="BtnOpenOrder">Open</button>'); 
openButton.button({ icons: { primary: "ui-icon-arrow-1-e" } }); 
openButton.attr('id', 'btnOpenSession' + i); 
openButton.attr('onclick', 'openExistingSession("' + key + '")'); 
td8.append(openButton); // append to cell 

在我的節目,我可能需要刪除所有的錶行,並創建新的。

$("#sessionMenu").find("tr:gt(0)").remove(); 

但它接縫刪除行,不會刪除事件。所以當創建新行時,會創建一個相同的事件。當事件被解僱時,會多次發射。例如,如果行被刪除並重新創建5次,當事件被觸發時,其觸發器會觸發5次。從我讀過的,我需要刪除事件。

$(".BtnEditOrder").add("*").off(); 

但是這個接縫會導致整個頁面在被調用時刷新。什麼是最好的去除表格行及其所有事件?

編輯

這裏是一個工作示例:jsfiddle

+1

刪除行應刪除附加到它的任何綁定。你如何做綁定? – Taplar

+0

openButton.attr('onclick','openExistingSession(「'+ key +'」)'); – PhillyNJ

+1

請把你的問題的邏輯。目前還不清楚你如何做你的約束力,是否在任何形式的循環中,以及你的約束力。另外,不要使用onclick綁定。使用on()附加事件處理。 off()僅影響使用on()附加的事件處理。綁定的html元素的屬性超出了jquery的範圍。 – Taplar

回答

2

就在那兒!

$(document).on('click', '#btnOpenSession' + i, function(e) { 

你在做一個委託綁定的傢伙。不要那樣做,或者只做一次。這是將事件處理程序附加到偵聽冒泡的單擊事件的文檔,並檢查它們的id是否匹配。如果確實如此,它會針對它們處理處理程序。多次這樣做會使其多次啓動。

只做一次,或者改變它以將處理程序直接附加到元素。

編輯:

而且以供將來參考,如果您打算使用委託綁定這樣的,比較好的做法是綁定儘可能低。儘管邏輯實際上只會在匹配元素上執行,但該過程仍在評估每一個冒泡的事件,看它是否應該處理。同時,比如這種情況,你真的只關心源自你桌子的事件。所以最好綁定在桌子上。