利用标签的 src 可跨域属性,实现 get 跨域请求
代码如下(不依赖于第三方库):
var $jsonp = (function () {
var that = {};
that.send = function (src, options) {
var callback_name = options.callbackName || 'callback',
on_success = options.onSuccess || function () {},
on_timeout = options.onTimeout || function () {},
timeout = options.timeout || 10; //sec
var id = 'script_' + new Date().getTime(),
element;
// 返回数据后,删除新创建的 script 元素
var removeScript = function () {
element = document.getElementById(script.id);
if (element) {
element.parentNode.removeChild(element);
}
};
var timeout_trigger = window.setTimeout(function () {
window[callback_name] = function () {};
on_timeout();
removeScript();
}, timeout * 1000);
window[callback_name] = function (data) {
window.clearTimeout(timeout_trigger);
on_success(data);
removeScript();
};
var script = document.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.src = src;
script.id = id;
document.getElementsByTagName('head')[0].appendChild(script);
};
return that;
})();
后台处理
Node express
router.get('/url', function(req, res) {
return res.jsonp({status: 'jsonp'});
});
以上效果等同于
router.get('/url', function(req, res) {
return res.send('typeof callback === "function"&&callback(' + JSON.stringify({status: 'jsonp'}) + ')');
});
其他服务器处理,可以参考以上。
调用方式
$jsonp.send('http://IP?params=&callback=handleDiff', {
callbackName: 'handleDiff', // 此处不写,默认的回掉函数名称为 callback
onSuccess: function (response) {
console.log('success!',response);
},
onTimeout: function () {
console.log('timeout!');
},
timeout: 5
});
网友评论