之前在做统计分析系统的时候需要跨域请求数据.Jquery已经封装了jsonp的实现,但是考虑到统计代码的大小,决定弃用jquery.自己实现一下.
jsonp的原理其实很简单,通过script标签发送一个callback参数到后端,后端返回数据时,使用这个callback函数包裹一下.这样,在前端接收到后端的返回后,就可以执行这个callback函数.
在使用jsonp时需要注意,jsonp只能发送get请求.
下面是jsonp的实现代码.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| var _ajax = { ajax_jsonp: { now: function () { return (new Date()).getTime(); }, rand: function () { return Math.random().toString().substr(2); }, parse_data: function (data) { var ret = ""; if (typeof data === "string") { ret = data; } else if (typeof data === "object") { for (var key in data) { ret += "&" + key + "=" + encodeURIComponent(data[key]); } } ret += "&_time=" + this.now(); return ret; },
jsonp: function (url, data) { var name; url = url + (url.indexOf("?") === -1 ? "?" : "&") + this.parse_data(data);
var match = /callback=([a-zA-Z\._]+)/.exec(url); if (match && match[1]) { name = match[1].replace(/\./g, "_"); } else { throw new Error("invalid callback param"); }
var script = document.createElement("script"); script.type = "text/javascript"; script.src = url;
var head = document.getElementsByTagName("head"); if (head && head[0]) { head[0].appendChild(script); } } } };
|
调用
1 2 3 4 5 6 7
| _ajax.ajax_jsonp.jsonp(_url, data); #比如_url中的callback是这样的参数: ?callback=window.getdata #则在js中注册这个window.getdata函数即可 window.getdata = function(data) { console.log(data); }
|