今天終於有點時間研究了一下javsscript ajax 指令碼跨域調用的問題,先在網上隨便搜了一下找到一些解 決的辦法,但是都比較複雜。由是轉到jquery.chm使用者手冊當中找到一些程式碼片段關於ajax跨域調用的問題。 程式碼片段如下:
crossDomain mapV1.5
預設: 同域請求為false
跨域請求為true如果你想強制跨域請 求(如JSONP形式)同一域,設定crossDomain為true。這使得例如,伺服器端重新導向到另一個域。
這 裡強調如是ajax的跨域調用,dataType一定要是jsonp的格式。(什麼是jsonp這裡不做解釋,可以google一下 。)
令外還有一些程式碼片段:如下所示:
dataType String
預期伺服器返回的資料類型。如果不指定,jQuery 將自動根據 HTTP 包 MIME 資訊來智能判斷 ,比如XML MIME類型就被識別為XML。在1.4中,JSON就會產生一個JavaScript對象,而script則會執行這個腳 本。隨後伺服器端返回的資料會根據這個值解析後,傳遞給回呼函數。可用值:
"xml": 返 回 XML 文檔,可用 jQuery 處理。
"html": 返回純文字 HTML 資訊;包含的script標籤會 在插入dom時執行。
"script": 返回純文字 JavaScript 代碼。不會自動緩衝結果。除非設 置了"cache"參數。'''注意:'''在遠程請求時(不在同一個域下),所 有POST請求都將轉為GET請求。(因為將使用DOM的script標籤來載入)
"json": 返回 JSON 資料 。
"jsonp": JSONP 格式。使用 JSONP 形式調用函數時,如 "myurl? callback=?" jQuery 將自動替換 ? 為正確的函數名,以執行回呼函數。
"text": 返 回純文字字串
jsonp String
在一個jsonp請求中重 寫回呼函數的名字。這個值用來替代在"callback=?"這種GET或POST請求中URL參數裡的 "callback"部分,比如{jsonp:'onJsonPLoad'}會導致將"onJsonPLoad=?"傳給 伺服器。
jsonpCallback String
為jsonp請求指定一個回呼函數名。這個值將用來取代jQuery自動產生的隨機函數名。這 主要用來讓jQuery產生度獨特的函數名,這樣管理請求更容易,也能方便地提供回呼函數和錯誤處理。你也可 以在想讓瀏覽器緩衝GET請求的時候,指定這個回呼函數名。
以上幾個重要程式碼片段,重點是紅色字的 部分,要求跨域調用ajax要指定一個callback handler函數。
看了這麼多大家也一定是看膩了,直接 將上述的程式碼群組合。此段代碼在域:test.com中,現在要調用http://jks.com/JsTest.aspx進行ajax驗證。代 碼如下:
<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script src="js/jquery-1.4.1.js" type="text/javascript"></script> <script type="text/javascript"> function invokeRemoteMethod() { $.ajax({ url: 'http://jks.com/JsTest.aspx?type=invoke&method=add&time=' + Math.random(), type: 'get', dataType: 'jsonp', jsonp: "callback", data: '', success: function (data) { alert(data.msg); }, error: function (message) { alert(message); } }); } </script></head><body> <form id="form1" runat="server"> <div> <input type="button" id="but_invoke" value="調用" onclick="invokeRemoteMethod();" /> </form></body></html>