Хто-небудь має досвід перегляду alert()
функції в JavaScript?
- Які браузери це підтримують?
- Які версії браузера підтримують це?
- У чому небезпека перекриття функції?
_alert
, наприклад, на зразок темпу розширення в першу чергу.
Хто-небудь має досвід перегляду alert()
функції в JavaScript?
_alert
, наприклад, на зразок темпу розширення в першу чергу.
Відповіді:
Це безумовно "підтримується". Це ваша веб-сторінка, ви робите все, що завгодно з нею.
Я вже робив це, щоб відстежувати аналітичні події, не змінюючи бібліотеку, а проникаючи в події.
Використовуйте шаблон проксі:
(function(proxied) {
window.alert = function() {
// do something here
return proxied.apply(this, arguments);
};
})(window.alert);
Ви також можете обійти виклик до початкової функції, якщо хочете (проксі)
Більше інформації тут: JQuery Types #Proxy Pattern
apply()
недоступний window.alert
у Internet Explorer 8.
apply
це метод Function
об'єкта. Тож вони повинні це прямо обмежити alert
?!
Хоча більшість веб-переглядачів підтримують її перебір, будьте обережні, що ви робите з цим.
Оскільки поле попередження за замовчуванням блокує потік виконання, деякі бібліотеки, які покладаються на цю поведінку, можуть більше не працювати (в кращому випадку).
Ви повинні бути хорошим громадянином і уникати дотику до рідного 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);
Немає небезпеки в функції перекриття сигналів. Кожен браузер це підтримує.
наприклад:
// function over riding. Redirecting to Console with Firebug installed.
function alert(message) {
console.info(message);
}
alert('This is an override.');
alert("Reloading")
а потім перезавантажує веб-сторінку. Користувач ніколи не може побачити текст попередження.
Я думаю, що будь-яка реалізація 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 ви можете переглядати попередження () таким чином
/**
* 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);
Мій досвід роботи з переважаючою функцією попередження () полягає в тому, що колись ми використовували її для "злому" пробної версії бібліотеки JavaScript, на якій відображалось "Будь ласка, зареєструйтесь!" прикриваючи екран через час оповіщення.
Ми просто визначили власну функцію alar () і вуаля.
Це було лише для тестування, ми придбали повну версію пізніше, тому нічого аморального не відбувається тут ;-)
Усі реалізації JavaScript у сучасних браузерах підтримують переосмислення.
Небезпека полягає в тому, що ви звели б з розуму інших членів команди, перекривши загальновідомі функції, такі як alar ().
Тому, якщо ви не перекриваєте функції як інструмент, можливо, налагодити чи зламати наявний код якимось чином, я не бачу причин для цього. Просто створіть нову функцію.
Це впевнено працює у firefox і ie8. Я не бачу, що не було б жодного браузера, в якому він не працював би. Це дуже важливо, як працює JavaScript, навіть якщо він часто не бачить, що він використовується з подібними функціями =)
Що стосується функцій браузера js, window.alert
є найвидатнішим та найвідомішим, люди, які не знають js знають, alert()
будьте впевнені, він підтримується у всіх браузерах, які використовуються сьогодні, і ваш фрагмент коду також. Однак я б не переосмислював (ну це більше схоже на рефакторинг, а не на переосмислення в сенсі OOP) alert()
для конкретного випадку використання як вашого, тому що, коли вам потрібно використовувати alert()
без шаблону, і, ймовірно, вам потрібно, тоді вам знадобиться ще одна функція без сповіщення для цього.
Я зіткнувся з вимогою показати повідомлення за замовчуванням разом із фактичними повідомленнями попередження. Ось як мені вдалося це зробити.
const actualAlertFunc = window.alert;
window.alert = function(msg) {
actualAlertFunc('some default message '+ msg);
}
Я протестував це на хромі. Я не впевнений, чи це хороша практика, але це відповідає меті.