设定:
我正在通过js打开一个新窗口,这是一个带有一个表单的经典asp页面(是的,经典的asp,我知道)。该表单发布到一个处理页面,其中我Response.Write()一些内联js来操纵父页面上的表单元素,如此。
.Write ("<script language=""javascript"">" & vbcrlf)
.Write ("var stopButton = opener.document.getElementById(""timerStop"");" & vbcrlf)
.Write ("stopButton.style.display = ""inline"";" & vbcrlf)
.Write ("window.close();" & vbcrlf)
.Write ("</script>" & vbcrlf)
问题:
当我尝试更改stopButton元素的onclick值时,以上所有工作正常:
.Write ("<script language=""javascript"">" & vbcrlf)
.Write ("var stopButton = opener.document.getElementById(""timerStop"");" & vbcrlf)
.Write ("stopButton.style.display = ""inline"";" & vbcrlf)
**.Write ("stopButton.onclick = function () {alert(""test"");};" & vbcrlf)**
.Write ("window.close();" & vbcrlf)
.Write ("</script>" & vbcrlf)
然后在窗口关闭后单击按钮我在FF中出现错误,IE中没有任何反应:
未被捕的例外:[例外...... “组件返回失败代码: 0x80004005(NS_ERROR_FAILURE) [nsIDOMWindowInternal.alert]” nsresult:“0x80004005 (NS_ERROR_FAILURE)“位置:”JS frame :: /timer/activity_proc.asp?a=start :: anonymous :: line 8“data:no]
这是因为子窗口不再存在吗?我应该注意,在我尝试更改其值之前,该按钮确实有一个onclick值。
答案 0 :(得分:1)
我认为这是因为子窗口不再存在。
有一种在javascript中创建函数的方法,称为闭包。本质上,函数“属于”或“存储”在其声明的内容中。在这种情况下,在子窗口上。
如果你有一个功能在你的父窗口上工作并调用它而不是直接分配,它应该工作。即:
父文件上的:
assignStopButtonListener = function(){
var stopButton = document.getElementById(""timerStop"");
stopButton.style.display = "inline";
stopButton.onclick = function () {alert("test");};
}
在弹出文档
上.Write ("<script language=""javascript"">" & vbcrlf)
.Write ("opener.assignStopButtonListener();" & vbcrlf)
.Write ("</script>" & vbcrlf)