【问题标题】:JavaScript get element from event triggerJavaScript 从事件触发器中获取元素
【发布时间】:2023-01-05 23:35:11
【问题描述】:

我目前正在尝试编写我的第一个网站。 因此,我想获得具有特定类的所有元素,并为它们提供所有相同的事件监听器。 我这样做是这样的:

const certs = document.getElementsByClassName("certificate");

for (var i = 0; i < certs.length; i++) {
    certs[i].addEventListener("mouseover", mouseOver());
    certs[i].addEventListener("mouseout", mouseOut());
}

function mouseOver() {
    this.querySelector(".overlay").classList.add("active");
}

function mouseOut() {
    this.querySelector(".overlay").classList.remove("active");
}

我的问题是,“this”似乎不是触发 mouseOver 事件的元素。 我还尝试将“this”作为参数,如下所示:

const certs = document.getElementsByClassName("certificate");

for (var i = 0; i < certs.length; i++) {
    certs[i].addEventListener("mouseover", mouseOver(this));
    certs[i].addEventListener("mouseout", mouseOut(this));
}

function mouseOver(elem) {
    elem.querySelector(".overlay").classList.add("active");
}

function mouseOut(elem) {
    elem.querySelector(".overlay").classList.remove("active");
}

两种方式都不起作用,并且知道我被困在某种程度上...... 有没有办法做到这一点? 如何使用触发事件的确切元素?

(我不想给每个元素一个唯一的 ID 以使其可重用)

【问题讨论】:

    标签: javascript html web


    【解决方案1】:

    addEventListener 的第二个参数是一个函数。现在,您正在立即调用该函数,它返回undefined,因此无论何时将鼠标移到或移出,它都会尝试运行undefined。只传递函数变量本身。

    const certs = document.getElementsByClassName("certificate");
    
    for (var i = 0; i < certs.length; i++) {
        certs[i].addEventListener("mouseover", mouseOver);
        certs[i].addEventListener("mouseout", mouseOut);
    }
    
    function mouseOver(elem) {
        elem.querySelector(".overlay").classList.add("active");
    }
    
    function mouseOut(elem) {
        elem.querySelector(".overlay").classList.remove("active");
    }
    

    【讨论】:

    • 请注意,elem 实际上不是一个元素,而是一个事件。您可能想要的是将 elem 更改为“e”或“event”,然后调用event.target
    猜你喜欢
    • 1970-01-01
    • 2014-01-19
    • 2010-09-08
    • 1970-01-01
    • 2011-08-29
    • 2012-08-16
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    相关资源
    最近更新 更多