私は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シェルのブックマークレットを使用し、コマンドラインを介して関数gLoaded()およびsearchLoaded()の非Greasemonkey対応物(unsafeWindowの懸念なし)を再割り当てすると、すべてが意図したとおりに機能しました。素敵な検索ボックスが表示されます。
それを機能させるための提案に加えて、私は疑問に思っていました...
コンストラクターgoogle.search.CustomSearchControl()をロードできなかったのに、なぜgoogle.search.CurrentLocaleが有効な文字列を返したのですか?
searchLoadedをunsafeWindow.searchLoadedとして割り当てた場合(上記の最後の注を参照)、デフォルトでウィンドウスコープの下にあるはずなのに、Googleオブジェクトは関数に表示されなくなりました。ただし、javascriptシェルで関数にまったく同じ値を割り当てた場合、すべてが機能しました。関数をウィンドウスコープに明示的に定義したにもかかわらず、Greasemonkeyはこれらの変数を何らかの形でシールドしていますか?
さまざまなスキーム(ロケーションハック、@ required、google.setOnLoadCallback ...)でバリエーションを試しましたが、どれもうまくいきませんでした。
何か教えてください...そして私はどんな提案でも意味します、私はアイデアを使い果たしています...
ありがとう!