JavaScript: avviso prioritario ()

Qualcuno ha avuto esperienza con l’override della funzione alert() in JavaScript?

  • Quali browser supportano questo?
  • Quali versioni del browser supportano questo?
  • Quali sono i pericoli nel sovrascrivere la funzione?

È sicuramente “supportato”. È la tua pagina web, fai quello che vuoi con esso.

L’ho già fatto per tenere traccia degli eventi di analisi senza modificare una libreria, ma introducendo gli eventi.

Usa il pattern proxy:

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

Puoi anche ignorare la chiamata alla funzione originale se desideri (proxy)

Maggiori informazioni qui: JQuery Types #Proxy Pattern

Sebbene la maggior parte dei browser supporti la sovrascrittura, fai attenzione a ciò che stai facendo.

Poiché la finestra di avviso predefinita blocca il thread di esecuzione, alcune librerie basate su questo comportamento potrebbero non funzionare più (nella migliore delle ipotesi).

Dovresti essere un buon cittadino ed evitare di toccare l’API nativa. Se lo fai, potresti rompere le cose, quando si utilizza il codice di terze parti.

Tuttavia, se si desidera ridefinire il comportamento di avviso in un contesto specifico, è ansible includerlo con una funzione anonima, come questa:

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

Non ci sono pericoli nella funzione di segnalazione di Overring. Ogni browser lo supplisce.

per esempio:

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

Penso che ogni implementazione di Javascript supporterà questo, e non ci sono pericoli coinvolti. È comunemente fatto per sostituire le normali caselle di avviso in stile OS con qualcosa di più elegante con HTML / CSS. Farlo in questo modo significa che non devi modificare il codice esistente! Il fatto che sia ansible rende Javascript fantastico.

Come detto in molte altre risposte, puoi semplicemente ignorare la funzione con

 window.alert = null 

o

 window.alert = function(){} 

tuttavia, ciò non necessariamente sostituisce la funzione sul prototipo del costruttore di Window (nota la W maiuscola), quindi l’hacker può ancora digitare:

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

pertanto, devi anche eseguire l’override di tale funzione con:

 Window.prototype.alert = null 

o

 Window.prototype.alert = function(){} 

Ladislav.
Per IE8 è ansible ridefinire alert () in questo modo

 /** * Definition of global attached to window properties 
*/ (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('

I am redefiend alert()
Alert say: '+message+'

'); } }; })(this);

e chiama come

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

La mia esperienza con la funzione overriding alert () è che una volta l’abbiamo usata per “hackerare” la versione di prova della libreria JavaScript che mostrava “Per favore registrati!” nag screen attraverso l’avviso di volta in volta.

Abbiamo appena definito la nostra funzione alert () e voilà.

Era solo a scopo di test, abbiamo comprato la versione completa più tardi, quindi niente di immorale succedeva qui 😉

Tutte le implementazioni di JavaScript nei browser moderni supportano l’override.

I pericoli sono semplicemente, che faresti impazzire gli altri membri del team ignorando le funzioni comunemente note come alert ().

Quindi, a meno che tu non abbia la priorità sulle funzioni come strumento per eseguire il debug o hackerare il codice esistente in qualche modo, non vedo alcun motivo per farlo. Basta creare una nuova funzione.

Funziona sicuramente in firefox e ie8. Non riesco a vedere che ci sarebbe un browser in cui non avrebbe funzionato. Questo è praticamente fondamentale per il funzionamento di javascript, anche se spesso non lo si vede usato con funzioni native come quella =)

Un trucco rapido che faccio per trovare da dove provengono gli avvisi, è quello di andare alla console e quindi inserire questo

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

Quando si tratta delle funzioni del browser js window.alert è preminente e più noto, le persone che non conoscono js know alert() – sono sicuri che sia supportato da tutti i browser in uso oggi e anche il tuo snippet di codice è altrettanto valido . Tuttavia, non vorrei sovrascrivere (bene questo è più come refactoring piuttosto che scavalcare nel senso OOP) alert() per un caso d’uso particolare come il tuo perché quando hai effettivamente bisogno di usare alert() senza template, e probabilmente lo farai , quindi avrai bisogno di un’altra funzione non di avviso per farlo.