我想用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'>
}
有趣的是,当我使用Javascript shell bookmarklet并通过命令行重新分配函数gLoaded()和searchLoaded()非Greasemonkey对应物(没有unsafeWindow关注)时,一切都按预期工作。一个可爱的搜索框显示它应该在哪里。
除了任何让它起作用的建议外,我还在想......
google.search.CurrentLocale如何返回有效字符串,无法加载构造函数google.search.CustomSearchControl()?
当我将searchLoaded指定为unsafeWindow.searchLoaded(请参阅上面的上一条注释)时,即使默认情况下它们应位于窗口范围内,该函数也不再显示该对象。但是,当我在javascript shell下分配函数那些非常相同的值时,一切正常! Greasemonkey是否以某种方式屏蔽了这些变量,即使我已将该函数明确定义为在窗口范围内?
我尝试了不同方案的变体(location hack,@ required,google.setOnLoadCallback ...),但它们都不适用于我。
请让我知道任何......我的意思是任何建议,我的想法已经用完......
谢谢!
答案 0 :(得分:3)
基本上...
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
使用了在J范围内未定义的J和K等变量。