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?

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


+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);

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.');

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.


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(){}

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

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


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.


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 =)


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

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.