Javascript 元素类型的JS事件侦听器?
有没有办法为一种html元素添加某种侦听器?例如,如果我想在用户单击任何p元素时调用函数,请将事件侦听器添加到窗口/document/document.body,并检查元素的类型及其父元素的类型,因为如果在a中有一个,则单击跨度不会触发段落中的单击Javascript 元素类型的JS事件侦听器?,javascript,html,addeventlistener,Javascript,Html,Addeventlistener,有没有办法为一种html元素添加某种侦听器?例如,如果我想在用户单击任何p元素时调用函数,请将事件侦听器添加到窗口/document/document.body,并检查元素的类型及其父元素的类型,因为如果在a中有一个,则单击跨度不会触发段落中的单击 document.addEventListener("click", function (eventArgs) { var target = eventArgs.target; var elementToLookFor = "p";
document.addEventListener("click", function (eventArgs) {
var target = eventArgs.target;
var elementToLookFor = "p";
while (target !== null) {
if (target.tagName.toLowerCase() === elementToLookFor) {
// Do magic stuff with the paragraph
console.log(target);
}
target = target.parentElement;
}
});
这种技术称为事件委派
编辑:请注意,您不能从上面的循环中提前返回。如果您有嵌套的段落,即
<p>
Hey,
<p>there!</p>
</p>
提前返回只会调用内部段落的事件处理程序,而您说过希望在每个段落上调用该处理程序,这就是您需要遍历元素的所有祖先的原因。我假设您正在查找以下代码:
var paras = document.getElementsByTagName("p");
// Loop through elements.
for(var i = 0; i < paras.length; i++) {
// Add listener.
paras[i].addEventListener("click",
function() {
// Execute function.
}, false);
}
我只需选择页面上的所有元素并在其上添加EventListener,如下所示:
function addListeners(elementType, eventType, callback) {
Array.prototype.slice.call(document.querySelectorAll(elementType)).forEach(function (el, i) {
el.addEventListener(eventType, callback, false);
});
}
在上面,我们使用来选取所有想要的元素,将其转换为一个数组。如果您使用es6,您可以使用,然后我们在数组中循环,并使用想要的回调添加侦听器
这里有一个例子:最简单的答案是使用addEventListener如果你想要一个特定的html标记,就像我想要的那样,那么你会在那里找到答案,我也会在这里解释它 加上这个 document.addEventListener单击,函数E{ //你想要的节点名如:DIV、SPAN、LI等 ife.target&&e.target.nodeName=='DIV' //在下面添加一个函数来触发 {警告'宾果'} }; 看看这个,看看它是否适合你
<span>Click Yes</span><br/><br/>
<span>Click No</span><br/><br/>
<a>Clicked: <b id="result"></b></a>
<script>
$("span").click(function(){
var a = $(this).html();
$("#result").html(a);
});
</script>
您可以将事件本身附加到body元素,然后检查事件目标的类型。想要,而不是想要。特别是这些要在document上进行,或者不太常见的是document.body,而不是window。我有点惊讶它能在窗口上工作。如果您将侦听器更改为在document对象上,我会向上投票。当找到匹配的标记名时,也可以中断while循环。无需继续查找。@jfriend00提前返回将不是我在回答中提到的这个问题的正确答案,但我只是对其进行了编辑以使其更加清晰。关于您的第一个评论,事件链接到哪个对象并不重要,但我想您是对的,从风格/语义的角度来看,文档节点可能更好。请参阅编辑。使用事件委派(如中所示)比单独钩住每个p元素要好得多,尤其是因为它允许您添加和删除p元素,而无需担心钩住它们的点击。