1

我正在尝试复制它,http://jqueryui.com/demos/autocomplete/#remote-jsonp。只是,我不想查询 geonames.org 服务器,而是查询我自己的服务器。麻烦的是,该教程没有提到任何关于地理名称的内容。

我试图抓住它并抓住 $_POST 变量,但我想我不明白 ajax 正在传递什么。$_POST['name_startsWith'] 不存在,这似乎正在传递。谁能告诉我发送的信息是什么样的?

此外,本教程是关于 jsonp,而不是 json。这有多重要?

4

6 回答 6

2

jsonp仅用于对外部服务器的请求(跨源)。返回的是JSON该调用的对象。

如果您向自己的服务器发出请求,只需使用带有Content-Type: application/json. 查看演示远程数据源远程缓存。那些可能更适合你的盟友。

于 2012-06-21T20:52:06.067 回答
2

JSONP 与 JSON 完全不同。正如其他人所说,JSONP 是一个跨服务器。

JSON 是从您自己的服务器获取数据的更好方法,并且更容易在所有浏览器中进行翻译和工作。

返回的是一个item数组,相对格式为:

[{label: '', description: ''}, { //etc }]

标签用作显示名称,除非您带回额外的数据(如 ID),否则它将是用于在自动完成中选择项目的唯一数据。

使用诸如select您可以使用的函数ui.item.id(id 将与上面定义的数组一起返回)并使用它从列表中选择唯一的项目,以执行进一步的 AJAX 函数。

编辑:

要使用 pass-backed vars 来更改菜单的显示,您需要编写自己的displayMenuItem函数来利用上面定义的数组中的 vars。

进一步编辑:

他们实际上这样做的方式是双向的。远程服务器只是传回一个回显的 JSON 格式数组,就像上面定义的那样,没有别的(除了标题)。之后,JQuery 只是对数组进行排序并填充数据。

所以在 PHP 中这样做的一个例子:

echo json_encode(array('name' => 'whoop'));

从字面上看,这就是远程服务器端...

再次编辑我忘记了用 JSONP 发送的回调

于 2012-06-21T20:57:39.737 回答
1

使用 Firefox 和一个名为 Firebug 的插件。使用“网络”视图面板。

我看到以下数据正在传递:

_            1340311947284
callback    jQuery17206118978844942496_1340311935530
featureClass    P
maxRows 12
name_startsWith atlanta
style   full

请求的 URL 就是这个。在那里你可以看到 JSON 是如何形成的。

于 2012-06-21T20:54:30.187 回答
1

一些基本规则可以帮助您开始编写自己的 JSON 服务:

  • 如果您希望其他网站能够使用您的数据,那么您需要实现 JSONP;否则 JSONP/JSON 都可以使用。JSONP 机制规避了同源策略的问题。

  • 如果您希望其他网站能够使用您的数据,那么您的脚本应该通过查询字符串接受参数;查询字符串和表单变量都可以以其他方式使用。

  • 对于 JSON 请求,您的服务器需要发出 JSON 编码的数据。数据必须与内容类型一起发送application/json。示例 PHP 代码:

header("Content-type: application/json");
echo json_encode(array("foo" => "bar"));
// {"foo":"bar"}
  • 对于 JSONP 请求,您的服务器需要发出包含在 JavaScript 函数调用和内容类型中的 JSON 数据text/javascript。示例 PHP 代码:
header("Content-type: text/javascript");
echo "callback(";
echo json_encode(array("foo" => "bar"));
echo ");";
// callback({"foo":"bar"});
  • 您通常从 GET/POST 变量中获取回调函数的名称,而不是硬编码。

  • 在实践中,JSONP 请求是使用<script src>标签生成的;而 JSON 请求是使用 XML HTTP 请求发出的。

于 2012-06-21T21:09:28.653 回答
1

这可能是您正在寻找的地理名称的文档:http ://www.geonames.org/export/geonames-search.html

如果您尝试其中一个示例链接,您应该会看到一个geonames元素列表。除其他外,每个都包含属性:和name,这就是本示例中显示的内容。adminName1countryName

jsonp如果您从另一台主机请求数据,而不是提供您的页面的主机,这一点很重要。如果你打算调用自己的服务,你可以使用简单json

于 2012-06-21T20:58:14.737 回答
1

JSON 与 JSONP

JSON 和 JSONP 之间的区别在于 JSON 如何从服务器返回。使用常规 JSON,服务器会以其标准响应格式返回纯 JSON。使用 JSONP,服务器返回一个 javascript 文档,其中包含一个函数调用,其中 JSON 数据传递给您发送到服务器的函数名称。

从服务器返回的示例 JSON

JSON:{名称:数据}

JSONP:函数名称({名称:数据});

何时使用 JSONP 与 JSON

从 www.name.com 到 www.other.com 的查询使用 JSONP。

从 www.name.com 到 www.name.com 的查询使用常规 JSON。

自动完成插件

关于您的其他问题,自动完成插件发送的变量作为 GET 变量发送,因此请使用:$_GET['name_startsWith'] 或 $_REQUEST['name_startsWith']。(REQUEST 将检查 GET 和 POST)。

于 2012-06-21T21:02:11.297 回答