JavaScript: remplacement de l'alerte ()

207

Quelqu'un a-t-il une expérience de la substitution de la alert()fonction en JavaScript?

  • Quels navigateurs prennent en charge cela?
  • Quelles versions de navigateur prennent en charge cela?
  • Quels sont les dangers à contourner la fonction?
cllpse
la source
N'est-ce pas une boucle infinie?
Piscine du
1
@ Nick - non, ce n'est pas le cas. La fonction window.alert «normale» sera affectée à window._alert. > Après <, la fonction window.alert est redéfinie.
Chris Shouts
@roosteronacid: Votre code était sémantiquement et syntaxiquement correct, bien que artificiel, comme l'a souligné @ paper1337 ... aucune chance de récursivité là-bas lol ... en substance, vous venez d' échanger les corps de fonction avec _alertcomme une sorte de tempo expando dans un premier temps.
non séquenceur
Toujours. J'ai fait un retour en arrière, pour ne pas obscurcir la question :)
cllpse

Réponses:

210

C'est définitivement "supporté". C'est votre page Web, vous faites ce que vous voulez avec.

J'ai déjà fait cela pour suivre les événements analytiques sans modifier une bibliothèque, mais en me faufilant dans les événements.

Utilisez le modèle de proxy:

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

Vous pouvez également contourner l'appel à la fonction d'origine si vous le souhaitez (par procuration)

Plus d'informations ici: JQuery Types #Proxy Pattern

Mike Gleason jr Couturier
la source
+1 sur le modèle de proxy pour vraiment remplacer la fonction et s'assurer qu'elle ne soit pas altérée!
Josh Stodola
15
Pouah! apply()n'est pas disponible window.alertdans Internet Explorer 8.
cllpse
Je suis désolé d'entendre que .. applyest une méthode de l' Functionobjet. Ils doivent donc explicitement le restreindre pour alert?!
Mike Gleason jr Couturier
4
Ils ont dû le contourner en utilisant le modèle de proxy: D
Josh Stodola
Les navigateurs plus anciens ne le supportent pas et lèveront une exception sur "window.alert ="
Chris Pietschmann
23

Bien que la plupart des navigateurs prennent en charge le remplacement, faites attention à ce que vous en faites.

Étant donné que la boîte d'alerte par défaut bloque le thread d'exécution, certaines bibliothèques qui s'appuient sur ce comportement peuvent ne plus fonctionner (au mieux).

Vous devez être un bon citoyen et éviter de toucher à l'API native. Si vous le faites, vous pourriez casser les choses lorsque vous utilisez du code tiers.

Pourtant, si vous souhaitez redéfinir le comportement d'alerte dans un contexte spécifique, vous pouvez le joindre à une fonction anonyme, comme ceci:

/* 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);
Pablo Cabrera
la source
15

Il n'y a aucun danger dans la fonction d'alerte Overring. Chaque navigateur le supprime.

par exemple:

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

alert('This is an override.');
user160820
la source
11
Il pourrait y avoir un danger si votre remplacement n'est pas bloquant. Par exemple, un code qui appelle alert("Reloading")puis recharge la page Web. Le texte d'alerte pourrait ne jamais être vu par l'utilisateur.
Darien
13

Je pense que chaque implémentation Javascript supportera cela, et il n'y a aucun danger. Il est généralement fait pour remplacer les simples boîtes d'alerte de style OS par quelque chose de plus élégant avec HTML / CSS. Faire de cette façon signifie que vous n'avez pas à modifier le code existant! Le fait qu'il soit possible rend Javascript génial.

Josh Stodola
la source
12

Comme indiqué dans de nombreuses autres réponses, vous pouvez simplement remplacer la fonction par

window.alert = null

ou

window.alert = function(){}

cependant, cela ne remplace pas nécessairement la fonction sur le prototype du Windowconstructeur (notez le capital W), donc le pirate peut toujours taper:

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

par conséquent, vous devez également remplacer cette fonction par:

Window.prototype.alert = null

ou

Window.prototype.alert = function(){}
Jack
la source
Cela ne remplace pas nécessairement la fonction dans d'autres cadres. voir jsfiddle.net/18znqbjd/1
Robert
Robert: Oui et pour de bonnes raisons. Différents cadres sont essentiellement des documents HTML différents, chacun avec sa propre "instance" de Javascript.
Rolf
Êtes-vous sûr que Window.prototype.alert est toujours une fonction en 2017? : P
iplus26
6

Ladislav.
Pour IE8, vous pouvez redéfinir alert () comme ceci

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

et appeler comme

alert('Hello, hacker!');
nalert('I am native alert');
alert('Hello, user!', Type.custom);
Vitaliy R.
la source
4

D'après mon expérience avec la fonction d'alerte prioritaire (), nous l'avons utilisé pour "pirater" la version d'essai de la bibliothèque JavaScript qui affiche "Veuillez vous inscrire!" harceler l'écran à travers l'alerte de temps en temps.

Nous venons de définir notre propre fonction alert () et le tour est joué.

C'était à des fins de test uniquement, nous avons acheté la version complète plus tard, donc rien d'immoral ne se passe ici ;-)

Josef Sábl
la source
3

Toutes les implémentations JavaScript dans les navigateurs modernes prennent en charge la substitution.

Les dangers sont tout simplement que vous rendriez les autres membres de l'équipe complètement fous en remplaçant les fonctions connues telles que alert ().

Donc, à moins que vous ne remplaciez des fonctions comme un outil pour déboguer ou pirater le code existant d'une manière ou d'une autre, je ne vois aucune raison de le faire. Créez simplement une nouvelle fonction.

Christopher Tokar
la source
2

Cela fonctionne bien sur Firefox et IE8. Je ne peux pas voir qu'il y aurait un navigateur dans lequel il ne fonctionnerait pas. Ceci est à peu près fondamental du fonctionnement de javascript, même si on ne le voit pas souvent utilisé avec des fonctions natives comme ça =)

David Hedlund
la source
1
Le navigateur à cibler spécifiquement serait IE6, d'autres l'accepteraient probablement.
AnthonyWJones
1

Un hack rapide que je fais pour trouver d'où viennent les alertes, c'est d'aller sur la console puis d'entrer

function alert(message) { 
  console.info(message);
  debugger;
} 
zainengineer
la source
0

En ce qui concerne les fonctions du navigateur js window.alertest prééminent et le plus connu, les gens qui ne connaissent pas js savent alert()- soyez assuré qu'il est pris en charge dans tous les navigateurs utilisés aujourd'hui et que votre extrait de code l'est également. Cependant, je ne remplacerais pas (enfin cela ressemble plus à une refactorisation plutôt qu'à une substitution au sens de la POO) alert()pour un cas d'utilisation particulier comme le vôtre parce que lorsque vous devez réellement utiliser alert()sans modèle, et vous le ferez probablement, alors vous aurez besoin une autre fonction non alerte pour le faire.

non séquenceur
la source
0

J'ai été confronté à l'obligation d'afficher un message par défaut avec les messages d'alerte réels. C'est ainsi que j'ai réussi à le faire.


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

Je l'ai testé sur chrome. Je ne sais pas si c'est une bonne pratique, mais cela sert le but.

Badri nath
la source