2012-03-04 21 views
0

所以我們都知道在一個ajax更新事件中必須反彈到新的dom元素。是委託是一種選擇,但委託不適用於所有情況。例如,委託對於需要在加載而不是點擊事件時需要完成的事情沒有幫助。JQuery Ajax - 使用上下文參數而不是委託重新綁定元素?

不是我的代碼分成委託處理程序和需要是反彈的更新處理程序,我寧可定義與上下文參數一個方法被調用喜歡網頁的變化,使每次:

function onPageUpdate(context) { 
    $('a', context).click(...); // event handlers 
    $('.chart', context).addClass(...); // load handlers 

} 

在dom就緒之後,將使用上下文參數null調用它。在ajax更新上,上下文將容納新的dom元素。這樣我就再也不用擔心委派或ajax更新了。

但是,我很難解決這個問題。由於Ajax回調:

function onSuccess(data) { 
    // data contains new dom elements like: <div><a>Click</a><span>chart<span></div> 
    // replace old elements with new ones 
    $('a').replaceWith('a', data); 
    $('span').replaceWith('span', data); 

    // call pageUpdate with the new context 
    onPageUpdate(data); 
} 

是否有可能使像我這樣工作的期待?替換工作正常,但onPageUpdate沒有綁定任何這些新的元素,我不知道是否因爲上下文只是一個字符串對象或什麼。任何人都可以想出一種方法來完成這項工作?

在我看來,這是比委託更好的解決方案,因爲只有一個方法適用於所有處理程序,只有需要綁定的元素才擁有它。

回答

0

jQuery() - jQuery API

jQuery的(選擇器[,上下文])

選擇器A含有一個選擇表達式字符串

上下文DOM元素,文檔,或jQuery來作爲上下文

使用

如果上下文不是正確的類型 - 比如傳遞一個字符串 - 它只是要我gnored。嘗試在一個jQuery對象包裝一下你的HTML字符串,然後用其作爲背景爲您的選擇,像這樣:

var $context = $(data); 
$('a').replaceWith('a', $context); 
$('span').replaceWith('span', $context); 

// call pageUpdate with the new context 
onPageUpdate($context); 
+0

嗯,我試過這個,但綁定似乎並不堅持。這可能適用於幕後的一些對象引用問題。我發現它的工作方式之一是單獨調用每個替換後的頁面方法,像onPageUpdate($('a')),雖然這感覺更慢 – user842800 2012-03-04 14:33:44

0

我不會回答你的問題,安東尼·格里斯特的答案是完全正確的,但也有一些你說我不明白的事情。你能向我解釋一下嗎?

例如代表不會爲一些需要簡單的負載,而不是點擊事件

很抱歉,但我不明白這一點做幫助,你有一個例子嗎?

在我看來,這是不是代表一個更好的解決辦法,因爲那裏有 於需要 結合將自己所有的處理程序,只有元素只有一個方法。

我不明白這一點太:

  • only one method:哪種方法你在說什麼?
  • only the elements ... will own it:這也與委託的情況下,更多的,如果你讓我們說10錨元素中,只有一個處理程序將被綁定,而不是10在您的解決方案

在你的方法onPageUpdate你混合兩件事:事件處理($("a").click(...))和DOM修改($(".char").addClass(...))。也許這就是爲什麼你對委託解決你的問題的能力感到困惑。

+0

在我的例子是我混合事件處理和dom修改。這兩個我想用單一方法來處理,而不是一個事件方法和另一個加載方法(這也需要在Ajax更新上調用)。我試圖用一個上下文參數調用一個方法來處理它。雖然我看到你的觀點,即委託人的處理程序數量比單個處理程序少。 – user842800 2012-03-04 14:11:41

+0

而且,dom修改是我的代理不能處理的例子,因爲你不能委託一個加載事件。該代碼需要在新的dom元素上再次調用。 – user842800 2012-03-04 14:12:23

+0

好吧,我明白你的觀點,我不知道加載/委託問題。爲什麼不把代碼分爲兩部分,第一部分與事件委託一起工作(僅被調用一次),第二部分不能與事件委託協同工作,並使用當前系統(在頁面加載時和每次請求後調用)。事件委託是非常強大的,所以使用這個解決方案,你的應用程序會更快(更少的代碼執行最初和請求後,更少的處理器綁定)。確定這是2個函數調用,但收益大:)你怎麼看? – pomeh 2012-03-04 14:28:35

相關問題