Javascript,从 opener 调用子窗口函数不起作用
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2117887/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Javascript,calling child window function from opener doesn't work
提问by Kenia
I'm developing a web application that opens a popup using windows.open(..). I need to call a function on the opened window using the handle returned by "window.open", but I'm always getting the error message "addWindow.getMaskElements is not a function", as if it couldn't access the function declared on child window. This is the behavior in both IE and FF. My code looks like this:
我正在开发一个使用 windows.open(..) 打开弹出窗口的 Web 应用程序。我需要使用“window.open”返回的句柄在打开的窗口上调用一个函数,但我总是收到错误消息“addWindow.getMaskElements is not a function”,好像它无法访问声明的函数在子窗口上。这是 IE 和 FF 中的行为。我的代码如下所示:
function AddEmail(target,category)
{
if(addWindow == null)
{
currentCategory = category;
var left = getDialogPos(400,220)[0];
var top = getDialogPos(400,220)[1];
addWindow = window.open("adicionar_email.htm",null,"height=220px, width=400px, status=no, resizable=no");
addWindow.moveTo(left,top);
addWindow.getMaskElements ();
}
}
I've googled and read from different reliable sources and apparently this is supposed to work, however it doesn't. One more thing, the functions in child window are declared in a separate .js file that is included in the adicionar_email.htm file. Does this make a difference? It shouldn't.. So, if anyone has ran into a similar problem, or has any idea of what I'm doing wrong, please, reply to this message. Thanks in advance.
我用谷歌搜索并阅读了不同的可靠来源,显然这应该有效,但事实并非如此。还有一件事,子窗口中的函数是在单独的 .js 文件中声明的,该文件包含在 adicionar_email.htm 文件中。这有什么不同吗?它不应该......所以,如果有人遇到类似的问题,或者知道我做错了什么,请回复此消息。提前致谢。
Kenia
肯尼亚
采纳答案by Erik
The window creation is not a blocking operation; the script continues to execute while that window is opening and loading the HTML & javascript and parsing it.
窗口创建不是阻塞操作;当该窗口打开并加载 HTML 和 javascript 并解析它时,脚本会继续执行。
If you were to add a link on your original page like this:
如果您要在原始页面上添加这样的链接:
<a href="#" onclick="addWindow.getMaskElements();">Test</a>
You'd see it works. (I tried it just to be sure.)
你会看到它有效。(我试过只是为了确定。)
**EDIT **
**编辑 **
Someone else posted a workaround by calling an onload in the target document, here's another approach:
其他人通过在目标文档中调用 onload 发布了一种解决方法,这是另一种方法:
function AddEmail()
{
if(addWindow == null) {
addWindow = window.open("test2.html",null,"height=220px, width=400px, status=no, resizable=no");
}
if(!addWindow.myRemoteFunction) {
setTimeout(AddEmail,1000);
} else { addWindow.myRemoteFunction(); }
}
This keeps trying to call addWindow.myRemoteFunction every 1 second til it manages to sucessfully call it.
这会不断尝试每 1 秒调用一次 addWindow.myRemoteFunction,直到它成功调用它。
回答by AnthonyWJones
The problem is that window.open returns fairly quickly, the document that is requested and then any other items that that document may subsequently refer to will not yet have been loaded into the window.
问题是 window.open 返回得相当快,请求的文档以及该文档随后可能引用的任何其他项目尚未加载到窗口中。
Hence attempting to call this method so early will fail. You should attach a function to the opened window's load event and attempt to make you calls from that function.
因此,如此早地尝试调用此方法将失败。您应该将一个函数附加到打开的窗口的加载事件并尝试从该函数调用。
回答by krishth
The problem with the below one is :
下面的问题是:
When the javascript is being executed in the parent window, the child window is not loading. Hence, the invoking function from parent window is in the infinite loop and it is leading to crashing the window.
在父窗口中执行 javascript 时,子窗口未加载。因此,来自父窗口的调用函数处于无限循环中,导致窗口崩溃。
The window creation is not a blocking operation; the script continues to execute while that window is opening and loading the HTML & javascript and parsing it.
If you were to add a link on your original page like this:
<a href="#" onclick="addWindow.getMaskElements();">Test</a>You'd see it works. (I tried it just to be sure.)
**EDIT **
Someone else posted a workaround by calling an onload in the target document, here's another approach:
function AddEmail() { if(addWindow == null) { addWindow = window.open("test2.html",null,"height=220px, width=400px, status=no, resizable=no"); } if(!addWindow.myRemoteFunction) { setTimeout(AddEmail,1000); } else { addWindow.myRemoteFunction(); } }This keeps trying to call addWindow.myRemoteFunction every 1 second til it manages to sucessfully call it.
窗口创建不是阻塞操作;当该窗口打开并加载 HTML 和 javascript 并解析它时,脚本会继续执行。
如果您要在原始页面上添加这样的链接:
<a href="#" onclick="addWindow.getMaskElements();">Test</a>你会看到它有效。(我试过只是为了确定。)
**编辑 **
其他人通过在目标文档中调用 onload 发布了一种解决方法,这是另一种方法:
function AddEmail() { if(addWindow == null) { addWindow = window.open("test2.html",null,"height=220px, width=400px, status=no, resizable=no"); } if(!addWindow.myRemoteFunction) { setTimeout(AddEmail,1000); } else { addWindow.myRemoteFunction(); } }这会不断尝试每 1 秒调用一次 addWindow.myRemoteFunction,直到它成功调用它。
回答by BobS
You are calling the function immediately after opening the window; the page on the popup may not be loaded yet, so the function may not be defined at that point.
您在打开窗口后立即调用该函数;弹出窗口中的页面可能尚未加载,因此此时可能未定义该函数。

