注:本文转自http://pkzhuclover.iteye.com/admin/blogs/836772
作者未对原理进行太多的说明,需要的时候自己要去读代码,我使用后会把原理补充上。
(function(){
var id = 1,
queueList = {};
function apply(o,c){
if(o){
for(var k in c){
o[k] = c[k];
}
}
return o;
}
/**
*使用方式
*scriptRequest({
* url:"http://xxx.xxx.xxx",
* callback:function(me,data){
* //具体操作方法,data为服务器返回数据.
* }
*})
*/
function ScriptRequest(config){
var me = this;
apply(me,config);
me.cb = "ScriptRequestCallback_" + id;
me.scriptID = "ScriptRequestID_" + (id++);
me.head = document.getElementsByTagName("head")[0];
me.request();
}
apply(ScriptRequest.prototype,{
/**
*请求地址.
*/
//url:""
/**
*回调作用域.
*/
//scope:null,
/**
*@cfg {String}:队列ID,相同的队列ID一次请求未完成时再次请求会自动取消同队列中的上次请求.
*/
//queue:null,
/**
*@cfg {Number}:超时时间,一次请求的最大请求时间.
*/
timeout:30000,
/**
*@cfg {Boolean}:自动取消,在有队列的情况下是否自动取消上次请求.
*/
autoCancel:true,
/**
*@cfg getter {Boolean}:是否处于请求状态.
*/
loading:false,
/**
*@cfg {String}:后台接收回调方法名的参数名称.
*以java为例如:
*String callback = request.getParameter("callback");
*out.println(callback + "("+ "'输出一串字符串'" +")").
*/
callbackName:"callback",
initUrl:function(){
var me = this,
code = "?";
if(me.url.indexOf("?") != -1){
code = "&";
}
me.url += code + me.callbackName + "=" +me.cb;
},
request:function(){
var me = this;
me.transactQueue();
me.initUrl();
me.bindListeners();
var script = document.createElement("script");
script.setAttribute("src", me.url);
script.setAttribute("type", "text/javascript");
script.setAttribute("id", this.scriptID);
me.script = script;
me.head.appendChild(script);
me.loading = true;
},
bindListeners:function(){
var me = this;
window[me.cb] = function(data){
me.release();
me.callback && me.callback.call(me.scope || me,me,data);
}
me.timeoutThread = setTimeout(function(){
me.cancel();
},this.timeout);
},
transactQueue:function(){
var me = this,
queue=me.queue;
if(queue){
var request = queueList[queue];
request && me.autoCancel && request.cancel();
queueList[queue] = me;
}
},
cancel:function(){
this.release();
},
release:function(){
var me = this;
if(me.loading){
me.loading = false;
clearTimeout(me.timeoutThread);
window[me.cb] = undefined;
try{
delete window[me.cb];
}catch(e){}
me.script && me.head.removeChild(me.script);
}
}
});
this.scriptRequest = function(config){
return new ScriptRequest(config);
};
})();
分享到:
相关推荐
关于跨域,有N种类型,本文只专注于ajax请求跨域(,ajax跨域只是...o表现(整理了一些遇到的问题以及解决方案) 如何解决ajax跨域 oJSONP方式 oCORS方式 o代理请求方式 如何分析ajax跨域 ohttp抓包的分析 o一些示例
Ajax跨域问题及其解决方案.docx
主要介绍了详解ajax跨域问题解决方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
NULL 博文链接:https://exceptioneye.iteye.com/blog/1405495
Ajax跨域访问解决方案,访问第三方网站的资源
本资源主要介绍了AJAX跨域的解决办法,以及解决方案间的比较
本文通过设置Access-Control-Allow-Origin来实现跨域。 例如:客户端的域名是client.runoob.com,而请求的域名是server.runoob.com。 如果直接使用ajax访问,会有以下错误: XMLHttpRequest cannot load ...
该资源为ASP.NET网站开发技术中使用Ajax进行跨域请求时利用JSONP方案解决浏览器同源策略限制的源码,比较简单,仅供参考
什么是跨域,跨域出现的场景,模拟跨域,springmvc下解决跨域,springboot下解决跨域。绝对原创。
js跨域解决方案
前端基础-Ajax跨域问题的解决方案.docx
NULL 博文链接:https://sun123start.iteye.com/blog/2150778
Ajax跨域是前端开发中常见的问题,本文描述了以Google浏览器Chrome作为客户端和以Tomcat作为Web服务器的情况下的解决办法。 问题现象 当出现跨域访问的时候ajax通常会报类似如下错误: XMLHttpRequest cannot load ...
一般的ajax写法不能跨域,本文档提出了解决ajax不能跨域的问题的方法
PHP下ajax跨域的解决方案之jsonp实例分析.docx
解决方案: 1.jsonp 在远程服务器上设法动态的把数据装进js格式的文本代码段中,供客户端调用和进一步处理;在前台通过动态添加script标签及src属性,表面看上去与ajax极为相似,但是,这和ajax并没有任何关系;...
解决ajax跨域Java解决方案,通过代理实现ajax跨域操作,避免拒绝访问等跨域操作问题