jqueryui自动完成不工作/工作取决于域提供相同的JSONP - 为什么?

时间:2016-11-13 15:40:05

标签: jquery autocomplete jsonp

代码如下,直接取自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"进入要么开始试图自动完成。

1 个答案:

答案 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而且它有错误处理限制