今天与一朋友A聊天:
A:“var t=window.open('2.html')的写法见过吗?”
我:“见过啊,这个不很正常吗?”
A:“哦,那我是不是可以通过t访问新窗口的内容?”
我:“当然,t就是2.html的窗口引用,可以直接访问到其全局对象,如window、document。如var t=window.open('2.html');alert(t.document.body.outerHTML)”
A:“是啊,我可以得到里面的html标签内容,但是2.html里面的函数确调不到!”
我:“??怎么会?我试试”
下面开始我的测试:
2.html(被弹出页面)代码如下:<script type="text/javascript">
<!--
function callme(){
return 'success';
}
//-->
</script>
很简单,定义了一个callme函数,函数返回一个字符串“success”。
1.html(主页面),代码如下:
<script type="text/javascript">
<!--
var t=window.open('2.html');
alert(t.callme());
//-->
</script>
这段代码也很好理解,open了2.html后,调用其callme方法。
运行,很顺利的弹出了错误“对象不支持此属性和方法!”,这个错误倒是之前就想到的,毕竟调用时2.html可能还没有加载完,那就监听子页面的onload事件把。
修改代码如下:<script type="text/javascript">
<!--
var t=window.open('1.html');
t.onload=function(){
t.callme()
};
//-->
</script>
运行,发现不报错误了,但是并没有弹出success。难道onload事件没有监听到?写如下代码测试:
<script type="text/javascript">
<!--
var t=window.open('1.html');
alert(t.onload);
alert(t.window.onload);
alert(t.attachEvent);
//-->
</script>
发现前两个弹出的null,而不是undefined,这说明onload是存在的,但是为什么绑定不上事件目前还不清楚原因。 对于attachEvent是存在的,那就用attachEvent试试把。
<script type="text/javascript">
<!--
var t=window.open('1.html');
t.attachEvent('onload',function(){alert(t.callme())});
//-->
</script>
运行成功,不过要跨浏览器用attachEvent就不行了,需要根据不同浏览器用不同的方式绑定事件了。
下面还有本人一个比较“杂碎”的方法,自己监听页面加载完毕的事件。 代码如下:<script type="text/javascript">
<!--
var t=window.open('1.html');
(function(){
if(!t.document.body) return setTimeout(arguments.callee,1);
alert(t.callme());
})();
//-->
</script>
网名:网者归来、yemoo,长期并将继续投身于WEB前端相关技术的学习和推广的大军中,目前就职于杭州