Ошибка: в доступе отказано в доступе к свойству "обработчик"
У меня есть скрипт greasemonkey для Firefox, который вчера работал отлично. Я попытался использовать его сегодня (код не был изменен), и я заметил, что он перестал работать. После дальнейшей проверки сценарий теперь выдает следующую ошибку:
Error: Permission denied to access property 'handler'
Эта ошибка выдается в следующем блоке кода:
$('body').click(function() {
// code here
});
Эта ошибка волшебным образом начала происходить сегодня, когда вчера сценарий работал нормально. Я не понимаю, почему эта ошибка происходит, когда я просто пытаюсь сделать что-то настолько простое, как добавление обработчика событий в jQuery.
Мой скрипт использует jQuery, который уже используется на странице, на которой выполняется скрипт, поэтому я использовал этот код, чтобы сделать его доступным для GM:
var $ = unsafeWindow.jQuery;
Для справки, если необходимо, вот следующие функции Greasemonkey, которые я использую в своем скрипте:
// @grant GM_getResourceText
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @grant GM_getResourceURL
Я пытался исследовать эту ошибку, и я не могу найти ответ. Все вопросы, которые выглядят так, как будто они могут быть полезны, включают в себя iframes, и в моем коде или на сайте, на котором он запущен, нет ни одного iframe. Я также попытался удалить и переустановить скрипт, но это не решило проблему.
3 ответа
Greasemonkey 2.0 только что был загружен во все браузеры Firefox, для которых установлено автоматическое обновление. (GM 2 был выпущен 17 июня 2014 года, но процесс проверки может занять несколько недель.)
Greasemonkey 2.0 радикально изменился unsafeWindow
обработка:
Обратно несовместимые изменения:
- Для стабильности, надежности и безопасности привилегированная песочница была обновлена в соответствии с новыми изменениями в unsafeWindow для SDK надстройки. Чтобы записать значения в unsafeWindow, вам нужно будет использовать новые методы
cloneInto()
,exportFunction()
и / илиcreateObjectIn()
,@grant none
Режим теперь используется по умолчанию, и гранты больше не будут подразумеваться, если они явно не указаны. См. Пост Изменения API песочницы в Greasemonkey 2.0 для более подробной информации.
Обычно, чтобы получить точечный доступ к функции или переменной страницы, вы можете переключиться на новые методы, но в вашем случае вы используете var $ = unsafeWindow.jQuery;
- что всегда было плохой практикой.
jQuery - это особый случай, и клонирование его туда-сюда приведет к поломке. @require
JQuery вместо, например:
// ==UserScript==
// @name _YOUR_SCRIPT_NAME
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant GM_getResourceText
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @grant GM_getResourceURL
// ==/UserScript==
...
На этой странице объясняется, как загрузить jQuery в сценарии Greasemonkey: http://wiki.greasespot.net/Third-Party_Libraries
Соответствующие части:
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
...
this.$ = this.jQuery = jQuery.noConflict(true);
Согласно документам, jQuery.noConflict()
убедится, что версия jQuery для вашего скрипта не будет мешать странице.
Смотрите также: jQuery в Greasemonkey 1.0 конфликтует с сайтами, использующими jQuery
Вы используете unsafeWindow
- что, как следует из названия, не является необходимым "безопасным" для использования - проблема, вероятно, лежит там; В Firefox было внесено изменение об объектах в разных отсеках:
https://blog.mozilla.org/addons/2014/04/10/changes-to-unsafewindow-for-the-add-on-sdk/
В блоге упоминается Add-on SDK, но изменения внесены в платформу, так что это повлияет и на Greasemonkey.
Таким образом, вы в основном пытаетесь получить объект из одного отсека (jQuery, из "unsafeWindow") и использовать его в своей песочнице greasemonkey. То, как вы делаете сейчас, вероятно, больше не может работать. Вы можете попробовать использовать API, упомянутый в статье, но я боюсь, что целая библиотека, такая как jQuery, может иметь клонирование. На самом деле, лучший способ - это, вероятно, загрузить jQuery также в ваше отделение Greasemonkey вместо того, чтобы повторно использовать тот, что находится на странице.
Ошибка, вероятно, возникла "волшебным образом", потому что вы обновили свою версию Firefox - или она получает автообновление.