Реализация API пользовательского поиска Google через Greasemonkey - PullRequest
3 голосов
/ 05 августа 2010

Я хочу реализовать API пользовательского поиска Google с Greasemonkey, и до сих пор мои испытания встречались в основном с ошибками. Целью кода является внедрение пользовательского поля поиска в существующий сайт (я пытаюсь сделать это для страниц документации MATLAB, но введенный код должен действительно работать с любым сайтом). Я испробовал множество методов, предложенных поиском в сети (в основном относящихся к реализации JQuery или API языка Google в Greasemonkey), и ни один из них не работал для пользовательского интерфейса поиска ...

Я думаю, что может быть какая-то проблема с областью действия переменной, но, пожалуйста, дайте мне знать, если у кого-нибудь есть какие-либо предложения по его запуску ...

// 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.CurrentLocale вернул верную строку, где как конструктор google.search.CustomSearchControl () не удалось загрузить?

  2. Когда я назначил searchLoaded как unsafeWindow.searchLoaded (см. Последнее примечание выше), объекты google больше не видны функции, даже если они по умолчанию находятся в области видимости окна. ОДНАКО, когда я назначил функции те же самые значения под оболочкой javascript, все работало! Greasemonkey как-то экранирует эти переменные, хотя я явно определил функцию, которая должна быть в области видимости окна?

Я пробовал варианты с разными схемами (определение местоположения, @required, google.setOnLoadCallback ...), но ни одна из них не работала для меня.

Пожалуйста, дайте мне знать о ЛЮБОМ ... и я имею в виду ЛЮБЫЕ предложения, у меня заканчиваются идеи ...

Спасибо!

1 Ответ

3 голосов
/ 07 августа 2010

в основном ...

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 и K, которые не определены в области действия GM.

...