完美解決AJAX跨域問題
從AJAX誕生那天起,XMLHttprequest對象不能跨域請求的問題就一直存在。這似乎是一個很經(jīng)典的問題了。是由于javascript的同源策略(這里不作深入探討)所導(dǎo)致。
解決的辦法,大概有如下幾種:
1. 使用中間層過渡的方式(可以理解為“代理”):
中間過渡,很明顯,就是在AJAX與不同域的服務(wù)器進(jìn)行通訊的中間加一層過渡,這一層過渡可以是PHP、JSP、c++等任何具備網(wǎng)絡(luò)通訊功能的語言,由中間層向不同域的服務(wù)器進(jìn)行讀取數(shù)據(jù)的操作。拿asp.net做一個例子,如果需要對不同域的某一個asp.net進(jìn)行通訊,現(xiàn)在客戶端的xmlhttprequest先query本域的一個asp.net ,然后由本域的這個asp.net去和不同域的asp.net進(jìn)行通訊,然后由本域的asp.net響應(yīng)輸出(response);思路大概就是這樣的,相信讀者已經(jīng)很清楚的理解了。
2. 使用<script>標(biāo)簽
這個方法是利用<script>標(biāo)簽中的src來query一個aspx獲得response,因為<script>標(biāo)簽的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>標(biāo)簽而沒有用到xml和xmlHttprequest的緣故。這種方法似乎有點“另類”,哈哈。
那現(xiàn)在我們就看看,有了jQuery之后,如何來解決ajax的跨域問題:
<html>
<head>
<title>JQuery學(xué)習(xí)</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.dhdzp.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>
遠(yuǎn)程服務(wù)器端js.txt中的內(nèi)容為:
var Dylan= {name:"Dylan",email:Dylan@163.com}
筆者感覺這種方式更加簡潔。呵呵。當(dāng)然,讀者可以根據(jù)實際情況,任意選擇實現(xiàn)方式。
怎么樣,其實很簡單吧,我看到過很多人不愿意去正視ajax所存在的技術(shù)瓶頸,其實AJAX更應(yīng)該是Ajax而不是AJAX,突出第一個A是想強調(diào)其實AJAX發(fā)揚的是一種異步傳輸?shù)姆椒ǎ皇蔷唧w到底使用了哪種技術(shù)。
其實,在json數(shù)據(jù)格式之后,有一種更牛X的“jsonp”,也可以實現(xiàn)ajax的跨域通信。其實jsonp不是一種數(shù)據(jù)格式,只是對我介紹的第二種方式做了改進(jìn)。從jQuery1.2 版本開始,jQuery 擁有對 JSONP 回調(diào)的本地支持。
相關(guān)文章
layui實現(xiàn)數(shù)據(jù)表格隱藏列的示例
今天小編就為大家分享一篇layui實現(xiàn)數(shù)據(jù)表格隱藏列的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10
小程序卡片切換效果組件wxCardSwiper的實現(xiàn)
這篇文章主要介紹了小程序卡片切換效果組件wxCardSwiper的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
JavaScript對象轉(zhuǎn)數(shù)組的3種簡單方法小結(jié)
在JavaScript中可以通過Object.keys()結(jié)合Array.map()、Object.entries()或Object.values()等方法將對象轉(zhuǎn)換為數(shù)組,這些方法各有優(yōu)勢,可根據(jù)需要靈活選擇,需要的朋友可以參考下2024-09-09
layui-table對返回的數(shù)據(jù)進(jìn)行轉(zhuǎn)變顯示的實例
今天小編就為大家分享一篇layui-table對返回的數(shù)據(jù)進(jìn)行轉(zhuǎn)變顯示的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
微信小程序 調(diào)用微信授權(quán)窗口相關(guān)問題解決
這篇文章主要介紹了微信小程序 調(diào)用微信授權(quán)窗口相關(guān)問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07

