1. 程式人生 > >jQuery-JSONP 外掛跨域呼叫功能(Uncaught SyntaxError: Unexpected token : 出錯原因解釋)

jQuery-JSONP 外掛跨域呼叫功能(Uncaught SyntaxError: Unexpected token : 出錯原因解釋)

外掛介紹:眾所周知,使用ajax直接發起請求存在跨域無許可權訪問的問題,這時候,需要使用jsonp協議(非官方的協議)處理,jQuery中的$.ajax方法也直接支援使用該協議進行跨域訪問。下面首先介紹使用jQuery的$.ajax方法進行跨域訪問,然後再介紹使用其它jQuery外掛(jQuery-JSONP)實現樣的功能。

1、新建一個jsp頁面,加入一段js程式碼內容如下:

<script type="text/javascript">    
function ajaxtest() {    
$.ajax({    
   url:'http://192.168.10.111/demo/testjson',    
   data:{rel:13},    
   dataType:"jsonp",    
   jsonp:"callback",    
   jsonpCallback:"success_jsonp",    
   timeout:3000,    
   dataFilter:function(json){    
       console.log("jsonp.filter:"+json);    
       return json;    
   },    
   success:function(json,textStatus){    
       console.log("jsonp.success:"+json.name);    
   },    
   error:function(XMLHttpRequest,textStatus,errorThrown){    
       console.log("jsonp.error:"+textStatus);    
   }    
});    
}    
</script>   


再新增一個按鈕用來測試該js方法,如下:

<input type="button" value="ajaxtest" onclick="ajaxtest()"/>  

說明:當點選 ajaxtest 按鈕時,就會發起一個請求,由url、dataType、jsonp等引數可知,ajax使用jsonp協議向 http://192.168.10.111/demo/testjson 這個地址發起請求,並自動在url後追加callback引數,實際請求的url地址應為:http://192.168.10.111/demo/testjson?rel=13&callback=success_jsonp,請求超時時間為3秒,接收的資料為json格式字串。如果成功接收到遠端方法返回的json資料並且格式正確的話,首先會進入dataFilter方法(你可以在這個方法內對返回的json資料進行預處理,比如過濾、更改json資料等),然後進入success方法;如果請求失敗或者返回的json資料格式不正確的話會直接進入error方法。

那麼服務端的testjson方法應該返回什麼樣的資料呢?直接返回json物件或json字串是不對的!還需要在之前加上請求時傳過來的callback的引數值,後臺(以servlet為例)應類似如下處理:

public void testjson(HttpServletRequest request, HttpServletResponse response) {  
    String callback = (String)request.getParameter("callback");  
    String jsonData = "{\"id\":\"3\", \"name\":"zhangsan", \"telephone\":"13612345678"}";//為了演示效果,json資料是寫死的  
    String retStr = callback + "(" + jsonData + ")";  
    response.getWriter().print(retStr);  
}  

這樣後臺響應的的資料實際為:success_jsonp({"id":"3", "name":"zhangsan", "telephone":"13612345678"})    其中success_jsonp取決於ajax引數值的設定,如果未設定,jQuery將會自動生成一個名字作為callback的引數值。總之,後臺只需request接收parameter後,動態拼接callback變數的值就可以了。

如果返回的資料格式不按上述講的這樣,請求就會失敗並直接進入ajax的error方法。像 Uncaught SyntaxError: Unexpected token : 類似這種錯誤就是返回的json資料沒用“(”和“)”小括號包起來或者前面沒加callback值而引起的

跨域呼叫功能除了用Query的$.ajax方法可以實現外,網路上還有其它眾多的jQuery外掛可以完成,下面就來看一下使用jQuery的jsonp外掛來進行跨域呼叫:

<script type="text/javascript" src="jquery.jsonp.js"></script>  
<script type="text/javascript">  
function jsonptest(){  
$.jsonp({  
   url:'http://192.168.10.111/demo/testjson',  
   data:{rel:13},  
   callbackParameter:"callback",  
   timeout:3000,  
   dataFilter:function(json){  
    console.log("jsonp.filter:"+json.name);  
    json.name = "測試123435";  
return json;  
},  
   success:function(json,textStatus,xOptions){  
       console.log("jsonp.success:"+json.name);  
   },  
   error:function(xOptions,textStatus){  
    console.log("jsonp.error:"+textStatus+", rel="+xOptions.data.rel);  
   }  
});  
} 

