日常开发网页中,时常遇到跨域问题,通常解决办法:后端提供的接口支持jsonp格式,前端采用dataType:jsonp。
一:Jquery封装的AJAX,dataType:jsonp格式的方法:
1 $.ajax({ 2 ????type : "get", 3 ????async:false, 4 ????url : "", 5 ????dataType : "jsonp", 6 ????jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback) 7 ????jsonpCallback:"success_jsonpCallback",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,但是不能为空 8 ????success : function(data){10 ???????console.log(data) ????27 ????},28 ????error:function(){29 ???????alert(‘fail‘);30 ????}31 })
二:使用原生js封装jsonp接口,同时应用Promise对象,可以链式调用
window.STATE_CALLBACK = { ?uid:new Date - 0}function jsonp(url,param,callbackName){ ?return new Promise(function(resolve,reject){ ???callbackName = callbackName || ‘jsonpCallback‘ ???var script = document.createElement(‘script‘) ???script.setAttribute(‘async‘,‘async‘) ???var name = [‘ymwangel‘,STATE_CALLBACK.uid++].join(‘‘) ???param[callbackName] = [‘STATE_CALLBACK.‘,name].join(‘‘) ???script.src = paramConcatUrl(url,param) ???document.body.appendChild(script) ???STATE_CALLBACK[name] = function(data){ ?????delete STATE_CALLBACK[name] ?????document.body.removeChild(script) ?????resolve(data) ???} ???script.onerror = function(e){ ?????reject(e) ???} ?})}
原生js封装jsonp的函数,更能体现jsonp实现跨域的原理:在页面中创建script标签,设置script的async、src属性,然后,将script标签插入到body中,最后当响应请求成功,获取到返回的数据后,删除之前插入的script标签即可。
jsonp解决跨域问题
原文地址:https://www.cnblogs.com/ymwangel/p/8203012.html