出于安全和隐私方面的考虑,在web浏览器中,实施了不同域名下的文档间不能通信的举措,也就日常说的禁止跨域执行脚本。
但是在某些开发场景中还是会出现需要通过执行跨域脚本来实现某些功能的案例。本章介绍的跨文本通信,正是为了解决这些案例而设计的。跨文档通信,可以在不同网页文档,不同端口(跨域情况下)进行消息传递。
说概念总是枯燥的,不妨先看个实际例子—不同iframe间的通信:
// iframe1: var form = document.getElementById("form"); form.onsubmit = function() { var message = document.getElementById('input-text').value; window.parent.frames[1].postMessage(message, '*'); return false; } // iframe2 var message = document.getElementById('message'); var messageHandle = function(evt) { message.innerHTML = '接收的消息是:' + evt.data; }; if (window.addEventListener) { window.addEventListener("message", messageHandle, false); } else if (window.attachEvent) { window.attachEvent('onmessage', messageHandle); }
说明:
- iframe1中:
- iframe2中:
上面一节有介绍postMessage的targetOrigin参数,它是网络应用建立信任关系的地址子集,一个源由规则(scheme)、主机(host)、端口(port)组成。上一节的demo中将targetOrigin设置成了通配符*这个在实际使用场合需要避免,因为这是不安全的做法,实际情况下,在处理跨源通信的消息时,一定要验证每个消息的源。一些相对安全的开发技巧: