JavaScript: le remplacement d'alerte()

Quelqu'un a-t-il une expérience avec la suppression de la fonction alert() dans JavaScript?

  • quels navigateurs supportent cela?
  • quelles versions de navigateur supportent cela?
  • Quels sont les dangers à passer outre la fonction?
195
demandé sur cllpse 2009-11-13 17:22:30

11 réponses

c'est définitivement"supporté". Il est de votre page web, vous faites ce que vous voulez avec elle.

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 motif de procuration:

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

Vous pouvez également ignorer l'appel à la fonction d'origine si vous voulez (proxy)

Plus d'infos ici: JQuery Types #Modèle de Proxy

196
répondu Mike Gleason jr Couturier 2015-09-09 07:45:12

bien que la plupart des navigateurs prennent en charge passer outre, soyez prudent avec ce que vous faites avec elle.

puisque la boîte d'alerte par défaut bloque le thread d'exécution, certaines bibliothèques qui se fient à ce comportement pourraient ne plus fonctionner (au mieux).

vous devez être un bon citoyen et éviter de toucher L'API native. Si vous le faites, vous pourriez briser les choses, en utilisant le code de tiers.

Pourtant, si vous voulez redéfinir l'alerte comportement dans un contexte spécifique, on pourrait l'enfermer dans une fonction anonyme, comme celle-ci:

/* 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);
22
répondu Pablo Cabrera 2009-11-13 16:53:41

il n'y a aucun danger à surcharger la fonction d'alerte. 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.');
14
répondu user160820 2011-11-02 20:42:17

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

13
répondu Josh Stodola 2009-11-13 14:34:45

Comme dit dans beaucoup d'autres réponses, vous pouvez simplement remplacer la fonction avec

window.alert = null

ou

window.alert = function(){}

cependant, cela ne remplace pas nécessairement la fonction sur le prototype du constructeur Window (notez la majuscule W ), de sorte que le pirate peut encore taper:

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

par conséquent, vous devez également annuler cette fonction avec:

Window.prototype.alert = null

ou

Window.prototype.alert = function(){}
9
répondu Jack 2014-02-23 02:44:14

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 appelez

alert('Hello, hacker!');
nalert('I am native alert');
alert('Hello, user!', Type.custom);
7
répondu Vitaliy R. 2011-02-22 13:58:08

D'après mon expérience avec la fonction overriding alert (), nous l'avons déjà utilisé pour "hacker" la version d'essai de la bibliothèque JavaScript qui affichait "please register!"nag screen à travers les temps d'alerte.

nous venons de définir notre propre fonction alert() et voila.

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

4
répondu Josef Sábl 2009-11-13 14:53:04

toutes les implémentations JavaScript dans les navigateurs modernes prennent en charge l'overriding.

les dangers sont tout simplement, que vous conduiriez les autres membres de l'équipe absolument fou en outrepassant les fonctions communément connues telles que alert().

donc à moins que vous ne soyez en train de supplanter des fonctions en tant qu'outil pour peut-être déboguer ou pirater du code existant d'une certaine manière, je ne vois aucune raison de le faire. Il suffit de créer une nouvelle fonction.

3
répondu Christopher Tokar 2009-11-13 14:57:19

ça marche avec firefox et ie8. Je ne vois pas de navigateur qui ne fonctionnerait pas. C'est assez fondamental du fonctionnement de javascript, même si on ne le voit pas souvent utilisé avec des fonctions natives comme cela=)

2
répondu David Hedlund 2009-11-13 14:27:26

un hack rapide que je fais pour trouver d'où viennent les alertes, est d'aller à la console et puis entrer ce

function alert(message) { 
  console.info(message);
  debugger;
} 
1
répondu zainengineer 2016-01-06 00:10:14

quand il s'agit de fonctions de navigateur js window.alert est prééminent et le plus connu, les gens qui ne savent pas js savent alert() -- soyez assuré qu'il est pris en charge dans tous les navigateurs en usage aujourd'hui et votre code snippet est ainsi. Cependant, je ne voudrais pas outrepasser (bien c'est plus comme refactoring plutôt que override dans le sens OOP) alert() pour un cas d'utilisation particulier comme le vôtre parce que lorsque vous avez réellement besoin d'utiliser alert() sans modèle, et vous probablement will, alors vous aurez besoin d'une autre fonction de non-alerte pour le faire.

-1
répondu non sequitor 2009-11-13 14:49:38