JavaScript: Попередження попередження ()


207

Хто-небудь має досвід перегляду alert()функції в JavaScript?

  • Які браузери це підтримують?
  • Які версії браузера підтримують це?
  • У чому небезпека перекриття функції?

Хіба це не нескінченна петля?
Басейн

1
@Nick - ні, це не так. Функція 'normal' window.alert буде призначена window._alert. > Після <що функція window.alert буде переглянута.
Кріс Криків

@roosteronacid: Ваш код був семантично і синтаксично чужий, хоча і надуманий, як вказував @ paper1337 ... жодних шансів на рекурсію там не було ... по суті, ви просто поміняли функціональні органи на _alert, наприклад, на зразок темпу розширення в першу чергу.
не послідовник

Ага. Я зробив відкат ти, щоб не затьмарити питання :)
cllpse

Відповіді:


210

Це безумовно "підтримується". Це ваша веб-сторінка, ви робите все, що завгодно з нею.

Я вже робив це, щоб відстежувати аналітичні події, не змінюючи бібліотеку, а проникаючи в події.

Використовуйте шаблон проксі:

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

Ви також можете обійти виклик до початкової функції, якщо хочете (проксі)

Більше інформації тут: JQuery Types #Proxy Pattern


Позначте +1 на шаблоні проксі-сервера, щоб по-справжньому змінити функцію та переконатися, що вона не піддається дії!
Джош Стодола

15
Тьфу! apply()недоступний window.alertу Internet Explorer 8.
cllpse

Мені шкода, що .. applyце метод Functionоб'єкта. Тож вони повинні це прямо обмежити alert?!
Майк Глісон-молодший Кутюр’є

4
Вони, мабуть, перекрили його, використовуючи шаблон проксі: D
Джош Стодола

Старі браузери не підтримують це, і викине виняток на "window.alert ="
Chris Pietschmann

23

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

Оскільки поле попередження за замовчуванням блокує потік виконання, деякі бібліотеки, які покладаються на цю поведінку, можуть більше не працювати (в кращому випадку).

Ви повинні бути хорошим громадянином і уникати дотику до рідного 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);

15

Немає небезпеки в функції перекриття сигналів. Кожен браузер це підтримує.

наприклад:

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

alert('This is an override.');

11
Там може бути небезпечно , якщо ваша заміна блокує. Наприклад, код, який викликає, alert("Reloading")а потім перезавантажує веб-сторінку. Користувач ніколи не може побачити текст попередження.
Дарієн

13

Я думаю, що будь-яка реалізація Javascript підтримає це, і немає ніякої небезпеки з цим. Зазвичай це робиться для заміни простих вікон оповіщення в стилі ОС на щось більш елегантне на HTML / CSS. Це робити таким чином, вам не потрібно змінювати існуючий код! Те, що це можливо, робить Javascript приголомшливим.


12

Як сказано в багатьох інших відповідях, ви можете просто змінити функцію

window.alert = null

або

window.alert = function(){}

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

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

отже, вам також потрібно перекрити цю функцію за допомогою:

Window.prototype.alert = null

або

Window.prototype.alert = function(){}

Це не обов'язково перекриває функцію в інших кадрах. дивіться jsfiddle.net/18znqbjd/1
Роберт

Роберт: Так і з поважних причин. Різні кадри - це в основному різні документи HTML, кожен з яких має свій "екземпляр" Javascript.
Рольф

Ви впевнені, що Window.prototype.alert все ще функціонує у 2017 році? : P
iplus26

6

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

4

Мій досвід роботи з переважаючою функцією попередження () полягає в тому, що колись ми використовували її для "злому" пробної версії бібліотеки JavaScript, на якій відображалось "Будь ласка, зареєструйтесь!" прикриваючи екран через час оповіщення.

Ми просто визначили власну функцію alar () і вуаля.

Це було лише для тестування, ми придбали повну версію пізніше, тому нічого аморального не відбувається тут ;-)


3

Усі реалізації JavaScript у сучасних браузерах підтримують переосмислення.

Небезпека полягає в тому, що ви звели б з розуму інших членів команди, перекривши загальновідомі функції, такі як alar ().

Тому, якщо ви не перекриваєте функції як інструмент, можливо, налагодити чи зламати наявний код якимось чином, я не бачу причин для цього. Просто створіть нову функцію.


2

Це впевнено працює у firefox і ie8. Я не бачу, що не було б жодного браузера, в якому він не працював би. Це дуже важливо, як працює JavaScript, навіть якщо він часто не бачить, що він використовується з подібними функціями =)


1
Веб-переглядач, на який потрібно орієнтуватися, був би IE6, інші, швидше за все, будуть з ним нормально.
AnthonyWJones

1

Швидкий злом, який я роблю, щоб дізнатися, звідки надходять сповіщення, - це перейти до консолі, а потім ввести це

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

0

Що стосується функцій браузера js, window.alertє найвидатнішим та найвідомішим, люди, які не знають js знають, alert()будьте впевнені, він підтримується у всіх браузерах, які використовуються сьогодні, і ваш фрагмент коду також. Однак я б не переосмислював (ну це більше схоже на рефакторинг, а не на переосмислення в сенсі OOP) alert()для конкретного випадку використання як вашого, тому що, коли вам потрібно використовувати alert()без шаблону, і, ймовірно, вам потрібно, тоді вам знадобиться ще одна функція без сповіщення для цього.


0

Я зіткнувся з вимогою показати повідомлення за замовчуванням разом із фактичними повідомленнями попередження. Ось як мені вдалося це зробити.


    const actualAlertFunc = window.alert;
    window.alert = function(msg) {
         actualAlertFunc('some default message '+ msg);
    }

Я протестував це на хромі. Я не впевнений, чи це хороша практика, але це відповідає меті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.