JavaScript跨域调用是指在不同的域名、协议或端口之间进行数据交互。由于浏览器的同源策略(Same-Origin Policy),默认情况下,JavaScript只能访问与其自身来源相同的资源。跨域调用通常用于在不同域的页面之间共享数据或功能。
<script>
标签来加载跨域数据,但只支持GET请求。假设服务器端设置了CORS头:
// 服务器端(Node.js)
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
});
客户端请求:
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
<script>
function handleResponse(data) {
console.log(data);
}
</script>
<script src="https://api.example.com/data?callback=handleResponse"></script>
在同源服务器上设置代理:
// 服务器端(Node.js)
const express = require('express');
const request = require('request');
const app = express();
app.get('/proxy', (req, res) => {
request('https://api.example.com/data', (error, response, body) => {
if (!error && response.statusCode == 200) {
res.send(body);
}
});
});
app.listen(3000);
客户端请求:
fetch('/proxy')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
原因:浏览器的同源策略阻止了跨域访问。
解决方法:
postMessage
进行跨域通信。// 父页面
const iframe = document.getElementById('myIframe');
iframe.onload = () => {
iframe.contentWindow.postMessage('Hello from parent', 'https://target-domain.com');
};
window.addEventListener('message', event => {
if (event.origin !== 'https://target-domain.com') return;
console.log(event.data);
});
// iframe页面(https://target-domain.com)
window.addEventListener('message', event => {
if (event.origin !== 'https://parent-domain.com') return;
console.log(event.data);
event.source.postMessage('Hello from iframe', event.origin);
});
通过以上方法,可以有效解决JavaScript跨域调用iframe内容时遇到的问题。
领取专属 10元无门槛券
手把手带您无忧上云