У меня есть сценарий 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 not defined». И действительно, ввод «window.setConfigOption» в консоль дает «undefined». В Firebug и консоли разработчика Opera функция есть.
Возможно, есть другой способ сделать это, но некоторые из моих функций вызываются объектом Flash на странице, что, как я считаю, делает необходимым наличие у меня функций в контексте страницы.
Я бегло просмотрел альтернативы unsafeWindow в вики Greasemonkey, но все они выглядят довольно уродливые. Я полностью ошибаюсь здесь или мне следует более внимательно изучить эти вопросы?
РЕШЕНИЕ. Я подписался на Макс С. ' совет, и теперь он работает как в Firefox, так и в Chrome. Поскольку функции, которые мне должны были быть доступны для страницы, должны были быть вызваны обратно в обычные, я переместил весь свой скрипт на страницу, то есть он полностью заключен в функцию, которую он назвал 'main ()'.
Чтобы сделать дополнительную уродливость этого взлома немного более терпимой, я мог бы, по крайней мере, отказаться от использования unsafeWindow и wrappedJSObject сейчас.
Мне до сих пор не удалось заставить работать средство выполнения содержимого из вики Greasemonkey. Он должен делать то же самое, и, кажется, он выполняется нормально, но мои функции никогда не доступны для <a>
элементов со страницы, например. Я еще не понял, почему это так.