2

这是我的代码(简化):

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();";

哪个工作正常。我想这是一个覆盖事件的问题,但我可能错了。

任何帮助将非常感激!

4

1 回答 1

1

这是一个可以通过理解闭包来解决的问题。您的匿名函数(绑定到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该函数,从而创建一个新的闭包。

于 2013-07-27T22:59:43.647 回答