`

Ajax 跨域问题的解决方案

阅读更多
注:本文转自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);
	};
})();
分享到:
评论

相关推荐

    Ajax跨域问题 解决方案

    ### Ajax跨域问题解决方案 #### 一、什么是Ajax跨域 **原理:** Ajax跨域问题的核心在于浏览器的“同源策略”。同源策略是一种安全措施,用于限制一个域名下的文档或脚本如何与另一个来源的资源进行交互。简单来说...

    Ajax跨域问题及其解决方案.docx

    这是目前最常用的跨域解决方案之一,主要通过在服务端添加CORS(Cross-Origin Resource Sharing)配置来实现。 - **服务端配置示例**(Java): ```java @Configuration public class CorsConfig implements ...

    Ajax跨域访问解决方案

    JSONP是一种早期的跨域解决方案,它是通过动态创建`<script>`标签来加载数据的。因为`<script>`标签不受同源策略限制,可以通过`src`属性指向提供JSON数据的外部服务。服务端返回的数据是一个JavaScript函数调用,...

    Javascript跨域和Ajax跨域解决方案

    本文将深入探讨JavaScript和Ajax跨域的原理,以及常用的解决方案。 首先,理解同源策略是解决跨域问题的基础。同源策略是浏览器为了保障用户安全而设定的一种机制,它规定了只有同源(即协议、域名和端口都相同)的...

    ajax跨域问题的解决办法

    解决ajax跨域问题有多种方法,以下是几种常见的解决方案: 1. 使用中间层过渡的方式 这种方法是通过在ajax请求和不同域的服务器之间加一层中间层来解决跨域问题。中间层可以是php、jsp、c++等任何具备网络通讯功能...

    ajax跨域解决办法

    【AJAX跨域解决办法】 在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种在无需刷新整个页面的情况下更新部分网页的技术。然而,由于浏览器的同源策略限制,AJAX请求通常只能发送到与当前页面同一源的...

    解决ajax跨域问题

    根据提供的文件信息,本文将详细介绍如何通过JSONP等方法解决Ajax跨域问题。 #### Ajax与同源策略 首先,我们需要了解为什么会出现跨域问题。浏览器出于安全考虑,实施了一项名为“同源策略”的安全机制。同源策略...

    PHP Ajax跨域问题解决方案代码实例

    本文通过设置Access-Control-Allow-Origin来实现跨域。 例如:客户端的域名是client.runoob.com,而请求的域名是server.runoob.com。 如果直接使用ajax访问,会有以下错误: XMLHttpRequest cannot load ...

    解决ajax跨域请求问题

    解决Ajax跨域问题有多种方法: 1. JSONP(JSON with Padding):JSONP是一种利用动态插入`<script>`标签来绕过同源策略的方法。服务器返回一个JavaScript函数调用,带有请求的数据作为参数。例如,服务器返回`...

    Ajax跨域问题及解决方案(jsonp,cors)

    解决方案: 1.jsonp  在远程服务器上设法动态的把数据装进js格式的文本代码段中,供客户端调用和进一步处理;在前台通过动态添加script标签及src属性,表面看上去与ajax极为相似,但是,这和ajax并没有任何关系;...

    IE7 Ajax跨域问题

    1. **JSONP (JSON with Padding)**:这是一种常见的跨域解决方案,它通过动态创建`<script>`标签来加载来自其他域的JavaScript代码,因为脚本标签不受同源策略限制。服务器返回的JSON数据被包装在一个函数调用中,...

    关于ajax跨域问题的几种常见解决方案,附代码。

    什么是跨域,跨域出现的场景,模拟跨域,springmvc下解决跨域,springboot下解决跨域。绝对原创。

    Ajax跨域请求解决方案-JSONP

    总的来说,JSONP是Ajax跨域请求的一种实用解决方案,尤其适用于只支持GET请求且不涉及复杂交互的场景。但是,它也有一些局限性,比如不支持POST请求、无法控制HTTP头部、无错误处理机制等。因此,在现代Web开发中,...

    ajax跨域问题的解决办法.rar

    JSONP是一种早期的跨域解决方案,利用`<script>`标签可以跨域加载JavaScript的特性。服务器返回一个JavaScript函数调用,参数是数据,客户端预先定义好这个函数,通过动态插入`<script>`标签来执行。例如,服务器端...

    ajax跨域jar包.zip

    【标题】:“Ajax跨域问题解决方法——CORS详解及jar包使用” 【内容】: 在Web开发中,Ajax(Asynchronous JavaScript and XML)技术被广泛用于实现页面的异步更新,提高用户体验。然而,由于浏览器的安全策略,...

    demo跨域ajax_DEMO_ajax跨域_

    本示例“demo跨域ajax_DEMO_ajax跨域”着重解决C#后端与JavaScript前端之间的跨域限制。这里我们将深入探讨什么是跨域、为何会产生跨域问题以及如何通过C#和Ajax实现跨域通信。 首先,我们需要了解什么是跨域。根据...

    js跨域解决方案

    1. **JSONP(JSON with Padding)**:JSONP是一种早期的跨域解决方案,它依赖于`<script>`标签不受同源策略限制的特点。通过动态创建`<script>`标签,设置其`src`属性为提供服务的服务器接口,并由服务器返回一个包裹...

Global site tag (gtag.js) - Google Analytics