JavaScript: Alarm überschreiben ()


207

Hat jemand Erfahrung mit dem Überschreiben der alert()Funktion in JavaScript?

  • Welche Browser unterstützen dies?
  • Welche Browserversionen unterstützen dies?
  • Was sind die Gefahren beim Überschreiben der Funktion?

Ist das nicht eine Endlosschleife?
Pool

1
@ Nick - nein, das ist es nicht. Die 'normale' window.alert-Funktion wird window._alert zugewiesen. > Danach <wird die window.alert-Funktion neu definiert.
Chris Shouts

@roosteronacid: Ihr Code war semantisch und syntaktisch in Ordnung, obwohl er erfunden wurde, wie @ paper1337 hervorhob ... keine Chance auf Rekursion lol ... im Wesentlichen haben Sie in erster Linie nur Funktionskörper als eine Art expando temp ausgetauscht . _alert
Nicht-Sequitor

Ja. Ich habe ein Rollback gemacht, um die Frage nicht zu verschleiern :)
Cllpse

Antworten:


210

Es ist definitiv "unterstützt". Es ist Ihre Webseite, Sie machen damit, was Sie wollen.

Ich habe dies bereits getan, um Analyseereignisse zu verfolgen, ohne eine Bibliothek zu ändern, sondern indem ich mich in Ereignisse eingeschlichen habe.

Verwenden Sie das Proxy-Muster:

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

Sie können den Aufruf der ursprünglichen Funktion auch umgehen, wenn Sie möchten (Proxy)

Weitere Informationen hier: JQuery Types #Proxy Pattern


+1 auf dem Proxy-Muster, um die Funktion wirklich zu überschreiben und sicherzustellen, dass sie nicht manipuliert wird!
Josh Stodola

15
Pfui! apply()ist window.alertin Internet Explorer 8 nicht verfügbar .
cllpse

Es tut mir leid zu hören, dass .. applyeine Methode des FunctionObjekts ist. Also müssen sie es explizit einschränken für alert?!
Mike Gleason jr. Couturier

4
Sie müssen es mit dem Proxy-Muster überschrieben haben: D
Josh Stodola

Ältere Browser unterstützen dies nicht und werfen eine Ausnahme auf "window.alert ="
Chris Pietschmann

23

Obwohl die meisten Browser das Überschreiben unterstützen, sollten Sie vorsichtig sein, was Sie damit tun.

Da das Standard-Warnfeld den Ausführungsthread blockiert, funktionieren einige Bibliotheken, die auf diesem Verhalten basieren, möglicherweise (bestenfalls) nicht mehr.

Sie sollten ein guter Bürger sein und vermeiden, die native API zu berühren. Wenn Sie dies tun, können Sie bei Verwendung von Code von Drittanbietern Probleme lösen.

Wenn Sie jedoch das Warnverhalten in einem bestimmten Kontext neu definieren möchten, können Sie es mit einer anonymen Funktion wie der folgenden einschließen:

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

Die Overring-Alarmfunktion birgt keine Gefahren. Jeder Browser unterstützt es.

beispielsweise:

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

alert('This is an override.');

11
Es besteht die Gefahr, dass Ihr Ersatz nicht blockiert. Zum Beispiel Code, der alert("Reloading")die Webseite aufruft und dann neu lädt. Der Warnungstext wird vom Benutzer möglicherweise nie gesehen.
Darien

13

Ich denke, jede Javascript-Implementierung wird dies unterstützen, und es besteht keine Gefahr damit. Es ist üblich, die einfachen Warnboxen im OS-Stil durch HTML / CSS durch etwas Eleganteres zu ersetzen. Auf diese Weise müssen Sie den vorhandenen Code nicht ändern! Die Tatsache, dass es möglich ist, macht Javascript großartig.


12

Wie in vielen anderen Antworten erwähnt, können Sie die Funktion einfach mit überschreiben

window.alert = null

oder

window.alert = function(){}

Dies überschreibt jedoch nicht unbedingt die Funktion des Prototyps des WindowKonstruktors (beachten Sie das Großbuchstaben W), sodass der Hacker weiterhin Folgendes eingeben kann:

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

Daher müssen Sie diese Funktion auch überschreiben mit:

Window.prototype.alert = null

oder

Window.prototype.alert = function(){}

Dies überschreibt nicht unbedingt die Funktion in anderen Frames. siehe jsfiddle.net/18znqbjd/1
Robert

Robert: Ja und aus guten Gründen. Unterschiedliche Frames sind grundsätzlich unterschiedliche HTML-Dokumente mit jeweils einer eigenen "Instanz" von Javascript.
Rolf

Sind Sie sicher, dass Window.prototype.alert auch 2017 noch eine Funktion ist? : P
iplus26

6

Ladislav.
Für IE8 können Sie alert () auf diese Weise neu definieren

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

und anrufen als

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

4

Meine Erfahrung mit dem Überschreiben der alert () -Funktion ist, dass wir sie einmal verwendet haben, um die Testversion der JavaScript-Bibliothek zu "hacken", in der "Bitte registrieren!" Angezeigt wurde. nag Bildschirm durch Alarm von Zeit zu Zeit.

Wir haben gerade unsere eigene alert () -Funktion und voila definiert.

Es war nur zu Testzwecken, wir haben später die Vollversion gekauft, also ist hier nichts Unmoralisches los ;-)


3

Alle JavaScript-Implementierungen in modernen Browsern unterstützen das Überschreiben.

Die Gefahren sind ganz einfach, dass Sie andere Teammitglieder absolut verrückt machen würden, indem Sie allgemein bekannte Funktionen wie alert () überschreiben.

Wenn Sie also keine Funktionen als Tool überschreiben, um vorhandenen Code auf irgendeine Weise zu debuggen oder zu hacken, sehe ich keinen Grund, dies zu tun. Erstellen Sie einfach eine neue Funktion.


2

Es funktioniert sicher in Firefox und IE8. Ich kann nicht sehen, dass es einen Browser geben würde, in dem es nicht funktionieren würde. Dies ist ziemlich grundlegend für die Funktionsweise von Javascript, obwohl man es nicht oft mit nativen Funktionen wie diesen verwenden sieht =)


1
Der Browser, auf den speziell abgezielt werden soll, wäre IE6, andere wären wahrscheinlich damit einverstanden.
AnthonyWJones

1

Ein schneller Hack, den ich mache, um herauszufinden, woher die Warnungen kommen, ist, zur Konsole zu gehen und diese dann einzugeben

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

0

Wenn es um js Browserfunktionen window.alertgeht, sind sie herausragend und am bekanntesten. Leute, die js nicht kennen, wissen es alert()- seien Sie versichert, dass sie in allen heute verwendeten Browsern unterstützt werden und Ihr Code-Snippet auch. Ich würde jedoch alert()für einen bestimmten Anwendungsfall wie Ihren nicht überschreiben (dies ist eher ein Refactoring als ein Überschreiben im OOP-Sinne), denn wenn Sie tatsächlich alert()ohne Vorlage verwenden müssen und dies wahrscheinlich auch tun werden, müssen Sie dies tun eine andere nicht alarmierende Funktion, um dies zu tun.


0

Ich musste eine Standardnachricht zusammen mit den tatsächlichen Warnmeldungen anzeigen. So habe ich es geschafft.


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

Ich habe es auf Chrom getestet. Ich bin nicht sicher, ob es eine gute Praxis ist, aber es erfüllt den Zweck.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.