【问题标题】:Javascript,calling child window function from opener doesn't workJavascript,从开启器调用子窗口函数不起作用
【发布时间】:2011-01-08 05:47:12
【问题描述】:

我正在开发一个使用 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 ();
    }
}

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

肯尼亚

【问题讨论】:

  • moveTo 是否有效?对于另一个功能,可能存在竞争条件;如果你设置一个计时器来等待.getMaskElements 存在,它会完成吗?

标签: javascript function popup window.open


【解决方案1】:

下面的问题是:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您在打开窗口后立即调用该函数;弹窗上的页面可能还没有加载,所以函数可能还没有定义。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-26
          • 1970-01-01
          相关资源
          最近更新 更多