Как переопределить функцию оповещения с помощью пользовательского скрипта?

На сайте есть такой код (его сайт в локальной сети)

<script language="JavaScript" type="text/javascript">         
    alert("ble");
</script>

Я пытаюсь отключить это предупреждение с помощью GM. я пытался сделать это

unsafeWindow.alert=function() {};

но я вижу предупреждение и получаю эту ошибку

Error: uncaught exception: [Exception... "Component is not available"  nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)"  location: "JS frame :: file:///C:/Documents%20and%20Settings/arokitnicki/Dane%20aplikacji/Mozilla/Firefox/Profiles/sm4bsods.default/extensions/%7Be4a8a97b-f2ed-450b-b12d-ee082ba24781%7D/components/greasemonkey.js :: anonymous :: line 377"  data: no]

Как отключить это оповещение?

P.S. это НЕ вопрос по javascript, а вопрос Greasemonkey.

ИЗМЕНИТЬ:

Веб-сайт его компании, поэтому я не могу вставить настоящий код

<head>
    <script>    
        dojo.require("dojo.back");
        dojo.back.init(); 
    </script>
</head>
<body onload="someMethod()">
    <iframe></iframe>
    <script>         
        alert("bla");
    </script>
</body>

В заголовке также есть несколько скриптов и объявлений CSS.


person IAdapter    schedule 11.01.2011    source источник
comment
@01, Этот код <alert>... размещен в теле страницы, которую вы хотите прервать с помощью Greasemonkey?   -  person Anders    schedule 11.01.2011


Ответы (2)


Обновление: для современных версий Tampermonkey, Violentmonkey, Greasemonkey (но настоятельно рекомендуется избегать GM 4+):
Вы можете перехватывать alert() в большинстве случаев с помощью @run-at document-start. Например, загрузите этот скрипт, а затем посетите тестовую страницу:

// ==UserScript==
// @name    _Overwrite Alert
// @match   *://output.jsbin.com/*
// @grant   none
// @run-at  document-start
// ==/UserScript==

var alrtScope;
if (typeof unsafeWindow === "undefined") {
    alrtScope = window;
} else {
    alrtScope = unsafeWindow;
}

alrtScope.alert = function (str) {
    console.log ("Greasemonkey intercepted alert: ", str);
};

Обратите внимание: если вы запустили Tampermonkey, вы можете более эффективно блокировать оповещения, переключившись на Inject Mode: Instant:
Настройки Tampermonkey => Режим конфигурации: Advanced => Экспериментальный => Режим внедрения: Instant.


Если вашему скрипту требуются функции GM_, он должен установить @grant, отличный от none. В этом случае используйте exportFunction() вот так:

// ==UserScript==
// @name            _Overwrite Alert
// @match           *://output.jsbin.com/*
// @grant           GM_addStyle
// @run-at          document-start
// ==/UserScript==

function myAlert (str) {
    console.log ("Greasemonkey intercepted alert: ", str);
}
unsafeWindow.alert   = exportFunction (myAlert, unsafeWindow);


Старый ответ для Greasemonkey до августа 2011 года:

unsafeWindow.alert=function() {}; отлично работает в некоторых ситуациях.

Но если это действительно код на странице, то вы не сможете остановить это оповещение с помощью Greasemonkey.

Это связано с тем, что это оповещение будет срабатывать во время загрузки страницы и до события DOMContentLoaded, когда запускается Greasemonkey.


Загрузите этот скрипт GM:

// ==UserScript==
// @name            Overwrite Alert
// @description     Overwrites alert()
// @include         http://jsbin.com/*
// ==/UserScript==

unsafeWindow.alert=function() {};


Затем посетите: http://jsbin.com/ajeqe4/6 .

Изучив код (http://jsbin.com/ajeqe4/6/edit), вы увидит 3 предупреждения. Greasemonkey может останавливать оповещения только на load (обычно).

Другие факторы могут блокировать способность GM остановить оповещение... Страница загружается слишком быстро или закрывается, возможно.


Вставьте исходный код этой страницы, по возможности без редактирования, на pastebin.com. Может быть, вы можете сделать что-то еще. Может заблокировать скрипт через адблок?

В противном случае вам придется писать расширение/надстройку.

person Brock Adams    schedule 11.01.2011
comment
Юпп, это правильно, просто не знал, действительно ли он это имел в виду. - person Anders; 11.01.2011
comment
Я вставил код. Я посмотрю на adblock, спасибо за предложение. если у вас есть другие идеи, пожалуйста, поделитесь ими. - person IAdapter; 11.01.2011
comment
@01, Да, потому что он выполняется до GM. - person Anders; 11.01.2011
comment
@01: Поскольку ваше оповещение закодировано в теле и срабатывает встроенно, GM не может его заблокировать. Поскольку он загружается не из файла, блокировщик рекламы не может его заблокировать. Практически единственная альтернатива — надстройка для браузера, которая переписывает/фильтрует HTML-код во время загрузки страницы. Реально, так как это ЛВС и крайне плохое юзабилити, регистрируйте жалобы у менеджеров и айтишников. Вероятно, вы можете найти боеприпасы на отличном сайте Якоба Нильсена. - person Brock Adams; 11.01.2011
comment
Большое спасибо, моя компания не заботится об удобстве использования, но я не так часто использую эту страницу, так что все в порядке. если мне станет скучно, я могу попробовать написать дополнение. Большое спасибо за вашу помощь, теперь я лучше знаю, как работает GM. - person IAdapter; 12.01.2011

Если вы используете Scriptish, всегда будет работать следующее:

// ==UserScript==
// @id              [email protected]
// @name            Overwrite Alert
// @description     Overwrites alert()
// @include         *
// @run-at          document-start
// ==/UserScript==

unsafeWindow.alert=function() {};

Вы можете получить пользовательский скрипт здесь.

person erikvold    schedule 07.03.2011