Typeahead.js 不显示下拉菜单

Posted

技术标签:

【中文标题】Typeahead.js 不显示下拉菜单【英文标题】:Typeahead.js not showing dropdown 【发布时间】:2014-02-07 20:47:58 【问题描述】:

我正在使用dataType:'jsonp'从远程位置获取源代码,如果我在 chrome 上看到开发人员工具,我会收到包含某些数据的响应,但预输入的下拉菜单从未出现。

这是我正在使用的代码:

$(document).ready(function()
$('#txtMedicamentos').typeahead(
    header:'<b>Medicamentos</b>',
    template:['<span>descripcionMedicamento</span>'].join(''),
    limit:10,
    minLength: 3,
    remote:
        url:'http://geofarma.pe/service/GetMedicamentos/%QUERY',
        filter: function(parsedResponse)
            console.log(parsedResponse);
            for (i = 0; i < parsedResponse.length; i++) 
                parsedResponse[i].value = parsedResponse[i].descripcionMedicamento;
                parsedResponse[i].tokens = new Array(parsedResponse[i].descripcionMedicamento);
            
            return parsedResponse;
        ,
        dataType: 'jsonp'
    ,
    engine:Hogan
);
);

演示:http://jsfiddle.net/XtLrH/

【问题讨论】:

这样的东西有用吗? jsfiddle.net/trevordowdle/XtLrH/2 使用以下小提琴作为参考.. jsfiddle.net/Sherbrow/p3wXs 有一次在使用 typeahead.js 时,我遇到了一个类似的问题,即窗口无法打开 - 原来这是一个 CSS 问题。如果下拉菜单显示为元素,请尝试检查 Chrome 调试器。 您解决了这个问题吗?正如我在回答中所说,这是一个跨域问题。 【参考方案1】:

我通过首先分支和修改你的 jsfiddle 来调查这个问题:

http://jsfiddle.net/Fresh/gYFDV/

当我运行此示例时,我遇到了您的问题,即即使远程请求返回有效的 JSON 数据,下拉菜单也不显示搜索结果。

当我搜索“TEST”时,我可以在浏览器控制台中看到返回的结果(在本例中为两条记录):

0: codigoMedicamento:16858, descripcionMedicamento:TESTOVIRON DEPOT 250mg/mL Inyectable,…
1: codigoMedicamento:17091, descripcionMedicamento:TESTONON Inyectable,…

但是,问题在于您的服务器返回的数据包含错误的 JSONP 请求响应标头:

Content-Type:application/json

由于这是一个跨域请求并且您正在返回 JSONP 数据,您应该将响应标头更改为:

Content-Type:application/javascript

(请参阅here 了解更多信息)

此外,完整的响应标头如下所示:

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Language:es-PE
Content-Type:application/json
Date:Thu, 23 Jan 2014 00:00:00 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive:timeout=5, max=100
Pragma:no-cache
Server:Apache
Transfer-Encoding:chunked

看起来也不正确的是“Expires”值;据此,响应数据于 1981 年到期!

因此,要解决此问题,您似乎需要修改服务调用(即http://geofarma.pe/service/GetMedicamentos),以便它在其响应标头中返回正确的 Content-Type。将 Expires 值设置为更新的值也是一个好主意。

【讨论】:

【参考方案2】:

由于您的请求是JSONP,您需要在您的网络服务器中处理jQuery添加的回调。

我尝试从您的网络服务器获取 JSONP,就像 jQuery 一样:

http://geofarma.pe/service/GetMedicamentos/QUERY?callback=jQuery2101169277074432582543968319604650201646145433_1390418575420&_=1390418575421

似乎网络服务器没有处理 JSONP 回调,所以 jQuery 没有得到预期的响应。

另外,如果您的前端和后端使用不同的域,您需要更改 JSONP 响应中的 Access-Control-Allow-Origin 标头。

【讨论】:

我该怎么做?我的意思是更改 jsonp 响应的标头 您使用什么语言? php JSONP callback example 和 PHP Access-Control-Allow-Origin Header

以上是关于Typeahead.js 不显示下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法关闭typeahead.js的下拉菜单?

Twitter Typeahead.js:单击/聚焦时显示所有选项

PHPCMS V9联动菜单下拉显示不全

下拉菜单选中后还是显示默认值

iOS仿微信、支付宝首页下拉菜单选择视图

sap 在下拉菜单自动显示历史记录