根据 this page 我应该可以调用子窗口的参数和函数,但它对我不起作用。
var w = window.open("index.html");
console.log(w);
console.log(w.foo);
console.log(w)
显示有一个名为 foo
的函数,但是 console.log(w.foo)
输出 未定义
。这是安全问题吗?
编辑这里有一些更多的功能:
child.html(省略正文):
<head>
<script type="text/javascript">
test = 123 ;
function foo(arg){
//do something
}
</script>
</head>
父级.html:
var w = window.open("child.html");
console.log(w);
//outputs all the methods and parameters
console.log(w.foo);
//outputs 'undefined'
console.log(w.test);
//outputs 'undefined'
编辑 2 此外,我应该解释为什么我需要传递参数,因为有人不可避免地会问我为什么我不能“硬编码”。我有一个 HTML canvas 元素,每次用户右键单击时,都会出现一个右键单击菜单,其中包含“在下面列出形状”选项。
当用户单击此菜单项时,我想在该单击下传递所有形状的列表,并在新窗口中显示它。以下是我面临的问题:
我无法将它作为参数传递 b/c 我不知道窗口是否已加载(我似乎也无法更改
onload
函数)我无法让子窗口查询父窗口,因为右键单击菜单在单击后消失。
最佳答案
问题是在尝试检查其内容之前,您没有给子窗口的 DOM 加载机会。
console.log(w)
似乎通过立即显示 Window
或类似内容来工作,但实际上,当你的手指开始展开时控制台中的项目详细信息、属性和方法已存在。
当我在 Firebug 断点的帮助下注入(inject)延迟时,我可以很好地看到子窗口的属性。
This question谈论为 child 添加 onLoad 事件监听器。使用其接受的答案,如何:
<script type="text/javascript">
// parent.html
var w;
function lol() {
console.log(w.foo);
console.log(w.test);
}
w = window.open("child.html");
console.log(w);
w.addEventListener('load', lol, true);
</script>
(我也能够以 1 秒的 setTimeout
延迟取得成功。)
关于跨 HTML 窗口的 Javascript 函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6810486/