完美解决AJAX跨域问题

  从AJAX诞生那天起,XMLHttprequest对象不能跨域请求的问题就一直存在。这似乎是一个很经典的问题了。是由于javascript的同源策略(这里不作深入探讨)所导致。

  解决的办法,大概有如下几种:

  1. 使用中间层过渡的方式(可以理解为“代理”):

  中间过渡,很明显,就是在AJAX与不同域的服务器进行通讯的中间加一层过渡,这一层过渡可以是PHP、JSP、c++等任何具备网络通讯功能的语言,由中间层向不同域的服务器进行读取数据的操作。拿asp.net做一个例子,如果需要对不同域的某一个asp.net进行通讯,现在客户端的xmlhttprequest先query本域的一个asp.net ,然后由本域的这个asp.net去和不同域的asp.net进行通讯,然后由本域的asp.net响应输出(response);思路大概就是这样的,相信读者已经很清楚的理解了。

  2. 使用<script>标签

  这个方法是利用<script>标签中的src来query一个aspx获得response,因为<script>标签的src属性不存在跨域的问题。

  举个例子来让大家看得更清楚一点吧:

  

复制代码 代码如下:

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  <html xmlns="http://www.w3.org/1999/xhtml">

  <head>

  <title>Ajax跨域问题</title>

  <script type="text/javascript" src="" id="getAspx">

  </script>

  <script type="text/javascript">

  function get(url) {

  var obj = document.getElementById("getAspx");

  obj.src = url;

  (obj.readStatus == 200)

  {

  alert(responseVal);//如果成功,会弹出Dylan

  }

  }

  function query() {

  get(getDemo.aspx);

  }

  </script>

  </head>

  <body>

  <input type="button" value="Ajax跨域测试" onclick="query();"/>

  </body>

  </html>

  getDemo.aspx后台代码:

  

复制代码 代码如下:

  using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Web;

  using System.Web.UI;

  using System.Web.UI.WebControls;

  namespace LearnJS

  {

  public partial class getDemo : System.Web.UI.Page

  {

  protected void Page_Load(object sender, EventArgs e)

  {

  Response.Write("var responseVal='Dylan'");

  }

  }

  }

  这个方法又叫做ajaj或者ajax without xmlHttprequest,把x换成了j,是因为使用了<script>标签而没有用到xml和xmlHttprequest的缘故。这种方法似乎有点“另类”,哈哈。

  那现在我们就看看,有了jQuery之后,如何来解决ajax的跨域问题:

  

复制代码 代码如下:

  <html>

  <head>

  <title>JQuery学习</title>

  <script src="jquery-1.4.2.min.js" type="text/javascript"></script>

  <script type="text/javascript">

  $(document).ready(function(){

  var oBtnTest = $("#btnTest");

  oBtnTest.click(function(){

  oBtnTest.disabled = true;

  var oResult = $("#result");

  oResult.html("loading").css("color","red");

  jQuery.getScript("http://www.glzy8.com/test/js.txt",

  function(){

  oResult.html("name:" + Dylan.name + "<br/>email:" + Dylan.email).css("color","black");

  oBtnTest.disabled = false;

  });

  });

  });

  </script>

  </head>

  <body>

  <button id="btnTest">BtnTest</button>

  <div id="result"></div>

  </body>

  </html>

  远程服务器端js.txt中的内容为:

  var Dylan= {name:"Dylan",email:[email protected]}

  笔者感觉这种方式更加简洁。呵呵。当然,读者可以根据实际情况,任意选择实现方式。

  怎么样,其实很简单吧,我看到过很多人不愿意去正视ajax所存在的技术瓶颈,其实AJAX更应该是Ajax而不是AJAX,突出第一个A是想强调其实AJAX发扬的是一种异步传输的方法,而不是具体到底使用了哪种技术。

  其实,在json数据格式之后,有一种更牛X的“jsonp”,也可以实现ajax的跨域通信。其实jsonp不是一种数据格式,只是对我介绍的第二种方式做了改进。从jQuery1.2 版本开始,jQuery 拥有对 JSONP 回调的本地支持。