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

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

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

Ответ 1

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

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

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

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

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

Подробнее здесь: Типы JQuery #Proxy Pattern

Ответ 2

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

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

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

Ответ 3

В функции Overring alert нет никаких опасностей. Каждый браузер отключает его.

например:

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

alert('This is an override.');

Ответ 4

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

Ответ 5

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

window.alert = null

или

window.alert = function(){}

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

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

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

Window.prototype.alert = null

или

Window.prototype.alert = function(){}

Ответ 6

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

Ответ 7

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

Мы просто определили нашу функцию alert() и voila.

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

Ответ 8

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

Ответ 9

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

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

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

Ответ 10

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

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

Ответ 11

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