2013-03-29 60 views
0

我有,比如這個:有沒有辦法在jQuery中將一個元素的回調附加到另一個元素上?

$first = $('#firstElement').click(function() { }); 

但在頁面的執行的某一點上,我將取代另一種元素:

$newElement = jQuery('<div />'); 
$first.replaceWith($newElement); 

但我想保持回調在第二個第一個元素...

這可能嗎?

編輯1

我已經知道如何用.on().delegate()做到這一點。這是我的場景:

我需要加載一些選擇器更改,但是,該選擇器的內容將根據登錄的用戶的角色而有所不同。我已經將信息存儲在localstorage中。該選擇器的內容通過以下方式加載:

window.Core.setBranchesSelector($('#theElementInWhichTheSelectorWillBe')); 

該函數創建一個<select>元素。我可以讓js內該頁面:

$('#parent').on('click', '#theElementInWhichTheSelectorWillBe', function() {}); 

但我想使該功能儘可能的靈活,因此,如果我做somethink這樣的:

$elementToBeReplaced = $('<coolElement />').click(function() {}); 
/* Something really cool with that element */ 
Core.setBranchesSelector($elementToBeReplaced); 

的選擇繼承回調click事件...

+3

我建議你使用事件委託並避免這種情況。 – Nelson

+0

我已經知道如何使用.on()或.delegate()來做到這一點,但我想這樣做......謝謝你的建議:) – Cito

回答

2

明確回答你的問題:不,你不能這樣做。至少不是在jQuery的新版本中(使用1.7,你可以這樣做,因爲@undefined已經在回覆#15708467的註釋中說明了)。

然而,這裏是一個使用委託一個簡單的例子與.on()

http://jsfiddle.net/8dCQT/

$(function() { 
    $("#parent").on("click", ".child", function() { 
     alert($(this).text()); 
    }); 
    $("input").click(function() { 
     $(".child").remove(); 
     $("#parent").append("<div class='child'>I'm a replacement</div>"); 
    }); 
}); 

點擊該按鈕後,您會發現,點擊更換DIV調用相同的點擊功能和警報與文本新的div。

注:這裏最重要的部分是替換可選擇與相同的選擇(在這種情況下.child)作爲原始。我在這裏使用了一堂課,但我可以使用父母的第一個孩子,或者其他任何工作。

另請注意:您不必綁定到直接父級,您可以使用document一路綁定到頂部,但不建議這樣做,因爲這會降低您的代碼速度。您應儘可能接近要附加事件的元素,以便代碼無需在DOM樹上走得太遠。

+0

我選擇這個作爲答案,因爲它解釋瞭如何工作。另外,我爲我的問題添加了真正的答案:不,你不能這樣做。謝謝大家 :) – Cito

1

jQuery沒有提供API來直接訪問已經綁定的事件。

將事件放置在父元素上,替換子元素,並依靠事件冒泡來捕捉它。

+0

+1這就是我的意思是事件代表團。 – Nelson

+0

這不是事實,'data('events')'。 – undefined

+0

@undefined所以,我可以得到回調,並分配給另一個? – Cito

1

您將需要在每個元素中包含相同的ID或給每個div一個公共類。一旦你這樣做,它就像:

$(document).on('click','.some-common-class',function(){ 
}); 
+1

你不應該像這樣綁定到文檔。它使代碼管理變得非常困難並最終降低了性能。 –

+0

@JosephLennox - 我同意,但不知道文檔的結構......這是最好的選擇(直接翻譯過去是'$('。some-common-class')。live()' )。 –

相關問題