我想在click上获取特定元素的id,但问题是if if元素没有id,那么函数仍然在循环中,所有元素的父元素都有ID !!
这是一个例子,我怎样才能让它仅针对特定元素发出一次警报?
答案 0 :(得分:3)
问题是您已将点击处理程序附加到页面上的每个元素,然后点击事件 bubble 。也就是说,当您单击子元素时,将调用其单击处理程序,然后将调用其父级的单击处理程序,依此类推。您可以使用.stopPropagation()
method阻止事件冒泡,如下所示:
$("*").click(function(e){
e.stopPropagation();
// your other code here
});
演示:http://jsfiddle.net/RUadJ/6/
(或者只是从点击处理程序返回false
。)
或者您可以将event.target
property与this
进行比较 - 如果它们相同,您知道在处理“原始”点击事件之前它会出现泡沫。 (如果它们不同,你就知道事件已经冒泡了。)
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 ");
});
答案 1 :(得分:1)
This example仅在直接点击的元素具有ID时发出警告。
如果不了解您想要实现的目标,很难提供更好的答案。
$("*").click(function(e){
e.stopPropagation();
if($(this).attr("id") != null){
alert("have id ");
}
});
答案 2 :(得分:1)
函数“循环”的原因是因为事件正在冒泡DOM。要停止冒泡,请将此代码添加到处理程序的顶部:
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
答案 3 :(得分:0)
问题出在*符号中。尝试更具体的内容,例如img或类
$("*").click(function(e)....
答案 4 :(得分:0)
这是Javascript事件冒泡。 将弹出click事件,如果要停止它,只需添加以下代码:
e.stopPropagation();
在if-else句子之后。
答案 5 :(得分:0)
在这种情况下,您可以定位特定的类
$("div.foo").click(function(e){
if(!$(this).attr("id")==''){
alert("have id ");
}
else
{
alert("doesn't have id ");
}
});
答案 6 :(得分:0)
选择器*效率低,因为它会再次重复,它会显示2 *(元素)循环
$("*").click(function(e){
var elementCount = $("#parent").find("*").length;
$("body").prepend("<h3>" + elementCount + " elements found</h3>");
});