2013-05-06 73 views
2

我想将Google搜索的自动完成/建议功能添加到HTML页面的输入中。使用Google建议使用JavaScript

如果我打开一个URL像这样与Firefox:

suggestqueries.google.com/complete/search?client=firefox&q=stacko&callback=abc 

它下载这样的文件:

["stacko",["stackoverflow","stackoverflowerror","stackoverflowexception","stackops","stackoverflow api","stackoverflow careers","stackoverflow java","stackoverflow deutsch","stackoverflow wiki","stackoverflow reputation"]] 

我怎样才能做到这一点在JavaScript?我想获得一个结果数组。

//编辑:这是我试过的代码:

var txtFile = new XMLHttpRequest(); 
txtFile.open("GET", "http://suggestqueries.google.com/complete/search?client=firefox&q=stacko&callback=abc", true); 
txtFile.onreadystatechange = function() { 
    text = txtFile.responseText; 
    alert(text); 
} 
txtFile.send(null); 

创建一个空的警报。

+2

您可以在输入元素上使用'onkeyup'和'onkeydown'等事件,验证输入,然后对'suggestqueries.google.com ...'URL进行ajax调用,解析响应并操作DOM以显示建议。任何时候你被困住了,**在这里发布你的代码**和问题描述,你的问题将在几分钟内解决:) – Ejaz 2013-05-06 20:59:41

+1

可能想查看[jQuery UI的自动完成](http:// jqueryui的.com /自动完成/)。 – Dom 2013-05-06 21:00:37

+0

@Ejay我的问题只是为了得到Google的建议。问题不在于UI。用这些建议来显示警报就可以了。 – Toast 2013-05-06 21:05:16

回答

6
function addScript(u){ 
    var s=document.createElement('script'); 
    s.src=u; 
    document.getElementsByTagName('*')[1].appendChild(s); 
} 


function getQueryWiki(term, callback){  
    var id="i"+Math.random().toString(36).slice(2); 
    getQueryWiki[id]=function(data){ callback(data); delete getQueryWiki[id];}; 
    addScript("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20json%20where%20url%3D%22http%3A%2F%2Fen.wikipedia.org%2Fw%2Fapi.php%3Faction%3Dopensearch%26search%3D"+ 
    encodeURIComponent(term)+ 
    "%26namespace%3D0%22%20&format=json&callback=getQueryWiki."+id); 
} 


function getQueryGoogle(term, callback){ 
    var id="i"+Math.random().toString(36).slice(2); 
    getQueryGoogle[id]=function(data){ callback(data); delete getQueryGoogle[id];}; 
    addScript("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20json%20where%20url%3D%22http%3A%2F%2Fsuggestqueries.google.com%2Fcomplete%2Fsearch%3Fclient%3Dfirefox%26q%3D"+ 
    encodeURIComponent(term)+ 
    "%22%20&format=json&callback=getQueryGoogle."+id); 
} 

//用法示例(谷歌):

getQueryGoogle("obam", function(d){ 
    alert(
    JSON.stringify(
      d.query.results.json.json[1].json, 
      null, 
      "\t" 
    ) 
); 
}); 

// displays: 

[ 
    "obama", 
    "obamacare", 
    "obama immigration", 
    "obama phone", 
    "obama gun control", 
    "obama immigration reform", 
    "obama impeachment", 
    "obama approval rating", 
    "obama net worth", 
    "obama speech" 
] 

//例2(维基百科)

getQueryWiki("obam", function(d){ 
    alert(
    JSON.stringify(
      d.query.results.json.json[1].json, 
      null, 
      "\t" 
    ) 
); 
}); 

//shows: 

[ 
    "Obama", 
    "Obama administration", 
    "Obamacare", 
    "Obama-Biden Transition Project", 
    "Obama, Fukui", 
    "Obama stimulus plan", 
    "Obama Line", 
    "Obama for America", 
    "Obama Domain", 
    "Obama Republican" 
] 
+0

这适用于我。是否有可能使用其他建议来源? – Toast 2013-05-06 21:39:51

+0

是的,我已经用另一个使用wikipedia而不是谷歌的例子更新了答案。 – dandavis 2013-05-06 21:50:05

+0

在yql查询中需要'encodeURIComponent(encodeURIComponent(term))'来处理需要在搜索词中进行编码的任何内容(如空格)。 – Dave 2016-04-09 20:19:39

1

不知道你会什么的但像@Ejay在他的评论说,你可以这样做:

var xhr = new XMLHttpRequest(); 

xhr.onreadystatechange = function(){ 
    if(xhr.readyState == 4){ 
     if(xhr.status == 200){ 
      //parse the response object 
      parse_the_text(xhr.responseText);  
     } 
    }else{ 
     return; 
    } 
} 

var url = "http://suggestqueries.google.com/complete/search?client=firefox&q=stacko"; 

xhr.open('Get', url, true); 
xhr.send(null); 

function parse_the_text(google_array){ 
    for(var i = 0; i < google_array[1].length; i++){ //this is dirty as it relies on response object never changing 
     alert(google_array[1][i]); 
    } 
} 

但我做了一些jsfiddle测试,并证实了dandavis说你不能Ajax请求到那个页面。

+0

'xhr.send();'产生'NS_ERROR_DOM_BAD_URI:访问受限的URI被拒绝的错误。 – Toast 2013-05-06 21:20:33

3

你可以使用这样的事情,它采用了谷歌搜索网址,结合YQLjQuery UI autocomplete

HTML

<div class="ui-widget"> 
    <input id="search" /> 
</div> 

的Javascript

$(function() { 
    $("#search").autocomplete({ 
     source: function (request, response) { 
      $.ajax({ 
       url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20json%20where%20url%3D%22http%3A%2F%2Fsuggestqueries.google.com%2Fcomplete%2Fsearch%3Fclient%3Dfirefox%26q%3D" + encodeURIComponent(request.term) + "%22&format=json", 
       dataType: "jsonp", 
       success: function (data) { 
        response(data.query.results.json.json[1].json); 
       } 
      }); 
     }, 
     minLength: 2 
    }); 
}); 

jsfiddle

我没有写所有在这里的香草jQuery的东西JavaScript,因此你可以使用它作为一个概念证明的时间。但说实话,这是我实际上使用jQuery和jQuery UI而不是重新发明轮子的时代之一。当然还有其他第三方库可以为你做类似的事情。而且,如上所述,您可以通过更改YQL搜索网址来为自动填充使用不同的来源。