Я хочу реализовать 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), через командную строку, все работало как задумано. Прекрасное окно поиска показывает, где он должен быть.
Помимо каких-либо предложений, чтобы это заработало, мне было интересно ...
Как получилось, что google.search.CurrentLocale вернул верную строку, где как конструктор google.search.CustomSearchControl () не удалось загрузить?
Когда я назначил searchLoaded как unsafeWindow.searchLoaded (см. Последнее примечание выше), объекты google больше не видны функции, даже если они по умолчанию находятся в области видимости окна. ОДНАКО, когда я назначил функции те же самые значения под оболочкой javascript, все работало! Greasemonkey как-то экранирует эти переменные, хотя я явно определил функцию, которая должна быть в области видимости окна?
Я пробовал варианты с разными схемами (определение местоположения, @required, google.setOnLoadCallback ...), но ни одна из них не работала для меня.
Пожалуйста, дайте мне знать о ЛЮБОМ ... и я имею в виду ЛЮБЫЕ предложения, у меня заканчиваются идеи ...
Спасибо!