这是我的代码(简化):
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();";
哪个工作正常。 我想这是一个覆盖问题的事件,但我可能错了。
任何帮助都会非常感激!
答案 0 :(得分:1)
这是一个可以通过理解闭包来解决的问题。您的匿名函数(绑定到单击事件)在用户单击链接之前不会被调用,并且此行被执行:
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
的值传递给该函数,从而创建一个新的闭包。