Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.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/3/html/87.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 元素类型的JS事件侦听器?_Javascript_Html_Addeventlistener - Fatal编程技术网

Javascript 元素类型的JS事件侦听器?

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";

有没有办法为一种html元素添加某种侦听器?例如,如果我想在用户单击任何p元素时调用函数,请将事件侦听器添加到窗口/document/document.body,并检查元素的类型及其父元素的类型,因为如果在a中有一个,则单击跨度不会触发段落中的单击

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元素,而无需担心钩住它们的点击。