2015-03-24 83 views
1

爲什麼這會返回語法錯誤?即使響應是json,jquery + jsonp也會返回語法錯誤

http://jsfiddle.net/syng17fv/

jquery.jsonp https://github.com/jaubourg/jquery-jsonp

響應 http://cvrapi.dk/api?search=test&country=dk

$.jsonp({ 
    url : 'http://cvrapi.dk/api?search=test&country=dk', 
    success : function(json){ 
     console.log('success') 
    }, 
    error : function(){ 
     console.log('err') 
    } 
}); 

更新

這工作

$.ajax({ 
     type : 'GET', 
     dataType : 'jsonp', 
     url : '//cvrapi.dk/api?search=test&country=dk', 
     success : function(res){ 

     } 
    }); 
+0

[你檢查谷歌?](http://stackoverflow.com/questions/24311023/unexpected-token-colon-json-after-jquery- ajaxget) – 2015-03-24 21:39:41

+0

你有解決方案嗎? – clarkk 2015-03-24 21:56:26

+0

是的,他在這裏:http://stackoverflow.com/questions/24311023/unexpected-token-colon-json-after-jquery-ajaxget – rlemon 2015-03-24 21:58:10

回答

1

分析完該插件後,url = url.replace(/=\?(&|$)/ , "=" + successCallbackName + "$1");無法正常工作,因此無法使用make the jsonp callback,因此請添加一些函數以使其正常工作,或嘗試更改正則表達式以將回調添加到url。

嘗試用下面的代碼替換url = url.replace(/=\?(&|$)/ , "=" + successCallbackName + "$1");in the plugin

function addCallback(paramName, paramValue, url) { 

    if (url.indexOf(paramName + "=") >= 0) { 
     var prefix = url.substring(0, url.indexOf(paramName)); 
     var suffix = url.substring(url.indexOf(paramName)); 
     suffix = suffix.substring(suffix.indexOf("=") + 1); 
     suffix = (suffix.indexOf("&") >= 0) ? suffix.substring(suffix.indexOf("&")) : ""; 
     url = prefix + paramName + "=" + paramValue + suffix; 
    } else { 
     if (url.indexOf("?") < 0) 
     url += "?" + paramName + "=" + paramValue; 
     else 
     url += "&" + paramName + "=" + paramValue; 
    } 
     return url; 

} 

url = addCallback('callback', successCallbackName, url); 

Updated fiddle

4

您需要添加一個回調參數。我會解釋下面的原因。

沒有回調,JSONP調用不起作用。數據被加載到一個腳本標記中,如果代碼不是以方法調用的形式出現,則結果只是被丟棄的對象,並且永遠不會調用成功回調方法。

爲什麼[不使用回調]返回語法錯誤?

這是你的Ajax響應本質上是如何看起來像沒有回調(例如http://cvrapi.dk/api?search=test&country=dk):

<script> 
{"vat":11618405,"name":"TESTRUP ... (snip) 
</script> 

當然有在這個JavaScript語法錯誤! :)

這裏是回調(例如http://cvrapi.dk/api?search=test&country=dk&callback=callbackFunc)Ajax響應:

<script> 
callbackFunc({"vat":11618405,"name":"TESTR ... (snip) 
</script> 

現在,這是有效的JavaScript。在這個例子中,$.jsonpcallbackFunc()聯繫在一起,並且一切都與世界一致。


JSONP的核心要素,或 「JSON與填充」,是因爲這樣:

  1. 回調在網站上定義的函數。
  2. 通過標籤
    • 請求遠程API包括一個特殊的PARAM提供您的回調函數的名稱
  3. 響應:
    • 只是使用Javascript
    • 這包括:
      1. 函數調用,您在請求中指定的名稱
      2. 的論點是感興趣
    • JSON數據得到立即執行,就好像它是從你自己的域名叫

你和之間的回調安排服務器,結合 避免了同源限制,真是整個把戲JSONP

REF:So how does JSONP really work?Wikipedia: JSONP


更改您的JSON這樣的代碼。奇蹟般有效。注意添加了「回調」參數。 JSONP期望這一點。這是您編輯的jsfiddle:http://jsfiddle.net/Drakes/syng17fv/2/

REF:https://github.com/jaubourg/jquery-jsonp/blob/master/doc/TipsAndTricks.md

$.jsonp({ 
    url : '//cvrapi.dk/api?search=test&country=dk&callback=?', 
    success : function(json){ 
     console.log('success') 
    }, 
    error : function(){ 
     console.log('err') 
    } 
}); 
+0

嗨@clarkk,這個解釋確實解決了你的問題嗎?我希望這能滿足你的問題,如果是的話,你會不介意接受這個答案? – Drakes 2015-04-08 23:28:22

+0

您小提琴上的代碼http://jsfiddle.net/Drakes/syng17fv/2/返回'拒絕加載腳本'http://cvrapi.dk/api?search=test&country=dk&callback=_jqjsp&_1488820133245=',因爲它違反了以下內容安全策略指令:「script-src'self'https:// *'unsafe-inline''unsafe-eval'」'在沒有控制權的shopify環境中。 – 2017-03-06 17:10:48

1

似乎callback選項不起作用。只需添加回調參數使用默認值,以URL(_jqjsp

url : '//cvrapi.dk/api?search=test&country=dk&callback=_jqjsp', 
+0

我打了你2分鐘!但你也有一個敏銳的眼睛 – Drakes 2015-04-01 14:19:55

+0

回調工程。看看我提供的更新的JSFiddle – Drakes 2015-04-01 14:20:27

相關問題