JavaScript: substituindo alerta ()

207

Alguém tem alguma experiência com a substituição da alert()função em JavaScript?

  • Quais navegadores suportam isso?
  • Quais versões do navegador suportam isso?
  • Quais são os perigos em substituir a função?
cllpse
fonte
Isso não é um loop infinito?
Piscina
1
@ Nick - não, não é. A função window.alert 'normal' será atribuída a window._alert. > Após <que a função window.alert seja redefinida.
Chris Shouts
@roosteronacid: Seu código era semanticamente e sintaticamente bom, embora artificial, como @ paper1337 apontou ... nenhuma chance de recursão lá, lol ... em essência, você acabou de trocar os corpos das funções _alertcomo uma espécie de expando temp em primeira instância.
Non-sequitor
Sim. Eu fiz um roll-back tu, a não obscurecer a questão :)
cllpse

Respostas:

210

Definitivamente, é "suportado". É a sua página da web, você faz o que quiser com ela.

Eu já fiz isso para rastrear eventos de análise sem modificar uma biblioteca, mas entrando nos eventos.

Use o padrão de proxy:

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

Você também pode ignorar a chamada para a função original, se desejar (em proxy)

Mais informações aqui: Tipos de JQuery #Proxy Pattern

Mike Gleason Jr. Couturier
fonte
+1 no padrão de proxy para substituir verdadeiramente a função e garantir que ela não seja adulterada!
21139 Josh Stodola
15
Ugh! apply()não está disponível em window.alertno Internet Explorer 8.
cllpse
Lamento ouvir que .. applyé um método do Functionobjeto. Portanto, eles devem explicitamente restringi-lo para alert?!
Mike Gleason Jr Couturier
4
Eles devem substituí-lo usando o padrão de proxy: D
Josh Stodola
Navegadores mais antigos não suportam isso e vai lançar uma exceção em "window.alert ="
Chris Pietschmann
23

Embora a maioria dos navegadores suporte a substituição, tenha cuidado com o que você está fazendo com ele.

Como a caixa de alerta padrão bloqueia o encadeamento de execução, algumas bibliotecas que dependem desse comportamento podem não funcionar mais (na melhor das hipóteses).

Você deve ser um bom cidadão e evitar tocar na API nativa. Se o fizer, você pode dividir as coisas ao usar código de terceiros.

No entanto, se você deseja redefinir o comportamento do alerta em um contexto específico, você pode anexá-lo a uma função anônima, como esta:

/* 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
fonte
15

Não há perigos na função de alerta Overring. Todo navegador suporta isso.

por exemplo:

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

alert('This is an override.');
user160820
fonte
11
Não poderia ser um perigo se a sua substituição é não bloqueante. Por exemplo, código que chama alert("Reloading")e recarrega a página da web. O texto do alerta pode nunca ser visto pelo usuário.
Darien
13

Penso que todas as implementações de Javascript suportam isso, e não há perigo envolvido. Geralmente é feito para substituir as caixas de alerta simples no estilo do sistema operacional por algo mais elegante com HTML / CSS. Fazer dessa maneira significa que você não precisa alterar o código existente! O fato de ser possível torna o Javascript incrível.

Josh Stodola
fonte
12

Como dito em muitas das outras respostas, você pode simplesmente substituir a função por

window.alert = null

ou

window.alert = function(){}

no entanto, isso não necessariamente substitui a função no protótipo do Windowconstrutor (observe a capital W), portanto o hacker ainda pode digitar:

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

portanto, você também precisa substituir essa função por:

Window.prototype.alert = null

ou

Window.prototype.alert = function(){}
Jack
fonte
Isso não necessariamente substitui a função em outros quadros. veja jsfiddle.net/18znqbjd/1
Robert
Robert: Sim e por boas razões. Quadros diferentes são basicamente documentos HTML diferentes, cada um com sua própria "instância" de Javascript.
Rolf
Você tem certeza de que Window.prototype.alert ainda é uma função em 2017? : P
iplus26
6

Ladislav.
Para o IE8, você pode redefinir alert () dessa maneira

/** 
 * 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 chame como

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

Minha experiência com a substituição da função alert () é que uma vez a usamos para "hackear" a versão de avaliação da biblioteca JavaScript que exibia "Please register!" Nag tela através do alerta de vez em quando.

Acabamos de definir nossa própria função alert () e pronto.

Foi apenas para fins de teste, compramos a versão completa mais tarde, então nada de imoral está acontecendo aqui ;-)

Josef Sábl
fonte
3

Todas as implementações de JavaScript nos navegadores modernos oferecem suporte à substituição.

Os perigos são muito simples: você deixaria outros membros da equipe absolutamente loucos, substituindo funções conhecidas como alert ().

Portanto, a menos que você esteja substituindo funções como uma ferramenta para depurar ou hackear o código existente de alguma forma, não vejo motivo para fazê-lo. Basta criar uma nova função.

Christopher Tokar
fonte
2

Com certeza funciona no Firefox e ie8. Não vejo que haja um navegador no qual ele não funcione. Isso é fundamental para o funcionamento do javascript, mesmo que nem sempre o veja usado com funções nativas como essa =)

David Hedlund
fonte
1
O navegador para segmentar especificamente seria o IE6, outros provavelmente concordariam com ele.
13139 AnthonyWJones
1

Um truque rápido que eu faço para descobrir de onde os alertas vêm, é acessar o console e inserir

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

Quando se trata de funções do navegador js, window.alerté preeminente e mais conhecido, pessoas que não sabem o que é js alert()- tenha certeza de que ele é suportado em todos os navegadores em uso hoje e seu snippet de código também. No entanto, eu não substituiria (bem, isso é mais como refatoração em vez de substituir no sentido de OOP) alert()para um caso de uso específico como o seu, porque quando você realmente precisa usar alert()sem modelo e provavelmente o fará, precisará outra função não alerta para fazer isso.

não sequestrador
fonte
0

Eu enfrentei um requisito para mostrar uma mensagem padrão junto com as mensagens de alerta reais. Foi assim que consegui fazer isso.


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

Eu testei no chrome. Não tenho certeza se é uma boa prática, mas serve ao propósito.

Badri nath
fonte