iframe
是 HTML 中的一个元素,用于在当前网页中嵌入另一个 HTML 文档。跨域调用指的是在不同的域名、协议或端口之间进行通信。由于浏览器的同源策略(Same-Origin Policy),默认情况下,不同源的 iframe
之间是无法直接访问彼此的 JavaScript 对象和方法的。
iframe
访问其他网站的数据。iframe
内容相互隔离,避免了潜在的冲突。window.postMessage
进行跨域通信。问题:尝试在 iframe
中调用跨域的 JavaScript 方法时,会遇到安全错误。
原因:
iframe.contentWindow
或 iframe.contentDocument
访问跨域内容会抛出错误。window.postMessage
window.postMessage
是一种安全的跨域通信方式,允许不同源的窗口之间传递消息。
示例代码:
父页面(parent.html):
<!DOCTYPE html>
<html>
<head>
<title>Parent Page</title>
</head>
<body>
<iframe id="myIframe" src="https://example.com/child.html"></iframe>
<script>
window.addEventListener('message', function(event) {
// 验证消息来源
if (event.origin !== 'https://example.com') return;
console.log('Received message:', event.data);
});
function sendMessageToIframe() {
var iframe = document.getElementById('myIframe');
iframe.contentWindow.postMessage('Hello from parent!', 'https://example.com');
}
</script>
<button onclick="sendMessageToIframe()">Send Message to Iframe</button>
</body>
</html>
子页面(child.html):
<!DOCTYPE html>
<html>
<head>
<title>Child Page</title>
</head>
<body>
<script>
window.addEventListener('message', function(event) {
// 验证消息来源
if (event.origin !== 'https://parentdomain.com') return;
console.log('Received message:', event.data);
// 发送响应消息
event.source.postMessage('Hello from iframe!', event.origin);
});
</script>
</body>
</html>
event.origin
),以防止安全漏洞。window.postMessage
在现代浏览器中得到广泛支持,但在使用时仍需注意兼容性问题。通过这种方式,可以在不同源的 iframe
之间实现安全的通信,避免了直接跨域访问带来的安全风险。
领取专属 10元无门槛券
手把手带您无忧上云