gpt4 book ai didi

javascript - 通过 Greasemonkey 实现 Google Custom Search API

转载 作者:行者123 更新时间:2023-11-29 10:54:23 26 4
gpt4 key购买 nike

我想用 Greasemonkey 实现 Google 自定义搜索 API,到目前为止,我的尝试大多以失败告终。该代码的目标是将自定义搜索框注入(inject)现有站点(我正在尝试为 MATLAB 的文档页面执行此操作,但注入(inject)的代码应该适用于任何站点)。我尝试了网上搜索建议的许多方法(主要与 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() 非 Greasemonkey 对应项(没有 unsafeWindow 问题),一切都按预期工作。一个可爱的搜索框出现在它应该出现的位置。

除了让它工作的任何建议之外,我想知道...

  1. google.search.CurrentLocale 为何返回有效字符串,而构造函数 google.search.CustomSearchControl() 无法加载?

  2. 当我将 searchLoaded 指定为 unsafeWindow.searchLoaded(见上文最后一条注解)时,google 对象不再对函数可见,即使默认情况下它们应该在窗口范围内。但是,当我在 javascript shell 下为函数分配那些完全相同的值时,一切正常!即使我已明确定义函数在窗口范围内,Greasemonkey 是否以某种方式屏蔽了这些变量?

我已经尝试过不同方案的变体(location hack、@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 范围内 undefined variable ,如 J 和 K。

关于javascript - 通过 Greasemonkey 实现 Google Custom Search API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3410397/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com