JavaScript: переопределение оповещения ()

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

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

11 ответов

Решение

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

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

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

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

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

Более подробная информация здесь: JQuery Types # Proxy Pattern

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

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

Вы должны быть хорошим гражданином и избегать прикосновения к нативному 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);

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

например:

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

alert('This is an override.');

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

window.alert = null

или же

window.alert = function(){}

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

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

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

Window.prototype.alert = null

или же

Window.prototype.alert = function(){}

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

Ладислав.
Для 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);

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

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

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

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

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

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

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


    const actualAlertFunc = window.alert;
    window.alert = function(msg) {
         actualAlertFunc('some default message '+ msg);
    }

Тестировал на хроме. Я не уверен, что это хорошая практика, но она служит цели.

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

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

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

Когда дело доходит до функций браузера JS window.alert является выдающимся и наиболее известным, люди, которые не знают JS знают alert() - будьте уверены, что он поддерживается во всех браузерах, используемых сегодня, и ваш фрагмент кода также. Тем не менее, я не буду переопределять (ну, это скорее рефакторинг, чем переопределение в смысле ООП) alert() для конкретного случая использования, как у вас, потому что, когда вам действительно нужно использовать alert() без шаблона, и вы, вероятно, будете, тогда вам понадобится другая функция без предупреждения для этого.

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