读书人

解决javascript跨域有关问题

发布时间: 2012-09-22 21:54:54 作者: rapoo

解决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这里。

?

?

好了整体就是这些了。

?

读书人网 >JavaScript

热点推荐