即使响应是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){ } });
您需要添加一个回调参数。 我将在下面解释原因。
没有回调,JSONP调用不起作用。 数据加载到脚本标记中,如果代码不是方法调用的forms,结果将只是一个被丢弃的对象,并且永远不会调用成功回调方法。
为什么[不使用回调]会返回语法错误?
这就是你的ajax响应在没有回调的情况下基本上是这样的(例如http://cvrapi.dk/api?search=test&country=dk ):
当然这个JavaScript中存在语法错误! 🙂
这是带回调的ajax响应(例如http://cvrapi.dk/api?search=test&country=dk&callback=callbackFunc ):
现在这是有效的JavaScript。 $.jsonp
在这个例子中调用callbackFunc()
,一切都是正确的。
JSONP的核心元素,或“带填充的JSON”,如下:
- 您网站上定义的回调函数。
- 通过标记对远程API的请求
- 包含一个特殊的参数,提供回调函数的名称
- 响应:
- 只是Javascript
- 这包括:
- 函数调用,您在请求中指定的名称
- 该论点是感兴趣的JSON数据
- 立即执行,就像从您自己的域中调用它一样
您和服务器之间的这种回调安排,结合避免同源限制,实际上是JSONP的全部技巧
REF: JSONP如何真正起作用? ,和维基百科:JSONP
像这样更改你的json代码。 奇迹般有效。 注意添加了“callback”参数。 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') } });
似乎callback
选项不起作用。 只需使用默认值( _jqjsp )将回调参数添加到url
url : '//cvrapi.dk/api?search=test&country=dk&callback=_jqjsp',
分析插件后, url = url.replace( /=\?(&|$)/ , "=" + successCallbackName + "$1" );
不能正常工作以make the jsonp callback
所以添加一些function使其工作,或尝试更改正则表达式将回调添加到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);
更新小提琴