Google WebSearch API自定义搜索会引发TypeErrors

时间:2015-10-28 17:37:11

标签: javascript google-search google-custom-search google-search-api

我们的网站上有一个自定义搜索栏,我注意到有时(9/10次)JS会抛出此错误,这会强制您搜索的内容无法呈现

  

www.googleapis.com/customsearch/v1element?key=AIzaSyCVAXiUzRYsML1Pv6RwSG1gu...oogle.com&callback=google.search.Search.apiary ####& nocache = 1446053383742:2

     

未捕获的TypeError:google.search.Search.apiary ####不是函数

抛出错误时搜索页面 Search page when error is thrown

搜索页面,其中包含错误截断/已解决 Search page when error is truncated or resolved

但是如果我要刷新或研究,这个错误就会被打破并且会呈现我的所有搜索。浏览完文件后,我发现他们所指的google.search.Search.apiary####只提了一次。所以我相信这个错误会在整个文件显示时截断整个文件。可能导致这种情况的原因是什么?修复它的选择是什么?

2 个答案:

答案 0 :(得分:10)

好吧,我偶然发现了一个答案: -

在做了一些研究之后,我发现this user on Google Forums也有同样的问题。

简单地说,它的工作方式是使用<script>生成搜索栏。

您的搜索栏中有此功能+ html元素

<script>
 (function() {
   var cx = '###';
   var gcse = document.createElement('script');
   gcse.type = 'text/javascript';
   gcse.async = true;
   gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
       '//cse.google.com/cse.js?cx=' + cx;
   var s = document.getElementsByTagName('script')[0];
   s.parentNode.insertBefore(gcse, s);
 })();
</script>

<gcse:searchbox-only resultsUrl="/search-results"></gcse:searchbox-only>

因此,我们在<div class="header">生成了一个HAML元素的栏,作为模板的一部分。因此它始终在每个标题中加载。由于我们有10个页面,因此每页生成一次相同的脚本。

我们的Google CSE会进行搜索,然后重定向到生成结果的网址/search-results

要生成结果,您需要此功能和HTML

<script>
     (function() {
       var cx = '###';
       var gcse = document.createElement('script');
       gcse.type = 'text/javascript';
       gcse.async = true;
       gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
           '//cse.google.com/cse.js?cx=' + cx;
       var s = document.getElementsByTagName('script')[0];
       s.parentNode.insertBefore(gcse, s);
     })();
    </script>

与我们的标题中加载的内容相同。 通过此设置,结果页面在加载时会调用<script>两次,并导致JS中断。因此,在删除<script>加载结果后,它停止抛出错误。

简而言之,只需确保您没有在结果页面上两次调用相同的function,并且应该清除Uncaught TypeError

<强>别。重复。自己

- 醚

答案 1 :(得分:1)

在我的情况下,我意外地在同一页面上重复了两次Google自定义搜索the form and script。一旦第二批被删除,它就会停止发出错误。