`
清水上人
  • 浏览: 7091 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

解决javascript跨域问题

阅读更多

    浏览器出于安全方面的考虑,禁止了javascript跨域访问,但是在我们实际的开发中确经常需要跨域,这就给我们开发中带来了很大的困难。不多说了,直接上代码说明跨域的解决方案吧~

 

function KQAjaxRequest() {
	this.LocationUrl="http://www.192.168.1.28:8080";
   	this.userAgent = {};
   	this.appVersion = {};
   	this.onReceivedResponse = null;
}

KQAjaxRequest.prototype.targetObj = null;
KQAjaxRequest.connectionContext = new Array(); 

KQAjaxRequest.prototype.isIE = function () {
  	return document.all?true:false;
};
KQAjaxRequest.prototype.scriptRequest = function (url) {
	var headTag = document.getElementsByTagName("head")[0];
 	var scriptTag = document.createElement("script");
  	scriptTag.type = "text/javascript";
  	scriptTag.charset = "UTF-8";
	url = url + "&" + Math.random();;
   
  	scriptTag.src = url;
  	var scriptTagOnLoad = function () {
    	scriptTag.onload = null;
    	var scriptTagParent = scriptTag.parentNode;
    	scriptTagParent.removeChild(scriptTag);
    	delete scriptTag;
  	};
  	var scriptTagOnReady = function (scriptTagParent) {
    	var eventSource = (scriptTagParent ? scriptTagParent : window.event).target ? (scriptTagParent ? scriptTagParent : window.event).target : (scriptTagParent ? scriptTagParent : window.event).srcElement;
    	if (eventSource.readyState == "loaded" || eventSource.readyState == "complete") {
      		eventSource.onreadystatechange = null;
     		setTimeout(scriptTagOnLoad, 5000);
   	 	}
 	};
  	if (this.isIE) {
		scriptTag.onreadystatechange = scriptTagOnReady;
  	} else {
    	scriptTag.onload = scriptTagOnLoad;
  	}
  	headTag.appendChild(scriptTag);
};
KQAjaxRequest.prototype.sendRequest = function (url) {
  	var contextNo = KQAjaxRequest.setConnectionContext(this);
 	url =this.LocationUrl+ url + "&ctx=" + contextNo;
    this.scriptRequest(url);
	setTimeout(KQAjaxRequest.connectionContext[contextNo].timeOut, 8000);
};
KQAjaxRequest.setConnectionContext = function(context)
{
  	var isFindSpace = false;
 	var id = null;
  	if (KQAjaxRequest.connectionContext.length) {
    	for (var i = 0; i < KQAjaxRequest.connectionContext.length; i++) {
      		if (KQAjaxRequest.connectionContext[i] == null) {
        		KQAjaxRequest.connectionContext[i] = context;
        		id = i;
        		isFindSpace = true;
        		break;
      		}
    	}
  	}
  	if (!isFindSpace) {
    	id = KQAjaxRequest.connectionContext.length;
    	KQAjaxRequest.connectionContext.push(context);
  	}
	KQAjaxRequest.connectionContext[id].timeOut = function () {
		try {
			var data = new Object;
			data.command = "search failed";
			data.errorCode = "服务器忙,请稍后重试";
			var requestObj = KQAjaxRequest.connectionContext[parseInt(id)];
			requestObj.onReceivedResponse.call(requestObj.targetObj, data);
		}catch(e){}
	}
  	return id;
};

KQAjaxRequest.ReturnData = function(contextNo, data)
{
  var no = 0;
  if (contextNo)
  {
  	  no = parseInt(contextNo);
  }
  try {
  	var requestObj = KQAjaxRequest.connectionContext[no];
  	KQAjaxRequest.connectionContext[no] = null;
  	requestObj.onReceivedResponse.call(requestObj.targetObj, data);
  }catch(e){}
};
KQAjaxRequest.prototype.setResponseHandler = function(fun, obj) {
  	this.onReceivedResponse = fun;
 	this.targetObj = obj;
};

 

外面要使用到的函数说明:

     setResponseHandler()方法中的参数,fun为服务器返回结果后触发的方法。obj为调用该方法的对象,直接写上this就行。

     sendRequest()为你需要调用的URL。

 

使用方法:

             首先实例化KQAjaxRequest类获取到该类的句柄。如:var reqs=new KQAjaxRequest();

             this.url=funcUrl+"?"+"logicX="+x*86400+"&logicY="+y*86400;

             reqs.setResponseHandler(this.callbackFunctionName,this);
             reqs.sendRequest(this.url);

注:callbackFunctionName为自己定义的一个方法。在这里的URL没有域,因为域写在了KQAjaxRequest中的LocationUrl中,后面自己可以改写。还有在服务器返回中需要做一些处理:

String str="KQAjaxRequest.ReturnData("+this.ctx+","+results.toString()+")";
response.getWriter().write(str);

我这里后台服务器使用的是java,主要在KQAjaxRequest.ReturnData这里。

 

 

好了整体就是这些了。

 

0
3
分享到:
评论
2 楼 清水上人 2011-07-04  
panshunchang 写道
先看看,希望以后有用,谢了!


绝对好用,我现在用的就是这个,目前我用到的所有浏览器都支持。
1 楼 panshunchang 2011-07-04  
先看看,希望以后有用,谢了!

相关推荐

    javascript插件 解决双向跨域问题

    jcrossdomain是一个专门用于解决JavaScript跨域问题的工具,尤其适用于需要双向通信的场景。它通过创建隐藏的IFrame和利用window.postMessage API来实现跨域通信。window.postMessage是HTML5引入的一个API,允许来自...

    完美解决iframe跨域问题

    本文将深入探讨如何“完美解决iframe跨域问题”,并介绍其底层的`window.name`转换代理实现。 **一、iframe跨域的基本概念** 1. **什么是iframe**:iframe是一种HTML元素,允许在单个网页中嵌入另一个网页。它通过...

    js跨域问题小结

    解决JavaScript跨域问题的方法有多种: 1. JSONP(JSON with Padding):这是一种早期的跨域解决方案,通过动态创建`&lt;script&gt;`标签来引入一个带有回调函数的JavaScript文件。由于浏览器允许不同源的脚本嵌入,JSONP...

    Javascript跨域和Ajax跨域解决方案

    首先,理解同源策略是解决跨域问题的基础。同源策略是浏览器为了保障用户安全而设定的一种机制,它规定了只有同源(即协议、域名和端口都相同)的网页才能互相访问对方的资源。如果违反这一策略,浏览器会阻止请求,...

    arcgis api for javascript跨域处理方案

    总结起来,解决ArcGIS API for JavaScript的跨域问题通常需要在客户端和服务器端采取相应的措施。资源代理是一种安全且灵活的解决方案,特别是在处理敏感数据或需要控制访问权限时。理解并正确实施这些方法对于开发...

    Javascript跨域访问解决方案

    JavaScript跨域访问解决方案 在Web开发中,JavaScript的同源策略是浏览器为了保障用户安全而实施的一项重要机制。它限制了脚本只能访问与当前页面具有相同协议(如http或https)、主机名和端口号的资源。然而,在...

    javascript跨域原因以及解决方案分享

    解决JavaScript跨域问题的方法多种多样,主要包括以下几种: 1. JSONP(JSON with Padding):利用`&lt;script&gt;`标签不受同源策略限制的特性,通过动态创建`&lt;script&gt;`标签,并将回调函数名作为参数传递给服务器。...

    nginx安装, 解决跨域问题

    **Nginx安装与解决跨域问题** 在现代Web开发中,由于浏览器的同源策略,跨域问题经常出现,限制了不同源之间的通信。Nginx作为一个高性能的反向代理服务器,常被用于处理此类问题。本篇将详细介绍如何在Linux环境下...

    js_跨域访问[参照].pdf

    总的来说,解决JavaScript跨域问题通常需要结合客户端和服务器端的技术,根据实际情况选择合适的策略。对于开发过程中遇到跨域问题的场景,理解这些解决方案并灵活运用是非常重要的,以确保不同源之间能够安全、有效...

    nginx解决跨域问题的实例方法

    本篇文章将详细介绍如何利用Nginx解决跨域问题。 首先,了解跨域的基本概念。跨域是指由于浏览器的同源策略,JavaScript只能请求与当前页面同源(协议、域名和端口都相同)的资源。当尝试请求不同源的资源时,就会...

    深入分析Javascript跨域问题

    JavaScript中的跨域问题源于浏览器实施的同源...总的来说,解决JavaScript跨域问题需要根据具体需求选择合适的方法,既要考虑安全性,也要考虑兼容性和性能。在实际开发中,通常会结合使用多种策略,以达到最佳效果。

    前端后端跨域问题

    ### 前端后端跨域问题解析及解决方案 #### 跨域问题概述 跨域问题,即Cross-Origin Resource Sharing(CORS),是指浏览器出于安全考虑,在不同源之间执行网络请求时实施的一种限制机制。根据同源策略的规定,只有...

    解决 springboot跨域请求问题

    Nginx可以配置为将前端和后端的请求路由到相应的服务器,从而隐藏真实的服务器地址,同时也解决了跨域问题。在Nginx配置文件中,你可以添加一个新的location块来代理后端服务。例如: ```nginx location / { ...

    Geoserver解决Tomcat跨域问题文件.rar

    在Web开发中,跨域问题是一个常见的安全问题,它源于浏览器的同源策略,限制了JavaScript从一个源(域名、协议或端口)向另一个源发送请求的能力。当用户尝试通过一个源访问由不同源提供的资源时,就会遇到跨域问题...

    Geoserver跨域问题解决方案

    本篇文章将详细介绍如何解决Geoserver的跨域问题。 首先,我们需要理解跨域问题的背景。根据同源策略,浏览器只允许与同一源(协议+域名+端口)的请求进行通信。但在实际应用中,比如一个网站前端和Geoserver不在同...

    javascript跨域方案总结

    JavaScript跨域方案是Web开发中的一个重要主题,尤其是在构建现代Web应用程序时。由于浏览器的安全策略,JavaScript在不同域名之间默认不允许进行通信,这就是所谓的“同源策略”。然而,开发者经常需要在多个域之间...

    javaScript跨域通信

    4. WebSocket:WebSocket协议提供全双工、低延迟的双向通信,它在建立连接时就已经解决了跨域问题。服务器只需要在响应头中包含`Sec-WebSocket-Origin`字段,指定允许的源即可。 5. Iframe:通过嵌入一个可跨域的...

    JavaScript 跨域通信方法

    本文重点介绍了两种类型的跨域问题及其解决方案。对于不同源的接口请求,可以采用JSONP或XMLHttpRequest Level 2等技术;而对于父子页面间的通信,则可以通过代理页面或`postMessage` API来实现。开发者可以根据实际...

    解决ajax跨域问题

    ### 解决Ajax跨域问题 在现代Web开发中,跨域问题经常出现并困扰着开发者。根据提供的文件信息,本文将详细介绍如何通过JSONP等方法解决Ajax跨域问题。 #### Ajax与同源策略 首先,我们需要了解为什么会出现跨域...

    JavaScript跨域总结与解决办法

    ### JavaScript跨域总结与解决办法 #### 跨域的基本概念 跨域问题源自于浏览器的安全策略之一——**同源策略**。同源策略是浏览器为了防止恶意网站通过脚本访问其他网站的数据而采取的一种安全措施。它规定了一个...

Global site tag (gtag.js) - Google Analytics