javascript - 不需要的事件覆盖

标签 javascript for-loop hyperlink event-handling dom-events

这是我的代码(简化版):

function FillTable ( oProfile_data ) {

    var oTable = document.getElementById ( "table" );

    for ( var key in oProfile_data ) {

        var oRow = oTable.insertRow ( oTable.rows.length );
        var oCell = oRow.insertCell ( 0 );

        var oLink = document.createElement ( "a" );
            oLink.href = "javascript:void(0)";
            oLink.innerHTML = "Visit Homepage";

            oLink.addEventListener ( "click",
            function () {
                var win = window.open ( oProfile_data [key]["url"], "_blank" );
                win.focus();
            }, false );

        oCell.appendChild ( oLink );
    }
}

问题是每一行都有指向同一个文档的链接,我不明白为什么!

我的临时解决方案是:

oLink.href = "javascript:void(0); var win = window.open ( \"" + oProfile_data [key]["url"] + "\", \"_blank\" ); win.focus();";

效果很好。 我想这是一个事件压倒一切的问题,但我可能错了。

非常感谢任何帮助!

最佳答案

这个问题可以通过理解闭包来解决。您的匿名函数(绑定(bind)到 click 事件)在用户单击链接之前不会被调用,并且当此行被执行时:

var win = window.open ( oProfile_data [key]["url"], "_blank" );

key 的值将包含在 FillTable 函数中。因此,它将保留函数结束时的值(即它在循环中保存的最后一个值)。

您必须为循环的每次迭代创建一个新的闭包。像这样的东西:

oLink.addEventListener ("click",
(function (k) {
    return function () {
       var win = window.open ( oProfile_data [k]["url"], "_blank" );
       win.focus();
    }
 }
)(key), false);

上面,我们创建了一个返回打开窗口的函数。然后,我们将 key 的值传递给该函数,从而创建一个新的闭包。

关于javascript - 不需要的事件覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17903171/

相关文章:

image - 带有链接的 Wordpress 图片附件

javascript - Onclick 控制台消息未触发 (javascript)

Javascript:用逗号分割字符串但忽略引号中的逗号

JavaScript:为什么这个循环的优化使它变慢了?

javascript - 循环仅在添加 span 标记时显示数组中的最后一个字符串

c# - Enumerable.Range 与 for 循环的性能

css - 如何在 HTML 中的单独 div 中设置单独的链接样式

javascript - 在 Web 应用程序中使用本地存储来保存/加载表单字段

javascript - GreaseMonkey 脚本,不解析添加到 DOM 的链接

javascript - 从 index.html 打开 quiz.html 页面时怀疑 javascript 未加载