2010-09-15 10 views

回答

8

您可以使用event bubbling,你的優勢在這裏,例如:

$("#test").click(function(e) { 
    e.stopPropagation(); 
}); 
$(document).click(function() { 
    $("#test").hide(); 
}); 

如果點擊來自#test來到它停止通過event.stopPropagation()冒泡,如果從其他地方的click將(通過來默認)一直膨脹到document,其中.click()處理程序隱藏#test

+0

再次感謝夥計! :) – Nike 2010-09-15 14:55:17

0

也許是這樣的:

// http://api.jquery.com/delegate/ 
// http://api.jquery.com/not-selector/ 

$("body").delegate("*:not(#test)", "click", function() { 
    $("#test").hide(); // But would be better to cache $("#test") ! 
}); 
+1

'return false'防止默認動作,它也調用'.preventDefault()',它們是*不*等價的。它也是兩個處理程序*一次*不是選擇器檢查**'每個元素的每次點擊**''文檔'中,'.stopPropagation()'*更便宜。如果你這樣做,你也不需要'*'。另外,你最後的兩個方法*瘋狂*昂貴,它們綁定事件處理程序,除了'#test'本身之外的'document'中的每個單元**,*包括'#test'中的元素,所以它們甚至不正確。 – 2010-09-15 15:56:42

+0

我沒有說「.preventDafault()」和「return false;」相當於第二個更小。我最後的兩個方法只是在這裏舉例,這就是爲什麼我說第一個是最好的(jQuery語法的觀點)。現在(性能角度),我也談到緩存,但剛纔提到,因爲這是另一回事。通用選擇器在這裏只是爲了告訴他,他可以修改它,因爲他的問題不是很清楚(點擊任何地方,但不是#test,真的嗎?)。這個最好的答案應該在我們之間,不是嗎? – 2010-09-15 16:16:25

+0

@MAXymeum - 並非真的沒有......我的版本綁定了2次事件處理程序*一次*,並且不需要額外的工作來處理其他任何點擊,您的第一個方法在每次點擊時都會做很多額外的工作,而最後兩個方法是, *方式*更貴,在任何大頁面上,他們都會鎖定它。我關於'return false;'的觀點是,它們不可互換,如果不相同,你不能只是「使用簡短版本」,它們做不同的事情,你需要知道這一點。 – 2010-09-15 16:20:49

相關問題