JavaScript: nadpisanie alertu ()


207

Czy ktoś ma jakieś doświadczenie w zastępowaniu alert()funkcji w JavaScript?

  • Które przeglądarki obsługują to?
  • Które wersje przeglądarki obsługują to?
  • Jakie są niebezpieczeństwa związane z nadpisaniem funkcji?

Czy to nie jest nieskończona pętla?
Basen

1
@Nick - nie, nie jest. Funkcja „normal” window.alert zostanie przypisana do window._alert. > Po tym <funkcja window.alert zostanie ponownie zdefiniowana.
Chris Shouts

@roosteronacid: Twój kod był poprawny semantycznie i składniowo, choć wymyślony, jak zauważył @ paper1337 ... nie ma szans na rekurencję tam lol ... w zasadzie po prostu zamieniłeś ciała funkcyjne _alertjako rodzaj temp ekspandowania w pierwszej instancji.
niesekwencjonowany

Zawsze.
Cofnąłem się

Odpowiedzi:


210

To zdecydowanie „obsługiwane”. To twoja strona internetowa, robisz z nią, co chcesz.

Zrobiłem to już w celu śledzenia zdarzeń analitycznych bez modyfikowania biblioteki, ale wkradając się do zdarzeń.

Użyj wzorca proxy:

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

Możesz także pominąć wywołanie oryginalnej funkcji, jeśli chcesz (proxy)

Więcej informacji tutaj: Typy JQuery #Proxy Pattern


+1 na schemacie proxy, aby naprawdę zastąpić func i upewnić się, że nie zostanie zmieniony!
Josh Stodola

15
Ugh! apply()nie jest dostępny window.alertw przeglądarce Internet Explorer 8.
cllpse

Przykro mi słyszeć, że .. applyjest metodą Functionobiektu. Więc muszą to wyraźnie ograniczyć alert?
Mike Gleason jr Couturier

4
Musieli to przesłonić za pomocą wzorca proxy: D
Josh Stodola

Starsze przeglądarki nie obsługują tego i będą zgłaszać wyjątek dla „window.alert =”
Chris Pietschmann

23

Chociaż większość przeglądarek obsługuje nadpisywanie go, należy zachować ostrożność przy wykonywaniu tego.

Ponieważ domyślne okno alertu blokuje wątek wykonania, niektóre biblioteki korzystające z tego zachowania mogą już nie działać (w najlepszym wypadku).

Powinieneś być dobrym obywatelem i unikać dotykania natywnego API. Jeśli to zrobisz, możesz zepsuć się podczas korzystania z kodu innej firmy.

Jeśli jednak chcesz przedefiniować zachowanie alertu w określonym kontekście, możesz dołączyć go do anonimowej funkcji, takiej jak ta:

/* 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

Nie ma żadnych zagrożeń w funkcji ostrzegania Overring. Każda przeglądarka to obsługuje.

na przykład:

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

alert('This is an override.');

11
Nie mógłby stanowić zagrożenie, jeśli wymiana jest nie powodują blokowania. Na przykład kod, który wywołuje, alert("Reloading")a następnie ładuje stronę ponownie. Tekst ostrzeżenia może nigdy nie być widoczny dla użytkownika.
Darien

13

Myślę, że każda implementacja Javascript będzie w stanie to obsłużyć i nie wiąże się z tym żadne niebezpieczeństwo. Często robi się to, by zastąpić zwykłe skrzynki alarmowe w stylu systemu operacyjnego czymś bardziej eleganckim dzięki HTML / CSS. Zrobienie tego w ten sposób oznacza, że ​​nie musisz zmieniać istniejącego kodu! Fakt, że jest to możliwe, sprawia, że ​​JavaScript jest niesamowity.


12

Jak powiedziano w wielu innych odpowiedziach, możesz po prostu zastąpić funkcję za pomocą

window.alert = null

lub

window.alert = function(){}

nie musi to jednak zastępować funkcji prototypu Windowkonstruktora (zwróć uwagę na kapitał W), więc haker może nadal pisać:

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

dlatego należy również zastąpić tę funkcję za pomocą:

Window.prototype.alert = null

lub

Window.prototype.alert = function(){}

To niekoniecznie zastępuje funkcję w innych ramkach. patrz jsfiddle.net/18znqbjd/1
Robert

Robert: Tak i nie bez powodu. Różne ramki to w zasadzie różne dokumenty HTML, każdy z własnym „wystąpieniem” Javascript.
Rolf

Czy na pewno Window.prototype.alert jest nadal funkcją w 2017 roku? : P
iplus26

6

Ladislav.
W przypadku IE8 można przedefiniować alert () w ten sposób

/** 
 * 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);

i zadzwoń jako

alert('Hello, hacker!');
nalert('I am native alert');
alert('Hello, user!', Type.custom);

4

Moje doświadczenie z nadpisywaniem funkcji alert () jest takie, że kiedyś użyliśmy jej do „zhakowania” wersji próbnej biblioteki JavaScript, która wyświetlała „Proszę się zarejestrować!” od czasu do czasu wyświetlać powiadomienia.

Właśnie zdefiniowaliśmy naszą własną funkcję alert () i voila.

To było tylko w celach testowych, później kupiliśmy pełną wersję, więc nic niemoralnego się tu dzieje ;-)


3

Wszystkie implementacje JavaScript we współczesnych przeglądarkach obsługują nadpisywanie.

Niebezpieczeństwa polegają po prostu na tym, że doprowadzisz innych członków zespołu do szaleństwa, zastępując powszechnie znane funkcje, takie jak alert ().

Więc jeśli nie zastępujesz funkcji jako narzędzia do debugowania lub hakowania istniejącego kodu w jakiś sposób, nie widzę żadnego powodu, aby to robić. Po prostu utwórz nową funkcję.


2

Z pewnością działa w Firefoxie i ie8. Nie widzę, by istniała jakakolwiek przeglądarka, w której by nie działała. Jest to podstawowa zasada działania javascript, nawet jeśli często nie widzi się go używanego z takimi funkcjami natywnymi =)


1
Przeglądarką, której celem jest konkretnie, byłby IE6, inni mogliby się z tym pogodzić.
AnthonyWJones

1

Szybki hack, który robię, aby dowiedzieć się, skąd pochodzą alerty, to przejście do konsoli, a następnie wprowadzenie tego

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

0

Jeśli chodzi o funkcje przeglądarki js, window.alertjest ona najważniejsza i najbardziej znana, ludzie, którzy nie wiedzą, js wiedzą alert()- bądź pewien, że jest obsługiwany we wszystkich przeglądarkach, które są obecnie używane, a także fragment kodu. Jednak nie zastąpiłbym (cóż, to bardziej przypomina refaktoryzację niż zastąpienie w sensie OOP) alert()dla konkretnego przypadku użycia jako twojego, ponieważ kiedy faktycznie potrzebujesz użyć alert()bez szablonu i prawdopodobnie tak będzie, będziesz potrzebować kolejna funkcja niezwiązana z alertem.


0

Spotykałem się z wymogiem pokazania domyślnego komunikatu wraz z faktycznymi komunikatami ostrzegawczymi. W ten sposób udało mi się to zrobić.


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

Przetestowałem to na chromie. Nie jestem pewien, czy to dobra praktyka, ale służy temu celowi.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.