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