JavaScript: Överskrider alert()
Har någon erfarenhet av att skriva över alert()-funktionen i JavaScript?
- Vilka webbläsare stöder detta?
- Vilka webbläsarversioner stöder detta?
- Vilka är farorna med att åsidosätta funktionen?
Svar #1
Det är definitivt "stöds". Det är din webbsida, du gör vad du vill med den.
Jag gjorde redan detta för att spåra analys-händelser utan att ändra ett bibliotek men genom att smyga in i händelser.
Använd proxy-mönstret:
(function(proxied) {
window.alert = function() {
// do something here
return proxied.apply(this, arguments);
};
})(window.alert);
Du kan också kringgå anropet till den ursprungliga funktionen om du vill (proxierad)
Mer info här: JQuery Typer #Proxy Mönster
Svar #2
Även om de flesta webbläsare stöder att åsidosätta det, var försiktig med vad du gör med det.
Eftersom standardvarningsrutan blockerar exekveringstråden, kanske vissa bibliotek som är beroende av detta beteende inte fungerar längre (i bästa fall).
Du bör vara en god medborgare och undvika att röra den inbyggda API:en. Om du gör det kan du orsaka problem när du använder tredjepartskod.
Ändå, om du vill omdefiniera alertbeteendet i ett specifikt sammanhang, kan du omsluta det med en anonym funktion, så här:
/* 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);
Svar #3
Det finns inga faror med Overring-varningsfunktionen. Alla webbläsare stöder den.
till exempel:
// function over riding. Redirecting to Console with Firebug installed.
function alert(message) {
console.info(message);
}
alert('This is an override.');
Svar #4
Som sagt i många av de andra svaren, kan du bara skriva över funktionen med
window.alert = null
eller
window.alert = function(){}
däremot överskrider detta nödvändigtvis inte funktionen på prototypen av Window-konstruktören (notera den stora W), så hackern kan fortfarande skriva:
Window.prototype.alert.apply(window, ["You were hacked!"]);
därför behöver du också skriva över den funktionen med:
Window.prototype.alert = null
eller
Window.prototype.alert = function(){}
Svar #5
Jag tror att varje Javascript-implementering kommer att stödja detta, och det finns ingen risk förknippad med det. Det är vanligt att man gör detta för att ersätta de vanliga OS-stilade alert-rutorna med något mer elegant med HTML/CSS. Genom att göra det på det här sättet behöver du inte ändra befintlig kod! Faktumet att det är möjligt gör Javascript fantastiskt.
