事件侦听器在没有事件的情况下执行并循环遍历 HTML 集合

Not*_*ner 3 html javascript for-loop addeventlistener

我正在尝试编写一个循环来初始化 JavaScript 中的事件处理程序。

我想我做错了什么,因为我的调试功能在没有事件(点击)发生的情况下被激活。

我想做的是这样的:

var JS_elements = document.getElementsByClassName("JS")

for (y = 0; y < JS_elements.length; y++){
    document.write(JS_elements.item(y).innerHTML);
    JS_elements.item(y).addEventListener("click",testfunc());
}

function testfunc() {
    alert("TestFunc");
}
Run Code Online (Sandbox Code Playgroud)

当我点击一个 class="JS" 的元素时,让 testfunc() 运行。

线document.write(JS_elements.item(y).innerHTML);线正确地执行,所以我知道我得到正确的对象。可悲的是,注释行导致此中断: testfunc() 在页面加载时自动运行 3 次。

谁能解释为什么会这样?我唯一能想到的是“点击”由于true某种原因被评估。

HTML:

<header>
    <hr>
        <p>- Header Background Color Controller -</p>
        <table>
            <tr>
                <td>Javascript Controller:</td>
                <td class="JS">Red
                    <input type="hidden" value='false'>
                </td>
                <td class="JS">Green
                    <input type="hidden" value='false'>
                </td>
                <td class="JS">Blue
                    <input type="hidden" value='false'>
                </td>
            </tr>
            <tr>
                <td>jQuery Controller:</td>
                <td class="jQ" value=false>Red</td>
                <td class="jQ" value=false>Green</td>
                <td class="jQ" value=false>Blue</td>
            <tr>
        </table>
    <hr>
</header>
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 7

改变这个:

JS_elements.item(y).addEventListener("click",testfunc());
Run Code Online (Sandbox Code Playgroud)

对此:

JS_elements.item(y).addEventListener("click",testfunc);
Run Code Online (Sandbox Code Playgroud)

()导致要立即执行的功能和返回结果传递给addEventListener()。那不是你想要的。相反,您希望传递一个函数引用,该引用应该只是函数的名称,而testfunc不要在()其后。


如果您想将参数传递testfunc给所有事件处理程序并且它们是相同的参数,那么您可以创建一个中间匿名函数:

JS_elements.item(y).addEventListener("click",function() {
    testfunc("whatever");
});
Run Code Online (Sandbox Code Playgroud)