代码之家  ›  专栏  ›  技术社区  ›  skyfoot

jquery自动完成json-ajax与谷歌搜索设备的跨浏览器问题

  •  1
  • skyfoot  · 技术社区  · 15 年前

    我正在搜索表单上实现jquery自动完成,并从Google Search Appliance自动完成建议服务获得建议,该服务返回json中的结果集。

    我要做的是,当用户在搜索框中键入内容时,转到GSA获取建议。

    获取JSON建议的URL如下:

    http://gsaurl/suggest?q=<query>&max=10&site=default_site&client=default_frontend&access=p&format=rich
    

    返回的JSON如下:

    { "query":"re", "results": [ {"name":"red", "type":"suggest"}, {"name":"read", "type":"suggest"}] }
    

    jquery自动完成代码如下:

    $(#q).autocomplete(searchUrl, {
    width: 320,
    dataType: 'json',
    highlight: false,
    scroll: true,
    scrollHeight: 300,
    parse: function(data) {
     var array = new Array();
    
     for(var i=0;i<data.results.length;i++)
     {
      array[i] = { data: data.results[i], value: data.results[i].name, result: data.results[i].name };
     }
    
     return array;
    },
    formatItem: function(row) { 
     return row.name;
    }
    

    (});

    这在IE中有效,但在firefox中失败,因为parse函数中返回的数据为空。 你知道为什么会这样吗?

    解决办法

    我创建了一个ASPX页面来调用GSA建议服务并从建议服务返回JSON。使用此页面作为代理,并将其设置为jquery自动完成中的URL,这在IE和火狐中都有效。

    3 回复  |  直到 15 年前
        1
  •  3
  •   skyfoot    15 年前

    解决办法

    我创建了一个ASPX页面来调用GSA建议服务并从建议服务返回JSON。使用此页面作为代理,并将其设置为jquery自动完成中的URL,这在IE和火狐中都有效。

    代理代码

    string responseText;
    
                try
                {
                    Uri gsaUrl = new Uri(GetSuggestUrl());
    
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(gsaUrl);
                    request.ContentType = "application/x-www-form-urlencoded";
                    request.Method = WebRequestMethods.Http.Get;                
    
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    Stream responseStream = response.GetResponseStream();
                    StreamReader streamReader = new StreamReader(responseStream);
    
                    responseText = streamReader.ReadToEnd();
    
                }
                catch(Exception e)
                {
                    throw new Exception(e.Message, e.InnerException);
                }           
    
                string json = responseText;
                Response.Clear();
                //Response.ContentType = "application/json; charset=utf-8";
                Response.Write(json);
    
            }
    
            private string GetSuggestUrl()
            {
                string url = "http://<GSA>/suggest";
                string query = HttpContext.Current.Request.QueryString["q"];
                int max = 10;
                string site = "site";
                string client = "client";
                string access = "p";
                string format = "rich";
    
                return string.Format("{0}?q={1}&max={2}&site={3}&client={4}&access={5}&format={6}", url, query, max, site, client, access, format); 
            }
    
        2
  •  0
  •   Michael Cizmar    13 年前

    从6.10和6.14开始,GSA将返回用JSONP编码的建议。我以前写过一段时间 here .我有一个帖子的更新,将告诉你如何做到现在没有代理。

        3
  •  0
  •   Sandeep    12 年前

    使用GSA-Servele和JQuery—Java完成代码

    可以使用servlet gsaproxyservlet.java使用axishtp创建代理。

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
            IOException {
        // TODO Auto-generated method stub
        Object responseText = null;
        PrintWriter out = response.getWriter();
        try {
            responseText = generateResponce(request, response);
    
            response.setContentType("text/json");
            response.setHeader("Cache-Control", "no-cache");
            out.print(responseText);
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            out.close();
        }
    }
    
    private String generateResponce(HttpServletRequest request, HttpServletResponse response) {
        String responseStr = null;
    
        try {
            String q = (String) request.getParameter("q");
            String ulrStr = getSuggestUrl(q);
    
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet getRequest = new HttpGet(ulrStr);
            getRequest.addHeader("accept", "application/json");
    
            HttpResponse response1 = httpClient.execute(getRequest);
    
            if (response1.getStatusLine().getStatusCode() != 200) {
                throw new RuntimeException("Failed : HTTP error code : " + response1.getStatusLine().getStatusCode());
            }
    
            BufferedReader br = new BufferedReader(new InputStreamReader((response1.getEntity().getContent())));
    
            System.out.println("Output from Server .... \n");
            String tmp = null;
            while ((tmp = br.readLine()) != null) {
                System.out.println(tmp);
                responseStr = tmp;
            }
    
            httpClient.getConnectionManager().shutdown();
    
            System.out.println("Output# " + responseStr);
    
        } catch (Exception e) {
            System.out.println(e);
        }
        return responseStr;
    }
    
    private String getSuggestUrl(String query) {
        String url = "http://GSA-URL/suggest?";
        String site = "max=10&site=all&client=my_frontend&format=rich";
        return url + site + "&q=" + query;
    }
    

    ** * ** * ** * ** * *** jQuery代码 * ** * ** * ** * ** * ** * ** * ***

    $("#q").autocomplete({
            source : function(request, response) {
                $.ajax({
                    url : "GSAProxyServlet",
                    dataType : "json",
                    data : {
                        q : request.term
                    },
                    success : function(data) {
                        response( $.map( data.results, function( item ) {
                            return {
                              label: item.name ,
                              value: item.name
                            }
                        })); 
                    },
                    failure : function(data) {
                        alert("error");
                    },
                    parse: function() {
                        alert("parse");
                    },
                });
            },
    
    推荐文章