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.