JSONP(JSON with Padding)是一种通过<script>
标签实现跨域请求的技术。由于浏览器的同源策略限制,通常情况下,JavaScript只能请求与其自身来源相同的资源。JSONP通过动态创建<script>
标签,利用其不受同源策略限制的特性,实现跨域数据交互。
JSONP 的工作原理是利用 <script>
标签的 src
属性没有跨域限制的特点,服务器返回的数据会被包裹在一个函数调用中,这个函数名通常由客户端指定并通过 URL 参数传递给服务器。
JSONP主要分为两种类型:
<script>
标签,并设置其src
属性为跨域请求的URL。以下是一个简单的原生JavaScript实现JSONP的例子:
function jsonp(url, callbackName, callback) {
// 创建一个全局回调函数
window[callbackName] = function(data) {
callback(data);
// 清理工作:删除script标签和全局回调函数
document.body.removeChild(script);
delete window[callbackName];
};
// 创建script标签
var script = document.createElement('script');
script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'callback=' + callbackName;
document.body.appendChild(script);
}
// 使用示例
jsonp('http://example.com/api/data', 'myCallback', function(data) {
console.log('Received data:', data);
});
问题1:回调函数未定义
myCallback({"data": "value"})
。问题2:安全问题
问题3:错误处理
setTimeout
并在超时后删除script标签和回调函数。function jsonp(url, callbackName, callback) {
var script = document.createElement('script');
var timeoutId;
function cleanup() {
if (script.parentNode) script.parentNode.removeChild(script);
window[callbackName] = undefined;
clearTimeout(timeoutId);
}
window[callbackName] = function(data) {
cleanup();
callback(data);
};
script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'callback=' + callbackName;
document.body.appendChild(script);
timeoutId = setTimeout(function() {
cleanup();
console.error('JSONP request timed out');
}, 5000); // 设置超时时间为5秒
}
通过以上方法,可以在一定程度上解决JSONP实现过程中可能遇到的问题。
领取专属 10元无门槛券
手把手带您无忧上云