JavaScript: переопределение оповещения () - PullRequest
202 голосов
/ 13 ноября 2009

Кто-нибудь имел опыт переопределения функции alert() в JavaScript?

  • Какие браузеры поддерживают это?
  • Какие версии браузера поддерживают это?
  • В чем опасность переопределения функции?

Ответы [ 11 ]

205 голосов
/ 13 ноября 2009

Это определенно "поддерживается". Это ваша веб-страница, вы делаете с ней все, что хотите.

Я уже сделал это, чтобы отслеживать аналитические события, не изменяя библиотеку, а подкрадываясь к событиям.

Использовать шаблон прокси:

(function(proxied) {
  window.alert = function() {
    // do something here
    return proxied.apply(this, arguments);
  };
})(window.alert);

Вы также можете обойти вызов исходной функции, если хотите (прокси)

Подробнее здесь: Типы JQuery # Шаблон прокси

23 голосов
/ 13 ноября 2009

Хотя большинство браузеров поддерживают его переопределение, будьте осторожны с тем, что вы делаете с ним.

Поскольку окно оповещений по умолчанию блокирует поток выполнения, некоторые библиотеки, использующие это поведение, могут больше не работать (в лучшем случае).

Вы должны быть хорошим гражданином и избегать прикосновения к нативному API. Если вы это сделаете, вы можете разбить вещи, используя сторонний код.

Тем не менее, если вы хотите переопределить поведение оповещения в определенном контексте, вы можете заключить его в анонимную функцию, например:

/* new funky alert */
function myFunkyAlert(msg) { 
    /* here goes your funky alert implementation */
    alert("Look ma!\n" + msg);
}

(function(alert) { // anonymous function redefining the "alert"

    /* sample code */
    alert("Hello World!");

})(myFunkyAlert);
15 голосов
/ 13 ноября 2009

В функции оповещения Overring нет опасностей. Каждый браузер поддерживает это.

например:

// function over riding. Redirecting to Console with Firebug installed.
function alert(message) { 
    console.info(message);
} 

alert('This is an override.');
13 голосов
/ 13 ноября 2009

Я думаю, что каждая реализация Javascript будет поддерживать это, и нет никакой опасности, связанной с этим. Обычно это делается для того, чтобы заменить обычные блоки предупреждений в стиле ОС на более элегантные с HTML / CSS. Делая это таким образом, вы не должны изменять существующий код! Тот факт, что это возможно, делает Javascript потрясающим.

12 голосов
/ 23 февраля 2014

Как сказано во многих других ответах, вы можете просто переопределить функцию с помощью

window.alert = null

или

window.alert = function(){}

однако, это не обязательно переопределяет функцию в прототипе конструктора Window (обратите внимание на заглавную W), поэтому хакер все равно может набрать:

Window.prototype.alert.apply(window, ["You were hacked!"]);

поэтому вам также необходимо переопределить эту функцию с помощью:

Window.prototype.alert = null

или

Window.prototype.alert = function(){}
7 голосов
/ 22 февраля 2011

Ладислав.
Для IE8 вы можете переопределить alert () следующим образом:

/** 
 * Definition of global attached to window properties <br/>
 */ 
    (function() {
      nalert = window.alert;
      Type = {
          native: 'native',
          custom: 'custom'
      };
    })();

/**
 * Factory method for calling alert(). 
 * It will be call a native alert() or a custom redefined alert() by a Type param.
 * This defeinition need for IE
 */ 
    (function(proxy) {

          proxy.alert = function () {
          var message = (!arguments[0]) ? 'null': arguments[0];
          var type = (!arguments[1]) ? '': arguments[1];

          if(type && type == 'native') {
           nalert(message);
          }
          else {
               document.write('<h1>I am redefiend alert()<br/>Alert say: '+message+'</h1>');
          }     
      };
   })(this);

и звоните как

alert('Hello, hacker!');
nalert('I am native alert');
alert('Hello, user!', Type.custom);
4 голосов
/ 13 ноября 2009

Мой опыт работы с переопределенной функцией alert () заключается в том, что мы однажды использовали ее для «взлома» пробной версии библиотеки JavaScript с надписью «Пожалуйста, зарегистрируйтесь!» время от времени предупреждающий экран.

Мы только что определили нашу собственную функцию alert () и вуаля.

Это было только для целей тестирования, мы купили полную версию позже, так что ничего аморального здесь не происходит; -)

3 голосов
/ 13 ноября 2009

Все реализации JavaScript в современных браузерах поддерживают переопределение.

Опасности заключаются в том, что вы просто сводите с ума других членов команды, переопределяя общеизвестные функции, такие как alert ().

Так что, если вы не переопределяете функции как инструмент для возможной отладки или взлома существующего кода, я не вижу причин для этого. Просто создайте новую функцию.

2 голосов
/ 13 ноября 2009

Это точно работает в Firefox и ie8. Я не вижу, чтобы был какой-либо браузер, в котором бы он не работал. Это в значительной степени фундаментально из того, как работает javascript, даже если его не часто используют с такими нативными функциями =)

1 голос
/ 06 января 2016

Быстрый взлом, который я делаю, чтобы выяснить, откуда приходят оповещения, - это перейти на консоль и затем ввести это

function alert(message) { 
  console.info(message);
  debugger;
} 
...