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.