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()
без шаблона, и вы, вероятно, будете, тогда вам понадобится другая функция без предупреждения для этого.