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

jqueryui autocomplete not working/working depending on the domain identical JSONP is served from - why?

代码如下,直接取自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 类型,我在显示的页面、数据、源或 headers.

中看不出任何区别

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" 以启动它们尝试自动完成。

您不能在 php 中硬编码回调,除非您在请求中规定它是什么。

直接在浏览器中打开时,您在 php 中输出 jQuery1124009416418827878958_1479031851542(),但该名称是在实际请求期间根据时间戳动态生成的

jsonp 输出的标准是使用 $_GET['callback'],当您将数据类型设置为 [=31 时,jquery 会自动将查询参数添加到 url =]p.

在他们的演示中查看浏览器开发工具网络以查看用于确认的url。

所以你的非常基本的 php 代码看起来像

echo $_GET['callback'] . '(' . json_encode($output) .')';

我建议您改为实施 CORS,然后仅依赖 json 的服务。

使用 jsonp 的缺点是它是一个脚本请求而不是 XMLHttpRequest,并且它有错误处理限制