2011-09-07 58 views
0

我正在爲自己構建一個調試工具。我希望它做的是在任何元素點擊時放置一個類。jQuery,選擇(任何所有*)元素點擊

事情是這樣的:

$('*').click(function(){$(this).toggleClass('debug')}); 

也就是說實際工作,除了它切換「調試」的所有元素。

例如:

<body> 
<div id='3'> 
    <div id='2'> 
     <div id='1'></div> 
    </div> 
</div> 
</body> 

如果我點擊<div id="1">,它將一個名爲 「調試」 類添加到<div id="2"><div id="3">

發生了什麼事情是當你點擊<div id="1>時,它被視爲對所有3的點擊,因爲從技術上講,所有的div都被點擊。所以我想過要有一個擁有所有HTML元素的數組。

到目前爲止,我有:

window.v = []; 
$('*').click(function(){window.v.push(this)}); 

在此之後,它是:

$(window.v[0]).toggleClass('debug'); 

不幸的是,當這樣的:

$(window.v[window.v.length]).toggleClass('debug'); 

...或以上執行時,它沒有做任何事情。有時,它將「調試」類放在body標籤上。

所以,我不完全確定如果使用陣列是最好的路線。有沒有人有任何想法如何普遍點擊任何元素並將調試類放在它上面?

在此先感謝。

回答

8

這樣做:

$(window).click(function (e) { 
    $(e.target).toggleClass('debug'); 
}); 

綁定點擊處理程序所有 DOM元素是一個壞主意。相反,將一個單擊處理程序綁定到window對象。你可以這樣做,因爲點擊事件冒泡(DOM樹)。爲了確定哪個元素被點擊,使用e.target

這麼簡單:)

現場演示:http://jsfiddle.net/Ucpzq/1/

+0

對不起,忽略了 - 我錯過了什麼。 – Ryan

+0

@minitech沒問題':)' –

+0

我一般都喜歡這個想法,但是如果點擊是在對象本身(像一個按鈕)處理並且冒泡可能被阻止的話,它會起作用。 – jfriend00

1

取消泡:

$('*').click(function(evt) { 
    $(this).toggleClass('debug'); 
    evt.stopPropagation(); 
});