У меня есть скрипт Greasemonkey, который прекрасно работает в Firefox и Opera. Однако я не могу заставить его работать в Chrome. Проблема заключается в том, что на страницу внедряется функция, которая может вызываться кодом со страницы. Вот что я делаю до сих пор:
Сначала я получаю вспомогательную ссылку на unsafeWindow для Firefox. Это позволяет мне иметь один и тот же код для FF и Opera (и Chrome, подумал я).
var uw = (this.unsafeWindow) ? this.unsafeWindow : window;
Затем я добавляю функцию на страницу. На самом деле это просто очень тонкая оболочка, которая ничего не делает, кроме вызова соответствующей функции в контексте моего скрипта GM:
uw.setConfigOption = function(newValue) {
setTimeout(setConfigOption, 0, newValue);
}
Тогда в моем скрипте есть соответствующая функция:
setConfigOption = function(newValue) {
// do something with it, e.g. store in localStorage
}
Наконец, я вставляю HTML-код на страницу со ссылкой для вызова функции.
var p = document.createElement('p');
p.innerHTML = '<a href="javascript:setConfigOption(1)">set config option to 1</a>';
document.getElementById('injection-point').appendChild(p);
Подведем итог:
В Firefox, когда пользователь щелкает эту вставленную ссылку, он выполняет вызов функции для unsafeWindow, который затем запускает тайм-аут, который вызывает соответствующую функцию в контексте моего сценария GM, который затем выполняет фактическую обработку. (Поправьте меня, если я здесь не прав.)
В Chrome я просто получаю сообщение об ошибке "Uncaught ReferenceError: setConfigOption is notfined". И действительно, ввод «window.setConfigOption» в консоль приводит к «неопределенному». В Firebug и консоли разработчика Opera эта функция есть.
Возможно, есть другой способ сделать это, но некоторые из моих функций вызываются объектом Flash на странице, что, по моему мнению, делает необходимым наличие функций в контексте страницы.
Я быстро взглянул на альтернативы unsafeWindow в вики Greasemonkey, но все они выглядят довольно некрасиво. Я здесь совершенно не на том пути или мне стоит присмотреться к ним?
РАЗРЕШЕНИЕ: Я следовал Макс С. ' совет и теперь он работает как в Firefox, так и в Chrome. Поскольку функции, которые мне нужны были для доступа к странице, требовали обратного вызова к обычным, я переместил весь свой скрипт на страницу, то есть он полностью обернут в функцию, которую он назвал main ().
Чтобы сделать уродливость этого хака более терпимой, я мог бы по крайней мере отказаться от использования unsafeWindow и wrappedJSObject.
Мне все еще не удалось получить бегун области содержимого от рабочей вики Greasemonkey. Он должен делать то же самое, и, кажется, он работает нормально, но мои функции никогда не доступны, например, для <a>
элементов со страницы. Я еще не понял, почему это так.