Как решить "В доступе отказано в доступе к собственности 'alert'"? - PullRequest
3 голосов
/ 30 апреля 2011

Есть веб-страница, для которой я делаю скрипт greasmonkey.Эта страница имеет несколько фреймов.Я обнаружил, что они являются проблемой, однако я не знаю, как решить проблему.

Сначала мой сценарий создает маленькое поле div с кнопкой.При нажатии кнопки скрипт анализирует содержимое веб-страницы и вызывает alert при определенных условиях.

Консоль Javascript в Firefox уже выкрикивает мне, что доступ запрещен для document, потому что мой скрипт использует document.getElementByID для поискаверхнее тело документа, к которому добавляется блок div.

Эту проблему легко избежать, так как тогда сценарий завершается ошибкой и застревает в iframes, но все еще продолжается на главной странице, поскольку он дает доступ к document.

Проблема возникает, когда я пытаюсь использовать оповещение в своей функции.Похоже, что iframes захватывает мой скрипт и убивает его с помощью Permission denied to access property 'alert'.

Как мне сказать браузеру / скрипту или как-то еще, что я хочу, чтобы мой скрипт запускался только в основном документе, и я не хочу, чтобынадоел iframes? Я установил дополнение NO-script, разрешил основной домен и заблокировал дополнительный домен (который загружается внутри iframes), и все сообщения с предупреждениями идут нормально.Но я не могу попросить своих пользователей установить noscript, включить / отключить определенные домены, и мой скрипт должен работать нормально.Мне нужно найти решение, которое бы работало со всеми включенными фреймами.

Надеюсь, это не сбивало с толку.

Спасибо за любую помощь.

1 Ответ

5 голосов
/ 30 апреля 2011

RE:

Как мне сообщить браузеру / скрипту или что-то еще, что я хочу, чтобы мой скрипт запускался только на основном документе, и я не хочу, чтобы меня беспокоили iframes? Я установил дополнение NO-script, разрешил основной домен и заблокировал дополнительный домен (который загружается внутри фреймов) и все сообщения о предупреждениях идут нормально.

Сначала настройте директивы include и exclude, чтобы максимально игнорировать iframe. EG:

// @include  http://example.com/normal/*
// @include  http://example.com/extra/*
// @exclude  http://example.com/extra/in_iframe/*


Затем добавьте эти 2 строки в качестве первых строк кода после блока метаданных :

if (window.top != window.self)  //-- Don't run on frames or iframes
    return;

Это остановит запуск сценария GM на iframes.

...