代码如下,直接取自jqueryui自动完成示例。唯一的变化就是它从我自己的网站上获取JSONP,除了在寻找回应的同时留在小旋转器上什么都不做。
$( "#birds" ).autocomplete({
source: function( request, response ) {
$.ajax( {
url: "http://www.galaxygraphics.co.uk/fresnius_jsonp.php",
dataType: "jsonp",
data: {
term: request.term
},
success: function( data ) {
response( data );
}
} );
},
minLength: 3,
select: function( event, ui ) {
log( "Selected: " + ui.item.value + " aka " + ui.item.id );
}
} );
如果我将JSONP的来源更改为
url:" https://jqueryui.com/resources/demos/autocomplete/search.php",
..然后一切正常。所以问题是,在jqueryUI示例中提供的JSONP和我自己的页面的JSONP之间有什么不同?两者都作为text / html mime类型提供,我看到在显示的页面,数据,源代码或标题中都没有任何差异。
https://jqueryui.com/resources/demos/autocomplete/search.php,=好的 http://www.ggfxserve.co.uk/fresnius/fresnius_jsonp.php,=不行,即使相同。
如果您想使用自动填充表单进行测试以查看其是否正常运行: -
http://www.ggfxserve.co.uk/fresnius/autocomplete.html =正在工作 http://www.ggfxserve.co.uk/fresnius/autocomplete2.html =无效。输入" com"进入要么开始试图自动完成。
答案 0 :(得分:1)
你不能在php中对回调进行硬编码,除非你规定它在请求中的含义。
直接在浏览器中打开时,您在php中输出jQuery1124009416418827878958_1479031851542()
,但该名称是在实际请求期间根据时间戳动态生成的
jsonp输出的规范是使用$_GET['callback']
,当你将dataType设置为jsonp时,jquery会自动将查询参数添加到url。
在他们的演示中查看浏览器开发工具网络,查看用于确认的URL。
所以你的基本PHP代码看起来像
echo $_GET['callback'] . '(' . json_encode($output) .')';
我建议你改为实现CORS,然后只依赖于json。
使用jsonp的缺点是脚本请求不是XMLHttpRequest而且它有错误处理限制