Ошибка: в доступе отказано в доступе к свойству "обработчик"

У меня есть скрипт 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 - или она получает автообновление.

Другие вопросы по тегам