2012-05-21 1 views
1

Получение некоторого нечетного поведения из пользовательского поиска Google, которое я не могу представить. Возможно, у кого-то есть ключ.Пользовательский поиск Google - ручная загрузка/выполнение из параметров url

Я собираю сайт Magento, который имеет собственную внутреннюю поисковую систему, но ограничен только продуктом. Я хочу также выполнить пользовательские результаты поиска Google на странице результатов поиска. Я полагаю, что я должен быть в состоянии просто выполнить поиск на основе запроса вары в URL (чтобы вернуть все содержимое без продукта), как таковой:

 <section style="min-height:600px"> 
      <div style="background-color:#DFDFDF; min-height:800px; width:100%;"> 
       <div id="cse">Loading</div> 
      </div> 
     <script src="http://www.google.com/jsapi" type="text/javascript"></script> 
     <script type="text/javascript"> 
     //<![CDATA[ 

      $(document).ready(function(){ 
       console.log('search initiated'); 
       var t = window.setTimeout(function(){ customSearch(); }, 5000); 
      }); 

      function customSearch(){ 
       var q = urlParams()['q']; 
       if (q != undefined && q != ""){ 
        console.log('q : %s', q); //outputs successfully 

        google.load('search', '1'); 
        google.setOnLoadCallback(function() { 
         var customSearchControl = new google.search.CustomSearchControl(MY CUSTOM ID KEY); 
         var cseDrawOptions = new google.search.DrawOptions(); 
         cseDrawOptions.setAutoComplete(true); //unknown if this is required... 
         customSearchControl.draw('cse',cseDrawOptions);      
         customSearchControl.execute(q); 

        }, true); 

       } 
      } 

      function urlParams(){ 
        var vars = []; 
        var hash; 
        var index = window.location.href.indexOf('?'); 
        if(index != -1){ 
         var hashes = window.location.href.slice(index + 1).split('&'); 
         for(var i = 0; i < hashes.length; i++){ 
          hash = hashes[i].split('='); 
          vars.push(hash[0]); 
          vars[hash[0]] = hash[1].replace(/\+/g, " "); 
         } 
        } 
        return vars; 
       } 

     //]> 
     </script> 
     </section> 

Замечу, что я вытащил все другой контент из логики (но его реализация в пурпуре идентична).

Итак, поведение выглядит следующим образом: страница загружается отлично (я задерживаю поиск Google с тайм-аутом для целей тестирования). Предполагая, что в url есть запрос var, консоль отслеживает, как ожидалось. Затем страница просто обрывается, без контента из Google. «Уничтожено» ... означает, что все элементы на странице исчезают или переписываются на новую страницу, загружаемую Google. Как будто элемент управления поиска не создает iframe - его просто заменяет страницу страницей -less html.

Я подготовил ряд статей по этому вопросу и перешел через API - этот код выглядит так, как будто он должен работать. Но ясно, что нет.

Что мне не хватает?

Приветствия -

UPDATE

Продолжение возни с этим было установлено, что по какой-либо причине:

google.load('search', '1'); 
google.google.setOnLoadCallback(console.log('loaded')) 

Была причина замененного выпуска страницы. На странице с ответами содержались ссылки на модуль поиска, который размещается в google. И если я вручную связаны эти файлы (воздерживаясь в google.load), то я мог бы запустить поиск, как ожидалось:

<script src="http://www.google.com/jsapi" type="text/javascript"></script> 
<script src="http://www.google.com/uds/?file=search&v=1" type="text/javascript"></script> 
<script type="text/javascript"> 
//<![CDATA[ 
    ... search logic 

Тогда я нашел альтернативный синтаксис на google developers страницу, которая, казалось, работать, как ожидалось:

$(document).ready(function(){ 
     google.load("search", "1", {"callback" : customSearch}); 
    }); 

    function customSearch(){ 
     var q = urlParams()['q']; 
     if (q != undefined && q != ""){ 
      var cseControl = new google.search.CustomSearchControl('MY CUSTOM KEY'); 

      var cseDrawOptions = new google.search.DrawOptions(); 
      cseDrawOptions.enableSearchResultsOnly() 
      cseControl.draw('cse', cseDrawOptions); 
      cseControl.execute(q); 
     } 
    } 

Работает должным образом. Только реальная проблема на данный момент является хозяином

Unsafe JavaScript attempt to access frame with URL http://mydomain from frame with URL http://www.google/cse?...

что сейчас выкинут.

Я не знаю, как две разные версии синтаксиса загрузки меняют что-то ... но это казалось. В любом случае, я не знаю, как разрешить эти ошибки перекрестных доменов.

Мысли были бы замечательными.

+0

Связанные: http://stackoverflow.com/questions/2298027/pass-variable-to-google-custom-search-engine –

ответ

0

Nothin huh?

Ну, я в основном разработал хорошее решение, используя альтернативный метод, который, я думаю, будет более гибким в долгосрочной перспективе.Использование Googles RESTful API и простой JQuery .ajax вызов, я могу получить хорошие, контролируемые результаты без ошибок междоменных:

<div id="cse">Loading</div> 
<script> 
    //https://developers.google.com/custom-search/v1/getting_started 
    //https://developers.google.com/custom-search/v1/using_rest#query-params 
    //https://developers.google.com/custom-search/v1/cse/list 

    var _url = "https://www.googleapis.com/customsearch/v1"; 
    var _key = 'AIzaSy... your api key here'; 
    var _cx  = '001809... your engine id'; 
    var _q  = urlParams()['q'];       //query param 

    jQuery(document).ready(function() { 

     $j.ajax({ 
      url  : _url, 
      type : 'GET', 
      dataType : 'jsonp', 
      data :{ 
       key : _key, 
       cx : _cx, 
       q :_q 
      }, 
      success  : function(data, textStatus, jqXHR){ responseHandler(data); }, 
      error  : function(jqXHR, textStatus, errorThrown){ console.log('error: %s'), errorThrown}, 
      beforeSend : function(){ console.log('sending request')}, 
      crossDomain : true 
     }); 

    }); 

    function responseHandler(response, status) { 
     console.log(response); 

     var cse = $j('#cse'); // render vars as needed... 
     for (var i = 0; i < response.items.length; i++) { 
      var item = response.items[i]; 
      cse.append("<br>" + item.htmlTitle); 
     } 
    } 

    function urlParams(){ 
     var vars = []; 
     var hash; 
     var index = window.location.href.indexOf('?'); 
     if(index != -1){ 
      var hashes = window.location.href.slice(index + 1).split('&'); 
      for(var i = 0; i < hashes.length; i++){ 
       hash = hashes[i].split('='); 
       vars.push(hash[0]); 
       vars[hash[0]] = hash[1]; 
      } 
     } 
     return vars; 
    } 

</script> 

И вы можете тоже; D

Приветствие