当前位置: 首页 > 面试题库 >

Javascript循环内的事件处理程序-是否需要闭包?

松俊美
2023-03-14
问题内容

我正在处理从别人那里接手的一些html和Javascript代码。该页面每十秒钟(通过异步请求)重新加载数据表,然后使用一些DOM代码重新构建该表。有问题的代码如下所示:

var blah = xmlres.getElementsByTagName('blah');
for(var i = 0; i < blah.length; i++) {
    var td = document.createElement('td');
    var select = document.createElement('select');
    select.setAttribute("...", "...");
    select.onchange = function() {
        onStatusChanged(select, callid, anotherid);
    };
    td.appendChild(select);
}

但是,当onchange为某个<select>元素触发事件时,似乎对表中的每个表都将相同的值传递给该onStatusChanged()方法<select>(我已经验证了该循环的每次迭代,callid并且anotherid都被赋予了新的,不同的值)。

我怀疑这种情况的发生是因为我使用select.onchange = function()语法设置事件处理程序的方式的本质。如果我了解这是如何正常工作的,则此语法将onchange事件的闭包设置为引用这两个引用的函数,这些引用最终在循环的最后一次迭代中具有最终的值。当事件触发时,通过价值参考callid,并anotherid在最后一次迭代的值而定,无法将值设置在单独的迭代。

有没有一种方法可以复制要传递给的参数的值onStatusChanged()

我更改了标题以更好地反映问题和接受的答案。


问题答案:

实际上,您确实需要在此处实现闭包。这 应该可以 工作(让我知道-我没有测试过)

var blah = xmlres.getElementsByTagName('blah');
for(var i = 0; i < blah.length; i++) {
    var td = document.createElement('td');
    var select = document.createElement('select');
    select.setAttribute("...", "...");
    select.onchange = function(s,c,a)
    {
        return function()
        {
            onStatusChanged(s,c,a);
        }
    }(select, callid, anotherid);
    td.appendChild(select);
}


 类似资料:
  • 问题内容: 例如,我有10个从AJAX响应生成的标签: 我需要通过循环将onclick事件分配给每个事件: 这是行不通的,它仅将onclick分配给最后一个标签,并警告“ 11”。我该如何工作?我宁愿不使用jQuery。 问题答案: 您所有的处理程序都共享相同的变量。 您需要将每个处理程序放入一个单独的函数作为参数,以便每个处理程序都有自己的变量:

  • 问题内容: 这个问题已经在这里有了答案 : 循环内的JavaScript封闭-简单的实际示例 (44个答案) 2年前关闭。 我正在运行以下形式的事件循环: 我正在尝试显示一系列警报,显示从0到10的数字。问题是,当触发回调函数时,循环已经经历了几次迭代,并且显示了更高的值。有关如何解决此问题的任何建议? 问题答案: 在启动所有异步操作时,循环将立即运行到完成。当他们将来完成某个时间并调用其回调时,

  • 问题内容: 如果我想执行一个函数,我更喜欢做内联js: 因为它更容易调试。 但是,我听到有人说不要使用内联js,并这样做: 为什么建议使用js事件监听器? 问题答案: 基本上,它与整体有关,我认为一切都应分开。因此,将HTML / CSS / JS都分开。它使您的HTML更加整洁,并且我认为无需它就更易于浏览。 然后,当/如果需要进行较大的更改时,您必须有足够的空间来将内联JS转移到外部文件,或者

  • 本文向大家介绍JavaScript事件处理程序详解,包括了JavaScript事件处理程序详解的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了js事件处理程序的具体代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 问题内容: 我在JavaFX中有一个舞台,可以通过多种方式关闭该舞台,方法是单击红色(X)或通过一个调用 无论舞台如何关闭,我都希望在舞台关闭之前(或之后)执行操作。 如果我使用以下代码: 然后当我单击(X)时调用处理程序,但当我调用 不同之处在于,他希望在整个应用程序关闭时调用处理程序,因此可以覆盖的方法。但是,我并没有关闭整个应用程序,只是一个阶段。并且没有重写的方法。 谢谢你的帮助。 问题答

  • 问题内容: 我使用Flask作为REST端点,该端点将应用程序请求添加到队列中。然后,该队列被第二个线程使用。 server.py client.py flask中是否有关闭事件处理程序,以便每当烧瓶应用程序关闭时(例如重新启动apache服务时),我就可以干净地关闭使用者线程? 问题答案: 如果你要查找的是没有app.stop(),但是使用模块可以执行类似的操作: https://docs.py