JavaScript.addEventListener

JavaScript .addEventListener

我正在将我的一些代码从 onClick 更改为 addEventListener,因为我已经阅读了各种好处,并且为了分离关注点。然而,我遇到的问题之一 运行 是,虽然使用 onClick,我能够调用一个函数并传递一个参数,但我现在发现,如果我在使用 addEventListener 时尝试传递一个参数,该函数是使用给定参数立即执行。

<!-- Choose Branch and Open Menu -->
    <script type="text/javascript">

    document.getElementById('BranchOne').addEventListener("click", setBranch("BranchOne"));
    document.getElementById('BranchOne').addEventListener("click", CategoryMenu);

    document.getElementById('BranchTwo').addEventListener("click", setBranch("BranchTwo"));
    document.getElementById('BranchTwo').addEventListener("click", CategoryMenu);

    document.getElementById('BranchThree').addEventListener("click", setBranch("BranchThree"));
    document.getElementById('BranchThree').addEventListener("click", CategoryMenu);

    document.getElementById('BranchFour').addEventListener("click", setBranch("BranchFour"));
    document.getElementById('BranchFour').addEventListener("click", CategoryMenu);

    function CategoryMenu() {
        document.getElementById('CategoryMenu').style.display = "block";
    }
    </script>

我改为通过两个单独的 addEventListeners 来设置分支,其中一个执行 CategoryMenu 功能,另一个在外部 JS 文件中设置分支,但是,我现在发现它似乎带有一个接一个地执行所有这些功能,分支总是最终成为系列中的最后一个(BranchFour)。本来Branch是作为CategoryMenu的参数,然后在外部JS文件中使用CategoryMenu方法设置的。

所以回顾一下我的主要问题:

-为什么我似乎无法在 addEventListener 内部发送参数,例如

document.getElementById('BranchFour').addEventListener("click", CategoryMenu(Branch));

        function CategoryMenu(Branch) {
            document.getElementById('CategoryMenu').style.display = "block";
        }
        </script>

和:

-为什么当我单击具有特定 ID 的 div(例如具有 ID="BranchOne" 的 div)时,它会一个接一个地执行所有不同的事件而不是只是我的 ID 所属的那个吗?

使用匿名函数包装参数化函数:

myElement.addEventListener('click', function() {
    setBranch('BranchOne');
});

您可以 bind 您想要传递给函数的参数,这样当它被调用时它已经设置了该参数。这是一个例子:

function sayHello(name, surname) {
    console.log("Hello " + name + " " + surname + "!");
}

var foo = sayHello.bind(null, "John");

foo("Doe"); // Hello John Doe!

在您的特定情况下,您可以这样做:

document.getElementById('BranchTwo').addEventListener("click", setBranch.bind(null, "BranchTwo"));

结构

 document.getElementById('BranchOne').addEventListener("click", setBranch("BranchOne"));

会将函数 setBranch 的结果作为第二个参数传递给事件侦听器(这当然会导致错误,因为它不是函数)。

与其添加只区分传递的字符串(显然是元素的 ID)的重复侦听器,不如试试这个:

document.getElementById('BranchOne').addEventListener("click", function(event) { 
  setBranch(event.target.id);
});

这只是一个粗略的建议,但至少应该可以进行一些改进,see fiddle