2010-10-22 60 views
0

我以自動爲在URL中與阿賈克斯的每一個環節的Ajax調用附加了一些活的()聽衆:模具()單元素

$("document").ready(function() { 
    $('a[href^="/ajax"]').live('click', call); 
}); 

function call(e, context, link) { 
    e && e.preventDefault(); 
    link = link || this; 
    if(typeof link == "string" || !$(link).hasClass("disabled")) { 
     newObj(SPZ.AjaxCall, link, context); 
    } 
}; 

但有時我想重寫這個(所以我可以指定在其中找到回調函數)上下文,所以我寫了一個jQuery的方法來做到這一點

$.fn.customAjax = function(context) { 
    return this.die().click(function(e){ 
     call.call(this, e, context); 
    }); 
}; 

$(".save").customAjax(myObj); 

我的問題是,如果現場處理程序被添加到元素的集合,我可以」在這些元素之一上使用die(); die()只起作用,看起來,如果你將它應用到所有使用live()的元素上。

任何人都可以建議一個解決方法,將壓制live()事件?另外,人們對建議jQuery團隊改變die()的行爲有什麼意見,以便它可以用來移除單個元素上的live()處理程序;有沒有任何理由爲什麼這是一個壞主意?

+0

不需要'die()',就像'live()',需要在選擇器之後直接調用嗎?例如'$('a [href^=「/ ajax」]')。die()'是正確的,但'this.die()'不是? – 2010-10-22 16:22:33

+0

這可能是die()方面限制的一個方面,但是如果我用一個選擇器替換它,我發現它的鏈接仍然失敗。問題是,只有一部分活動處理程序被添加到 – wheresrhys 2010-10-22 16:25:44

回答

0

call從哪裏來?我沒有看到它在此代碼段中的某處定義。

除此之外,我認爲你的 this不是指一個jQuery對象,而是一個DOM節點。嘗試它包裹:

$.fn.customAjax = function(context) { 
    return $(this).die().click(function(e){ 
     call.call(this, e, context); 
    }); 
}; 

$(".save").customAjax(myObj); 

+0

纔會死亡。像在OP代碼中一樣,掛起'$ .fn'的函數會自動將this指向當前的jQuery對象實例。無需包裝。 – 2010-10-22 16:26:22

+0

oops - 將調用的定義添加到上面的代碼中。 「this」是一個jQuery對象:click處理程序確實運行在我指定的上下文中。麻煩的是,之後立即運行的處理程序也運行 – wheresrhys 2010-10-22 16:28:20

0

多一點玩耍,我發現,添加在我的jQuery方法的最後一個簡單的返回虛假的伎倆。如果我想要附加其他聽衆進行相同的點擊操作,會造成問題,但現在就可以完成。