Javascript,从opener调用子窗口函数不起作用

时间:2010-01-22 14:30:25

标签: javascript function popup window.open

我正在开发一个使用windows.open(..)打开弹出窗口的Web应用程序。我需要使用“window.open”返回的句柄在打开的窗口上调用一个函数,但我总是收到错误消息“addWindow.getMaskElements不是函数”,好像它无法访问声明的函数在儿童窗口。这是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 ();
    }
}

我用Google搜索并从不同的可靠来源阅读,显然这应该有效,但事实并非如此。 还有一件事,子窗口中的函数在adicionar_email.htm文件中包含的单独的.js文件中声明。这有什么不同吗?它不应该...... 所以,如果有人遇到类似的问题,或者知道我做错了什么,请回复此邮件。 提前致谢。

Kenia

4 个答案:

答案 0 :(得分:11)

窗口创建不是阻塞操作;当该窗口打开并加载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,直到它成功调用它为止。

答案 1 :(得分:5)

问题是window.open返回得相当快,所请求的文档以及该文档随后可能引用的任何其他项目都尚未加载到窗口中。

因此,尝试如此早地调用此方法将失败。您应该将一个函数附加到打开的窗口的加载事件,并尝试从该函数调用。

答案 2 :(得分:3)

以下问题是:

在父窗口中执行javascript时,子窗口未加载。因此,来自父窗口的调用函数处于无限循环中,导致窗口崩溃。

  

窗口创建不是阻塞操作;脚本继续   在该窗口打开并加载HTML&amp;   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   直到它设法成功地调用它。

答案 3 :(得分:1)

打开窗口后立即调用该功能;弹出窗口上的页面可能尚未加载,因此可能无法在此时定义该函数。