将Typeahead与Google自定义搜索引擎结合使用

时间:2014-04-30 17:16:16

标签: jquery jsonp typeahead.js google-custom-search bloodhound

我正在努力让Twitter Typeahead + Bloodhound与Google的CSE合作。

到目前为止,我已经设法返回结果,但我无法计算出datumTokenizer。

var results = new Bloodhound({
  datumTokenizer: function(data) {
   return Bloodhound.tokenizers.whitespace(d.value)
  },
  queryTokenizer: Bloodhound.tokenizers.obj.whitespace,
  remote: {
    url: "http://clients1.google.com/complete/search?client=partner&hl=en&sugexp=gsnos%2Cn%3D13&gs_rn=25&gs_ri=partner&partnerid=004914516364918182382%3Ayfqw09r4qvu&types=t&ds=cse&cp=3&gs_id=15&q=%QUERY&callback=showResults&duffCallback=?",
    ajax: $.ajax({type:'GET',dataType:'jsonp',jsonp:'duffCallback'}),
    filter: showResults
  }
});

请参阅小提琴:http://jsfiddle.net/thugsb/3KAjh/

你会看到我从showResults()返回的结果是一个数组。但是,从filter:调用showResults()似乎没有做任何事情,因为删除该行没有任何效果。所以我不太确定发生了什么。

注意duffCallback是我通过阅读this question所做的工作。如果有更好的方法来完成这项工作我就全都耳朵了!

1 个答案:

答案 0 :(得分:7)

首先,您使用的datumTokenizer不太对劲。您需要将其更改为:

datumTokenizer: function(data) {
 return Bloodhound.tokenizers.whitespace(data.value)
}

注意" whitespace"函数现在引用"数据"输入参数而不是" d"你正在使用它。

至于问题的解决方案,请看它在这里工作(例如尝试搜索"田径"):

http://jsfiddle.net/Fresh/FYavC/

您的代码存在的主要问题是您的远程网址(这让我感到困惑!)。违规查询字符串参数为:

...&callback=showResults&duffCallback=?

" duffCallback =&#34?;不需要指定" datatype:'jsonp'"在ajax对象中自动添加jsonp请求使用的回调详细信息(即"?callback =?")。还有" callback = showResults"不需要,因为当成功发出jsonp请求时,Bloodhound框架会隐式调用filter方法。

我同意在使用Typeahead.js时应该如何进行远程调用并不明显。一个远程调用的例子,其中指定了ajax对象,并且一些文档在Typeahead.js网站上很有用!