2012-01-23 54 views
1

我已將此方法綁定到類.delete_filter的所有元素。 首先我得到'data'屬性,其中包含應該由方法調用的url。然後我調用一個沒有做任何事情的腳本,然後用一個典型的「wait ... loading data」div替換所有正在重載的div。它工作正常,但只有一次後,我可以點擊其他鏈接,因爲我想要的經常沒有任何反應,這使我瘋了,我已經非常生氣!爲什麼類相關的onclick事件只觸發一次?

$(".delete_filter").click(function() { 
    url=$(this).attr('data'); 
    $.getScript("http://blabla.com/ajax/wait/filters:info", function() { 
      $.getScript(url); 
    }); 
});  

失敗在哪裏?

+1

是'$( 'delete_filter')'被刪除或負荷後添加到頁面中的元素? – Ktash

回答

2

您更改DOM,您正在更改的Div可能包含您將它們附加到它們的單元事件。

如果是這種情況,應該使用on \ live \ delegate函數。
這些函數對於當前呈現的元素和稍後將動態添加的元素將「工作」相同。

$(selector).live(events, data, handler);    // jQuery 1.3+ 
$(document).delegate(selector, events, data, handler); // jQuery 1.4.3+ 
$(document).on(events, selector, data, handler);  // jQuery 1.7+ 

on版本:

$("body").on("click", ".delete_filter", function(){ 
     url=$(this).attr('data'); 
     $.getScript("http://blabla.com/ajax/wait/filters:info", function() { 
       $.getScript(url); 
     }); 
    }); 
+0

不要建議使用'live',否則使用'on'來從jQuery 1.7+中刪除它。 – ShankarSangoli

+0

@ShankarSangoli。我寫了一個表格,在每個版本中使用什麼。你爲什麼在抱怨? =) – gdoron

+0

這不是一個抱怨,你的答案是正確的,但總是更好地使用最新的,因爲它有大多數錯誤修復和優化代碼。 – ShankarSangoli

1

當您將單擊綁定應用於類元素時,您只將它應用於運行代碼時具有該類的元素。這意味着如果你動態地添加你的.delete-filter類,那麼你將不得不再次運行你的代碼。

+0

是的,元素在調用click元素時被重新加載。我是否應該以另一種方式解決這個問題,或者有沒有辦法在不重新加載整個頁面的情況下重新加載JavaScript? – davidb

+0

或者他可以使用'.on()':http://api.jquery.com/on/ – CAbbott

+0

@davidb,我不確定你的腳本是如何設置的,但是如果你正在加載新的元素,那麼你將需要再次執行代碼來綁定他們的點擊。 – mowwwalker

0

可能是由於jQuery緩存請求/響應。嘗試每次點擊時更改網址。嘗試這個。

$(".delete_filter").click(function() { 
    var url=$(this).attr('data'); 
    $.getScript("http://blabla.com/ajax/wait/filters:info?r=" + Math.random(), function() { 
      $.getScript(url); 
    }); 
});