JavaScript: avviso di sostituzione ()


207

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

  • Quali browser supportano questo?
  • Quali versioni di browser supportano questo?
  • Quali sono i pericoli nell'override della funzione?

Non è un ciclo infinito?
Piscina,

1
@Nick - no, non lo è. La funzione 'normale' di window.alert verrà assegnata a window._alert. > Dopo <che la funzione window.alert viene ridefinita.
Chris Shouts,

@roosteronacid: Il tuo codice era semanticamente e sintatticamente bene, anche se inventato, come ha sottolineato @ paper1337 ... nessuna possibilità di ricorsione lì lol ... in sostanza hai appena scambiato i corpi funzione con _alertuna sorta di temp expando in prima istanza.
non sequencer

Sì. Ho fatto un roll-back tu, per non oscurare la domanda :)
cllpse

Risposte:


210

È 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 inserendo di nascosto gli eventi.

Usa il modello proxy:

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

Puoi anche bypassare la chiamata alla funzione originale se lo desideri (in proxy)

Maggiori informazioni qui: Tipi JQuery #Proxy Pattern


+1 sul modello proxy per sovrascrivere veramente la funzione e assicurarsi che non venga manomesso!
Josh Stodola,

15
Ugh! apply()non è disponibile window.alertin Internet Explorer 8.
cllpse

Mi dispiace sapere che .. applyè un metodo Functiondell'oggetto. Quindi devono esplicitamente limitarlo per alert?!
Mike Gleason jr Couturier,

4
Devono averlo ignorato usando il modello proxy: D
Josh Stodola il

I browser meno recenti non lo supportano e genereranno un'eccezione su "window.alert ="
Chris Pietschmann,

23

Sebbene la maggior parte dei browser supporti l'override, fai attenzione a cosa ci fai.

Poiché la casella di avviso predefinita blocca il thread di esecuzione, alcune librerie che si basano 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 degli avvisi in un contesto specifico, è possibile includerlo in 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);

15

Non ci sono pericoli nella funzione di avviso Overring. Ogni browser lo supporta.

per esempio:

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

alert('This is an override.');

11
Ci potrebbe essere un pericolo se la sostituzione è bloccano il sistema. Ad esempio, codice che chiama alert("Reloading")e quindi ricarica la pagina Web. Il testo di avviso potrebbe non essere mai visto dall'utente.
Darien,

13

Penso che ogni implementazione di Javascript supporterà questo, e non vi è alcun pericolo. È comunemente fatto per sostituire le semplici caselle di avviso in stile OS con qualcosa di più elegante con HTML / CSS. Farlo in questo modo significa che non devi cambiare il codice esistente! Il fatto che sia possibile rende Javascript fantastico.


12

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

window.alert = null

o

window.alert = function(){}

tuttavia, questo non sostituisce necessariamente la funzione sul prototipo del Windowcostruttore (nota la maiuscola W), quindi l'hacker può ancora digitare:

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

pertanto, è necessario anche sostituire quella funzione con:

Window.prototype.alert = null

o

Window.prototype.alert = function(){}

Questo non sostituisce necessariamente la funzione in altri frame. vedi jsfiddle.net/18znqbjd/1
Robert,

Robert: Sì e per buoni motivi. Frame diversi sono sostanzialmente documenti HTML diversi, ognuno con la propria "istanza" di Javascript.
Rolf,

Sei sicuro che Window.prototype.alert sia ancora una funzione nel 2017? : P
iplus26,

6

Ladislav.
Per IE8 puoi ridefinire gli avvisi () in questo modo

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

e chiama come

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

4

La mia esperienza con l'override della funzione alert () è che una volta l'abbiamo usata per "hackerare" la versione di prova della libreria JavaScript che mostrava "Per favore registrati!" infastidire lo schermo di volta in volta in allerta.

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

Era solo a scopo di test, abbiamo acquistato la versione completa in seguito, quindi nulla di immorale sta succedendo qui ;-)


3

Tutte le implementazioni JavaScript nei browser moderni supportano l'override.

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

Quindi, a meno che non si stia sovrascrivendo le funzioni come uno strumento per forse eseguire il debug o l'hacking del codice esistente in qualche modo, non vedo alcun motivo per farlo. Basta creare una nuova funzione.


2

Funziona sicuramente con Firefox e ie8. Non riesco a vedere che ci sarebbe un browser in cui non funzionerebbe. Questo è praticamente fondamentale per come funziona javascript, anche se spesso non lo si vede usato con funzioni native come that =)


1
Il browser da indirizzare in modo specifico sarebbe IE6, altri sarebbero probabilmente d'accordo.
AnthonyWJones,

1

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;
} 

0

Quando si tratta delle funzioni del browser js window.alertè preminente e molto noto, le persone che non conoscono js lo sanno alert()- state certi che è supportato in tutti i browser in uso oggi e anche lo snippet di codice. Tuttavia, non sovrascriverei (beh, è ​​più simile al refactoring piuttosto che al superamento nel senso OOP) alert()per un particolare caso d'uso come il tuo, perché quando devi effettivamente utilizzare alert()senza modello, e probabilmente lo farai, allora avrai bisogno un'altra funzione non di avviso per farlo.


0

Ho riscontrato l'obbligo di mostrare un messaggio predefinito insieme ai messaggi di avviso effettivi. È così che sono riuscito a farlo.


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

L'ho provato su Chrome. Non sono sicuro che sia una buona pratica, ma serve allo scopo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.