ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript-通过Greasemonkey实施Google Custom Search API

2019-12-09 22:37:12  阅读:308  来源: 互联网

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


我想用Greasemonkey实现Google自定义搜索API,到目前为止,我的试用大多失败了.该代码的目标是将自定义搜索框注入到现有站点中(我正尝试在MATLAB的文档页面中执行此操作,但注入的代码实际上应可在任何站点上使用).我尝试了网上搜索建议的许多方法(大多数与Greasemonkey中的JQuery或Google语言api的实现有关),但没有一种方法可用于自定义搜索api.

我认为可变范围可能存在一些问题,但是请让我知道是否有人对它起作用有任何建议…

// Inject the Google API loader script
var script = document.createElement('script'); 
script.src = 'http://www.google.com/jsapi?callback=gLoaded';  // Call gLoaded() when google api loader is ready.
script.type = "text/javascript"; 
document.getElementsByTagName('head')[0].appendChild(script); 

// Create the <div> tag for the search API to draw the search box
var elmBody = document.getElementsByTagName('Body')[0];
var gSearch = document.createElement('div');
gSearch.id = 'g_search';
elmBody.appendChild(gSearch);

// Let w be the shorthand for unsafeWindow under the Greasemonkey sandbox
var w = unsafeWindow;

// Load the search api using the Google API loader
w.gLoaded= function()
{ w.google.load('search','1', {"callback" : searchLoaded}); } ; // Run searchLoaded() when search API is ready

// Setup the custom search API and draw the search box
searchLoaded = function(){ 
google = w.google; // unsafeWindow
alert(google);                                   // :debug_1
alert(google.search);                            // :debug_2
alert(google.search.CurrentLocale);              // :debug_3
var mySearch= new google.search.CustomSearchControl('012907575288767046387:tuvzi3yqdkq');
alert(mySearch)                                  // :debug_4
mySearch.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET);
mySearch.draw('g_search');  // Draw the search box to the <div id='g_search'>
} 

> debug_1:返回有效的对象
> debug_2:返回有效的对象
> debug_3:返回有效的字符串(‘en’)
> debug_3:返回未定义
>同样,我尝试过让searchLoaded-> w.searchLoaded并删除了该语句(google = w.google),但在这种情况下,所有调试均未定义.

有趣的是,当我使用Javascript shell bookmarklet并通过命令行重新分配了功能gLoaded()和searchLoaded()与非Grasemonkey对应的功能时(没有涉及unsafeWindow),一切都按预期进行了.一个可爱的搜索框会显示它应该在的位置.

除了使它工作的任何建议外,我还在想…

> google.search.CurrentLocale为什么返回有效的字符串,而无法加载构造函数google.search.CustomSearchControl()?
>当我将searchLoaded分配为unsafeWindow.searchLoaded(请参阅上面的最后一条注释)时,即使默认情况下Google对象应位于窗口范围内,该函数也不再对它们可见.但是,当我在javascript shell下为函数分配这些非常相同的值时,一切正常!即使我已将函数明确定义在窗口范围内,Greasemonkey是否以某种方式屏蔽了这些变量?

我尝试了不同方案的变体(位置破解,@ required,google.setOnLoadCallback …),但是它们都不适合我.

请让我知道任何…我的意思是任何建议,我的想法已用尽…

谢谢!

解决方法:

基本上…

var script = document.createElement('script'); 
script.type = "text/javascript"; 
script.innerHTML = (<><![CDATA[

// YOUR CODE GOES HERE

]]></>).toString();
document.getElementsByTagName('head')[0].appendChild(script);

将代码编写为普通脚本,而不是GM脚本.
我的意思是,删除所有unsafeWindow引用和相关内容.
这将使脚本在正确的范围内运行.
发生问题是因为google.search.CustomSearchControl使用了GM范围中未定义的变量(例如J和K).

标签:google-search,greasemonkey,google-search-api,javascript
来源: https://codeday.me/bug/20191209/2097421.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有