再新增一個按鈕用來測試該js方法,如下:

<input type="button" value="jsonptest" onclick="jsonptest()"/>  

說明:點選jsonptest按鈕後,控制檯打印出來的效果和使用$ajax方法時的基本一致,不同的是dataFilter方法:雖然二者都提供了dataFilter方法,但$.jsonp的dataFilter中資料已經直接轉換成json物件了,而$.ajax的dataFilter中獲取的卻是原生的帶callback方法名的json字串(測試時控制檯打印出來的是undefined)。如果需要對返回的資料做預處理的話,建議使用jQuery-JSONP外掛的$.jsonp方法

前面介紹了用servlet編寫testjson方法,假設你對nutz框架(http://code.google.com/p/nutz/)熟悉的話,下面貼出使用nutz框架編寫testjson方法:

@At("/testjson")  
@Ok("raw")  
public String testjson(HttpServletRequest req, String callback, String rel) throws Exception {  
    Map<String, String> jsonMap = new LinkedHashMap<String, String>();  
    jsonMap.put("id", "3");  
    jsonMap.put("name", "zhangsan");  
    jsonMap.put("telephone", "13612345678");  
    jsonMap.put("rel", rel);  
    String jsonp = callback + "(" + Json.toJson(jsonMap) + ")";  
    return jsonp;  
}  

注意:如果你在MainModule中設定了全域性的返回型別為json的話(@Ok("json")),那麼testjson方法上需要加上@Ok("raw")註解,不做解釋,不明白可以看nutz官方文件。

相關推薦

jQuery-JSONP 外掛呼叫功能Uncaught SyntaxError: Unexpected token : 出錯原因解釋

外掛介紹:眾所周知,使用ajax直接發起請求存在跨域無許可權訪問的問題,這時候,需要使用jsonp協議(非官方的協議)處理,jQuery中的$.ajax方法也直接支援使用該協議進行跨域訪問。下面首先介紹使用jQuery的$.ajax方法進行跨域訪問,然後再介紹使用其它jQ

Nutz 框架下 測試 jQuery-JSONP 外掛呼叫功能Uncaught SyntaxError: Unexpected token : 出錯原因解釋

注:本文歡迎轉載,以下為本人親測,轉載請註明:http://blog.csdn.net/wqmain/article/details/8905287 外掛介紹:眾所周知,使用ajax直接發起請求存在跨域無許可權訪問的問題,這時候,需要使用jsonp協議(非官方的協議)處理

jsonp請求報錯Uncaught SyntaxError: Unexpected token :

jsonp跨域請求報錯Uncaught SyntaxError: Unexpected token :遇到就記錄一下: 通過自己不斷倒騰和看別人的部落格,總結如下: 前端程式碼: <div class="container"> <p>更新資訊</p&

使用jQuery+JSONP獲取資源

對於經常用jQuery的開發者來說,能注意到jQuery封裝的$.ajax中有一個dataType屬性,如果將該屬性設定成dataType:"jsonp",就能實現JSONP跨域了。需要了解的一點是,雖然jQuery將JSONP封裝在$.ajax中,但是其本質與$.aja

Struts2使用jQuery JSONP解決問題

http://www.darrenfang.com/2013/12/jquery-jsonp-in-struts2/ 在專案中需要新增一個數據分析模組,為了不影響現有業務,需要在另一臺伺服器上面進行相應的分析。首先想到的就是將分析 結果儲存為JSON格式,頁面通過AJ

jquery處理ajax問題方法

2.XHR2 HTML5中提供的XMLHTTPREQUEST Level2(及XHR2)已經實現了跨域訪問。但ie10以下不支援 只需要在服務端填上響應頭: ? 1 2 3 header("Access-Control-

jsonp Uncaught SyntaxError: Unexpected token : 的問題

在使用 JSONP 進行跨域請求的時候,可能會遇到一個很苦惱的問題,那就是明明伺服器返回的 JSON 資料格式沒有任何問題,可為什麼就是會報錯呢????就是下面這貨: Uncaught SyntaxError: Unexpected token : 原因很簡單,可以理解為其實 JSO

ajax訪問-jsonp報錯:Uncaught SyntaxError: Unexpected token":"or"

ajax請求: $.ajax({ url: "http://10.0.14.186:8080/user/userAction_addUser", type: "post", dataType: 'jsonp',

Ajax訪問出現Uncaught SyntaxError: Unexpected token : 解決方案

在訪問外網提供的Api時出現跨域問題,嘗試使用普通方式JSONP解決,但是出現Uncaught SyntaxError: Unexpected token : 的錯誤,所有專注於研究ajax請求跨域問題,在前人基礎上逐漸理出脈絡,以此記之,希望對大家有所幫助。蒐羅資源比較雜亂,所有看到“

加入支援後ajax請求返回Uncaught SyntaxError: Unexpected token :

本來正常的程式碼,加入跨域支援dataType: 'JSONP', $.ajax({//contenType: "application/x-www-form-urlencoded",             type: "GET",             dataTyp

jquery中的jsonp呼叫介面

                                            &

【練習】angularjs最基本的$http使用jsonp,使用jsonp獲取天氣採用百度地圖天氣api,路由功能實現單頁面不跳轉切換

1.最基本的$http使用jsonp跨域 <body ng-app="app"> <div ng-controller="controller"> </div> <script src="angularjs/angularjs.js

jquery jsonp呼叫介面

注意:呼叫後進error一般都是返回的資料格式問題 $.ajax({ url: "url", data: { }, dataType: "jsonp", jsonp: "callback", //傳遞給請求處理程式或頁面的,用以獲得jsonp回撥函式名

解決jquery ajax在訪問post請求的時候,ie9以下無效包括ie9的問題

jquery src actor div tick 屬性 dex 啟用 logs 最近在做項目的時候遇到一個問題,就是跨域請求ajax的時候ie9以下的瀏覽器不可以訪問,直接執行error裏面的代碼,但是也不報錯,就上網查了查,發現了一個很好用的方法,在這裏記錄一下,也希望

資源請求jsonp以外的方法

ive 默認 發現 情況下 coff 瀏覽器 過程 -i link -------------------------------------------------------------------------------------------------

js和jquery使用jsonp解決

跨域 理解跨域首先必須要了解同源策略。同源策略是瀏覽器上為安全性考慮實施的非常重要的安全策略。 何謂同源: URL由協議、域名、埠和路徑組成,如果兩個URL的協議、域名和埠相同,則表示他們同源。 由於同源策略,而且隨著網際網

jQuery使用JSONP實現獲取資料的三種方法詳解

本文例項講述了jQuery使用JSONP實現跨域獲取資料的三種方法。分享給大家供大家參考,具體如下: 第一種方法是在ajax函式中設定dataType為'jsonp' $.ajax({ dataType: 'jsonp', url: 'http://www.a

Spring MVC jsonp呼叫 中文亂碼問題處理

一、問題描述 最近專案中使用了Spring MVC開發了一個api介面伺服器,介面呼叫要求需支援jsonp跨域形式呼叫。在自己開發和測試過程中未發現有中文亂碼問題,因為是在瀏覽器中直接輸入url方式進行呼叫,應答回來的都是正常的中文;但當前端呼叫介面使用時,就出現中文亂碼

如何使用jQueryjsonp解決問題

1.關於jsonp為什麼能解決跨域問題可網上自行搜尋。 此處給兩個個我認為寫的比較明白的部落格 http://www.cnblogs.com/lemontea/archive/2012/12/11/2812268.html http://www.nowamagic.net/

JQuery Ajax呼叫和非呼叫的問題

        現在的網際網路技術發展的越來越快,我們在開發過程中遇到的問題也越來越多。比如當我們需要進行跨域訪問資料的時候該如何進行開發?本篇博文就記述如何使用Ajax進行跨域訪問呼叫資料。