2012-02-16 145 views
0

我想要獲取點擊時特定元素的id,但問題是如果元素沒有id,那麼函數仍然在所有元素的循環中有身份證的父母!獲取特定元素的id而不是父元素

這裏有一個例子,我怎樣才能讓它只針對特定元素一次提醒?

http://jsfiddle.net/RUadJ/1/

+0

哪個元素的id你要嗎?你想要點擊元素的ID嗎? – 2012-02-16 04:51:10

回答

1

This example如果將其直接點擊的元素具有ID唯一警報。

不知道更多關於你想要達到的目標,很難提供更好的答案。

$("*").click(function(e){ 
    e.stopPropagation(); 
    if($(this).attr("id") != null){ 
     alert("have id "); 
    } 
}); 
+0

如果你調用'.stopPropagation()'(順便說一句,你拼錯了),那麼你不需要測試'e.target',因爲這個事件不會冒泡過目標 - 所以你可以按照代碼的原始版本使用'this'。 – nnnnnn 2012-02-16 05:25:00

+0

@nnnnnn:謝謝,我更新了你的更正答案。 – 2012-02-16 06:01:47

0

問題出在*符號上。嘗試一些更具體的例如img或一類

$("*").click(function(e).... 
1

函數「循環」的原因是因爲事件冒泡DOM。要停止冒泡,將此代碼添加到您的處理程序的頂部:

e.cancelBubble = true; 
if (e.stopPropagation) e.stopPropagation(); 
3

問題是你已經把它貼的點擊處理程序元素在頁面上,然後單擊事件泡沫。也就是說,當你點擊一個子元素時,它的點擊處理程序將被調用,然後它的父級的點擊處理程序將被調用,等等。您可以使用.stopPropagation() method如下冒泡停止事件:

$("*").click(function(e){ 
    e.stopPropagation(); 

    // your other code here 
}); 

演示:http://jsfiddle.net/RUadJ/6/

(或者只是從你的點擊處理程序返回false。)

或者你可以比較event.target propertythis - 如果它們相同,則知道在泡泡之前正在處理「原始」單擊事件。 (如果他們不同,你知道事件已經冒泡了。)

P.S.將你的點擊處理程序附加到每個元素上是非常低效的。您可以只附加一個處理程序到document,然後event.target(上面提到的)將是最初點擊的元素,因此您仍然可以測試其ID。然後,你不必擔心,因爲冒泡的點擊已經儘可能它可以冒泡:

$(document).click(function(e){ 
    if($(e.target).attr("id")!= null) 
     alert("have id "); 
    else 
     alert("doesn't have id "); 
}); 

演示:http://jsfiddle.net/RUadJ/26/

+0

它的工作原理,謝謝:) – palAlaa 2012-02-16 04:57:09

0

這是JavaScript的事件冒泡。 單擊事件會彈出,如果你想停止它,只需添加以下代碼:

e.stopPropagation(); 

後的if-else句。

0

那麼在這種情況下,您可以針對特定的類

$("div.foo").click(function(e){ 

if(!$(this).attr("id")==''){ 
    alert("have id "); 
} 
    else 
    { 
      alert("doesn't have id "); 
    } 
}); 
+1

如果你的目標是一個特定的ID來附加處理程序,那麼當處理程序運行時,你已經知道該元素有一個ID不是嗎? (除非在分配處理程序之後id被動態刪除。) – nnnnnn 2012-02-16 04:59:13

0

該選擇*是低效的,因爲這一切再次重述,它會告訴你2 *(元素)循環

$("*").click(function(e){ 
    var elementCount = $("#parent").find("*").length; 
    $("body").prepend("<h3>" + elementCount + " elements found</h3>"); 
});