JavaScript: переопределение предупреждения()

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

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

11 ответов


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

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

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

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

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

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


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

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

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

например:

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

alert('This is an override.');

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


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

window.alert = null

или

window.alert = function(){}

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

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

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

Window.prototype.alert = null

или

Window.prototype.alert = function(){}

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

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


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


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

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

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