【问题标题】:Only the last-appended onchange function for multiple select elements is called仅调用多个选择元素的最后附加 onchange 函数
【发布时间】:2017-10-27 18:25:57
【问题描述】:

我正在以编程方式创建多个选择元素,每个选择元素中有多个选项。我想以编程方式为每个选择元素分配其自己的 onchange 函数,该函数将提醒我选择元素的相应 id。

$(document).ready(function () {

    // Headers indicate how many select elements I need.
    // In this example, they are only used to initialize a unique select.id
    for (var ndx = 0; ndx < headers.length; ndx++) {
        var header = headers[ndx];
        const rowName = header.innerHTML;
        var select = document.createElement("select");
        var options = ["Contains", "Equals", "Starts with", "More than", "Less than", "Between", "Empty",
            "Doesn't contain", "Doesn't equal", "Doesn't start with", "Is not more than", "Is not between", "Is not empty"];

        select.id = rowName + "-select";
        options.forEach(function(option) {
            var element = document.createElement("option");
            element.value = option;
            element.innerHTML = option;
            select.appendChild(element);
        });
        select.onchange = function () {
            alert("select.id: " + select.id);
        }
    }
}

但是,在更改任何选择元素的选项时,只有最后一个选择元素的 id 会显示在警报中。这可能是我不熟悉的 javascript 引用问题吗?感谢您的帮助。

【问题讨论】:

  • 你不能用this代替select吗?
  • 发生这种情况的原因是因为您每次迭代都更改了 select.id。 select.id = rowName + "-select";,所以它只输出最后一个。 JS 闭包确实存储对范围外变量的引用,但它们不会像您现在希望的那样存储旧值。
  • @AP。哇,你是对的!这对于为什么只显示最后一个元素的 id 也是有意义的。谢谢!

标签: javascript html node.js web onchange


【解决方案1】:

javascript 中的变量被提升到声明它们的函数范围的开头。实际上,这意味着在每次迭代中,您都将变量 select 替换为新的选择框。这意味着所有侦听器都将引用同一个 select 变量,在循环结束时,该变量将包含对最后创建的选择的引用。

解决方案

将侦听器注册包装在 IIFE(立即调用的函数表达式)中,并将其作为参数传递 select。这样 select 的值将只绑定到当前迭代。

(function(select) {
    select.onchange = function() {
        alert(select.id);
    }
})(select);

编辑:

实现监听器的更正确的方法是使用传递给它的事件对象:

select.onchange = function(e) {
    alert(e.target.id); //e.target refers to the element that originated the event
}

但我也留下了上面的答案,因为在您的代码中还有一个与提升/作用域相关的问题,这是一个非常常见的错误。

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 2017-10-18
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 2021-05-16
    相关资源
    最近更新 更多