ano*_*non 3 html javascript frontend web
我有 2 个网站,我想postMessage在它们之间使用 javascript。在我的主站点上,我在 emty html 文件中编写以下代码:
<html>
<script>
window.addEventListener("message",listener_,false);
function listener_(event) {
console.log('ok!');
<html>
<script>
window.addEventListener("message",listener_,false);
function listener_(event) {
console.log('ok!');
//console.log(event);
//console.log(event.data);
}
</script>
</html>
Run Code Online (Sandbox Code Playgroud)
在其他站点中,我想调用 postmessage,我编写以下代码:
<script type="text/javascript">
window.onload = function() {
testfunction();
};
function testfunction(){
var childWin = window.open("http://my-main-site.com/indexjava2.html","child");
childWin = postMessage('message','*');
console.log(TipaltiIframeInfo.height);
}
</script>
Run Code Online (Sandbox Code Playgroud)
但经过多次尝试后还是不行。我的意思是 console.log('ok!'); 或console.log(事件); console.log(事件.数据);
不会在主站点的控制台上触发,
该怎么办?谢谢
除了在接收页面的代码中间有一个<script>和 一个标签并且定义和添加事件侦听器两次之外,您也没有正确使用。而不是这个:<html>postMessage
childWin = postMessage('message', '*');
Run Code Online (Sandbox Code Playgroud)
……应该是这样的:
childWin.postMessage('message', '*');
Run Code Online (Sandbox Code Playgroud)
如果您想了解更多信息postMessage,请阅读本文。
另一个问题是,除非在发送消息之前打开页面,否则新打开的页面不会收到该消息。您尝试在打开新页面后立即发送消息,并且消息在添加事件侦听器之前到达新页面。您可以使用 a 来解决这个问题setTimeout,但是如果新页面需要更长的时间来加载,那么这也可能不可靠。
// This is what NOT to do:
setTimeout(function() {
childWin.postMessage('message', '*');
}, 1000);
Run Code Online (Sandbox Code Playgroud)
相反,更好的方法是让子页面在加载时通知父页面。然后父母和孩子就可以可靠地沟通。
这是完整的更正代码,首先发送页面:
<script>
var childWin;
window.addEventListener('message', messageListener, false);
function messageListener(event) {
if(event.data == 'ready') {
childWin.postMessage('hello second page', '*');
}
}
window.onload = function() {
childWin = window.open('http://my-main-site.com/indexjava2.htm', 'child');
};
</script>
Run Code Online (Sandbox Code Playgroud)
以及接收页面:
<script>
window.addEventListener('message', messageListener, false);
function messageListener(event) {
console.log(event.data);
}
window.opener.postMessage('ready','*');
</script>
Run Code Online (Sandbox Code Playgroud)