Хто-небудь має досвід перегляду 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);
}
Я протестував це на хромі. Я не впевнений, чи це хороша практика, але це відповідає меті.