3

私は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の懸念なし)を再割り当てすると、すべてが意図したとおりに機能しました。素敵な検索ボックスが表示されます。

それを機能させるための提案に加えて、私は疑問に思っていました...

  1. コンストラクターgoogle.search.CustomSearchControl()をロードできなかったのに、なぜgoogle.search.CurrentLocaleが有効な文字列を返したのですか?

  2. searchLoadedをunsafeWindow.searchLoadedとして割り当てた場合(上記の最後の注を参照)、デフォルトでウィンドウスコープの下にあるはずなのに、Googleオブジェクトは関数に表示されなくなりました。ただし、javascriptシェルで関数にまったく同じ値を割り当てた場合、すべてが機能しました。関数をウィンドウスコープに明示的に定義したにもかかわらず、Greasemonkeyはこれらの変数を何らかの形でシールドしていますか?

さまざまなスキーム(ロケーションハック、@ required、google.setOnLoadCallback ...)でバリエーションを試しましたが、どれもうまくいきませんでした。

何か教えてください...そして私はどんな提案でも意味します、私はアイデアを使い果たしています...

ありがとう!

4

1 に答える 1

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スクリプトではなく、通常のスクリプトとしてコードを記述します。つまり、すべての参照と関連するものを
削除します。 これにより、スクリプトが正しいスコープで実行されるようになります。 この問題は、GMスコープで定義されていないJやKなどの変数を使用しているために発生します。unsafeWindow

google.search.CustomSearchControl

于 2010-08-07T15:21:24.127 に答える