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?
_alert
Hat jemand Erfahrung mit dem Überschreiben der alert()
Funktion in JavaScript?
_alert
Antworten:
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
apply()
ist window.alert
in Internet Explorer 8 nicht verfügbar .
apply
eine Methode des Function
Objekts ist. Also müssen sie es explizit einschränken für alert
?!
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);
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.');
alert("Reloading")
die Webseite aufruft und dann neu lädt. Der Warnungstext wird vom Benutzer möglicherweise nie gesehen.
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.
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 Window
Konstruktors (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(){}
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);
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 ;-)
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.
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 =)
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;
}
Wenn es um js Browserfunktionen window.alert
geht, 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.
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.