Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery按类和选择时单击事件问题_Javascript_Jquery - Fatal编程技术网

Javascript jQuery按类和选择时单击事件问题

Javascript jQuery按类和选择时单击事件问题,javascript,jquery,Javascript,Jquery,当我使用jQuery通过类访问click函数的元素时,它会根据数组或堆栈中的元素数量重复事件。因此,如果我有3个元素在彼此的顶部或相邻,那么底部或右侧的元素将通过事件一次,顶部或左侧的元素将通过事件三次 我做错什么了吗?或者这不是要用jQuery完成的 [修订] 对不起,我用了一种让人困惑的方式。这里有一个链接。。。你会更好地理解我的问题。只需通过表单添加几个新元素,然后单击它们 尝试: 这将防止click事件冒泡通过子对象,当您单击div中包含的子对象时会发生这种情况 您收到的是一个空白ID,

当我使用jQuery通过类访问click函数的元素时,它会根据数组或堆栈中的元素数量重复事件。因此,如果我有3个元素在彼此的顶部或相邻,那么底部或右侧的元素将通过事件一次,顶部或左侧的元素将通过事件三次

我做错什么了吗?或者这不是要用jQuery完成的

[修订] 对不起,我用了一种让人困惑的方式。这里有一个链接。。。你会更好地理解我的问题。只需通过表单添加几个新元素,然后单击它们

尝试:

这将防止click事件冒泡通过子对象,当您单击div中包含的子对象时会发生这种情况

您收到的是一个空白ID,因为您单击的目标很可能是您单击的孩子,而您没有为其提供ID

要证明这一点,请尝试

$(".some_class").click(function(event){
    alert(event.target.nodeName);
});
它会提醒您节点名称您刚才单击的html标记的名称。

将其更改为:

$(".some_class").each( function () { 

jQuery(this).click(function(event){
    alert(event.target.id);
});

});

既然你已经贴了一把小提琴来显示这个问题,我实际上可以回答了。问题在于,您将单击事件处理程序绑定到要添加的单击事件处理程序中的.dp。那么发生的情况是:

填写表单并单击add,这将创建一个类为dp的新元素并将其追加 然后,它将一个click事件处理程序绑定到具有dp类的每个元素。只有1个元素,即我们刚才添加的1个元素 再次填写表单,单击add,它重复步骤1和2,因此它将另一个click事件侦听器绑定到第一个.dp元素,并将一个绑定到新元素。 根据需要重复,每次单击“添加”时,将越来越多的事件处理程序绑定到现有元素! 要解决此问题,需要将事件处理程序绑定到add事件处理程序外部的.dp。问题是您正在动态创建新的.dp元素,因此仅使用.click不会绑定到DOM中还没有的元素。为了解决这个问题,您可以使用,它将事件处理程序绑定到现在和将来与选择器匹配的元素:


在访问诸如event.target.id之类的元素时,这里还有一个。

返回一个空白字符串,因此我一直在使用this.id。这是什么原因?我不明白你的问题是什么。我以为你的意思是,事件是通过祖先元素冒泡出来的,但是你发布的HTML没有表明这一点。示例:我认为发生这种情况的原因是因为jquery创建了一个由指定类元素组成的数组,这就是为什么我用这样的措辞。我的错误。您使用的是什么浏览器?在FF中尝试过,但在所有浏览器中jquery应该几乎相同。你试过詹姆斯贴的小提琴吗?我以前做过很多次类似的事情,即使有数百个元素都使用同一个类,而且总是很好。@DavidDan-jQuery创建了一个类似数组的对象,其中包含对所选元素的引用。调用click时,它将提供的函数作为click事件处理程序绑定到匹配集中的所有元素。请参阅我在上一篇评论中链接到的小提琴。@DavidDan重新阅读后,我对您的问题感到困惑,您的代码在每个div中显示一个孩子,测试很好,您可以发布实际有问题的html吗?这是指向我的问题的链接我也尝试过这个。。。这对我不起作用。。。一定是我内心深处的东西code@John-这没什么区别。大多数jQuery方法都应用于匹配集中的所有元素,因此您不需要使用每个元素。@jamesalardice true,但有时可能需要它。这件事在我身上发生过一两次。单击“无结果”,将其更改为后。每一个废话废话,都会突然变得完美。。。谢谢你,伙计。。。很抱歉搞混了。现在我将使用fiddle作为示例代码,没问题,很高兴我能提供帮助:是的,jsfiddle是一个很棒的工具!
$(".some_class").each( function () { 

jQuery(this).click(function(event){
    alert(event.target.id);
});

});
$("#preview").delegate(".dp", "click", function(event){
    alert(this.id);
});