» Início » Desenvolvimento » Ajax » Sobrescrevendo função Alert do Javascript
 
Avaliação: | Publicado em: 17/08/2007
Sobrescrevendo função Alert do Javascript
Luciano Bianchi é desenvolvedor Java, trabalha com desenvolvimento de sistemas pra web há mais de 4 anos, onde já atuou em grandes empresas como o Banco do Brasil, desenvolvendo no centro de tecnologia.


Satisfação,

preparei este artigo pois agora com as possibilidades da web 2.0 e a mais nova moda da internet, o AJAX, vemos várias aplicações utilizando componentes UI que bloqueiam o browser e exibem determinada mensagem na tela.

Uma outra alternativa para se fazer isso, seria sobrescrever a função alert do javascript, podendo personalizar a janela da forma que desejar, pois o grande problema de se utilizar vários alerts em uma aplicação web moderna é o design ultrapassado e sem recursos do alert.

Para tal tarefa utilizaremos o plugin jQuery, um component Ajax muito poderoso que se encontra disponível no site http://docs.jquery.com/Plugins
O javascript jquery.js é a base dos outros componentes, sem ele não funciona, e para a tarefa específica de sobrescrever o alert utilizaremos o jqModal.js, também disponível no site e em anexo neste artigo.


Mãos a obra, vamos criar um javascript chamado dialog.js, e nele vamos utilizar os componentes disponíveis no jqModal para sobrescrever as funções de alert e também de confirm do javascript, o código desse js ficará assim:

function invocaDialog(){
    $('#alert').jqm({
        overlay: 60,
        overlayClass: 'overlay',
        modal: true,
        trigger: false
    });
    $('#confirm').jqm({
        overlay: 60,
        overlayClass: 'overlay',
        modal: true,
        trigger: false
    });
    confirm("Deseja ler o restante do arquivo?", "index.html");
    //alert("Alerta em JavaScript");
}
function alert(msg) {
  $('#alert')
    .jqmShow()
    .find('div.jqmAlertContent')
    .html("<span>" + msg + "</span>")
    .end()
    .find(':submit:visible')
    .click(function() {
        $('#alert').jqmHide();
    });
}
function confirm(msg,callback) {
  $('#confirm')
    .jqmShow()
    .find('p.jqmConfirmMsg')
    .html("<span>" + msg + "</span>")
    .end()
    .find(':submit:visible')
    .click(function(){
        if(this.value == 'Sim')
          (typeof callback == 'string') ?
            window.location.href = callback :
            callback;
        $('#confirm').jqmHide();
    });
}

As functions alert e confirm, são responsáveis por sobrescrever elas mesmas, repare que existe uma diferença apenas entre elas, a função confirm recebe um parâmetro a mais "callback", este parâmetro é a página que deverá ser redirecionada caso o usuário clique na opção "SIM" do confirm.

A função invocaDialog, será a função chamada para a exibição do alert ou confirm, essa função configura alguns parâmetros para a exibição personalizada, e ao final dela existem duas chamadas, essas chamadas com certeza vocês já conhecem, são as básicas para alert e confirm, basta passar qual você quer sobrescrever, eu coloquei as duas para mostrar, porém o confirm está comentado, pois não tem muita lógica chamar um alert e um confirm juntos, em alguns casos pode até ser útil.

Agora vamos para onde a mágica acontece, até aqui tudo muito simples, devemos agora somente personalizar nosso alert, e para isso configuramos o arquivo CSS chamado estilo.css, nele personalizamos todo o alert, para tal deve-se ter uma noção básica de CSS, o nome dos estilos ajudam na identificação do que será renderizado, então basta mudar para o padrão desejado.
Podemos inclusive incluir imagens para personalização, podemos fazer qualquer configuração suportada pelo CSS, um exemplo segue abaixo:

div.jqmAlert .jqmClose,
div.jqmConfirm .jqmClose {
  width:20px;
  height:20px;
  display:block;
  float:right;
  clear:right;
  background:transparent url(sair.gif) 0 0 no-repeat;
}

Como o nome já sugere, esse estilo é responsável por fechar o alert, nele incluí umagem de fundo, na linha:

background:transparent url(sair.gif) 0 0 no-repeat;

A imagem utilizada está nos anexos do arquivo.

Para finalizar o tutorial devemos chamar a nova função alert ou confirm a partir da página HTML ou JSP, então utilizamos as seguintes divs, que ficarão escondidas através da configuração no CSS, e só serão exibidas ao chamar a função.

        <!-- Alert Dialog -->

        <div class="jqmAlert" id="alert">
            <div class="jqmAlertWindow">
                <div class="jqmAlertTitle clearfix">
                    <a href="#" class="jqmClose"><em>Fechar</em></a>   
                    <h1>Alert Personalizado em JavaScript</h1>
                </div>
                <div class="jqmAlertContent"></div>
                <input type="submit" value="Ok" />

            </div>
        </div>
       
        <!-- Confirm Dialog -->
       
        <div class="jqmConfirm" id="confirm">
            <div class="jqmConfirmWindow">
                <div class="jqmConfirmTitle clearfix">
                    <a href="#" class="jqmClose"><em>Fechar</em></a>
                    <h1>Confirm Personalizado em JavaScript</h1>

                </div>
                <div class="jqmConfirmContent">
                    <p class="jqmConfirmMsg"></p>
                </div>
                <input type="submit" value="Não" />
                <input type="submit" value="Sim" />
            </div>
        </div>

Esse código pode ficar dentro das tags <body></body>
Para chamar a função eu coloquei um link sem caminho, que chama apenas a função invocaDialog(); como descrito abaixo:

<a href="#" onclick="invocaDialog()">Chamar Função</a>

Não podemos esquecer também de incluir os js e o css na página, para tal dentro das tags <head></head> incluímos o código:

<link href="estilo.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jqModal.js"></script>
<script type="text/javascript" src="dialog.js"></script>

Abaixo segue a imagem do meu alert personalizado



O código foi testado nos browsers Firefox e IE, em ambos funciona perfeitamente.
Espero que tenham gostado do tutorial e que seja útil, qualquer dúvida entrem em contato.

A - AKAHAI
L - LÔKAHI
O - OLU’OLU
H - HA’AHA’A
A - AHONUI

Luciano Bianchi


Eduardo Stuart <eduardo@eduardostuart.com>
bem explicado
muito bom , parabéns ;)


http://blog.eduardostuart.com
ele nao funciono aki nao ele da erro no jQuery.js.
.
close:function(s){var h=hashs;h.a=false;
if(ma.length != 0){ma.pop();if(ma.length == 0)mf('unbind');}
if(h.c.onHide)h.c.onHide(h);else{h.w.hide();if(h.o)h.o.remove();} return false;
}};
var s=0,hash={},ma=,ie6=.browser.msie && typeof XMLHttpRequest == 'function',
i=('<iframe class="jqm"></iframe>').css({opacity:0}),
f=function(h){if(ie6)if(h.o)h.o.html('<p style="width:100%;height:100%"/>').prepend(i);else if(('iframe.jqm',h.w).length == 0)h.w.prepend(i);
h.f=(':input:visible',h.w)0h.w0;h.f.focus();},
mf=function(t){()t("keypress",m)t("keydown",m)t("mousedown",m);},
m=function(e) {var h=hashmama.length-1, r=(!(e.target).parents('.jqmID'h.s).length == 0);if(!r)h.f.focus();return r;},
hs=function(w,e,y){var s=;w.each(function(){s.push(this._jqm)});
(e).each(function(){if(thisy).extend(thisy,s);else{thisy=s;(this).click(function(){for(var i in {jqmShow:1,jqmHide:1})for(var s in thisi)if(hashthisis)hashthisis.wi(this);return false;});}});};
})(jQuery); <-- nessa linha
.
fala que jQuery nao foi definida e sim eu importei ela na jsp. se mesmo assim tento executar .
ele da erro no alert

function invocaDialog(){
('#alert').jqm({
overlay: 60,
overlayClass: 'overlay',
modal: true,
trigger: false

da erro na trigger: false ele fala que ("#alert").jqm is not a function
Derick,

manda os fontes para o meu email do jeito que ta aí, que dou uma olhada, pois é algum erro de importação ou chamada.

Abraços! : Não avaliado
Rita Staley <trinity.134@gmail.com>
Oi Luciano, achei muito bom teu artigo, apesar de estar iniciando em programação...preciso d mais informações a respeito. Aguardo teu contato c/ o propósito de tirar duvidas.
Um abraço!
Ezequiel <elgodoy@gmail.com>
Fera, tentei chamar a função alert aqui , mas não consegui.
Podes me dar uma mão?

Olá Ezequiel,

passa o erro que está ocorrendo, ou me manda um e-mail com seus fontes que dou uma olhada e te repasso.

Abraços!! : Não avaliado
André Karkoski <drezao@gmail.com>
Excelente artigo, muito bem explicado, funcionou de prima.
Parabéns
Sipmann
boa cara.... belo tuto... eu soh dei uma modificada para ficar um poco mais dinamico... adicionei uma variavel para onde eu quero que o confirm vá!

VLW e belo tuto!!!!
parabéns
Marcelo Ferreira <marcelodiegues@bol.com.br>
Luciano estou com problemas. O codigo no firefox funciono blz, mas no ie a div do alert ficou por baixo do background e nao consigo clicar nela. Gostaria de saber se vc tem alguma solucao
Me manda o seu código para eu dar uma olhada. : Não avaliado
Cara blz, valeu a tentativa, porém o que voce fez não foi um alert não. Foi apenas chamar um div bloqueado. E que gastou milhoes de coisas para fazer
Cara, cade o alert funcionando, você so colocou um div chamando no meio da tela, e ainda o codigo ficou gigante. cade o alert funcionando
Caro Rafael,

se você não conseguiu fazer funcionar seguindo os passos do artigo, deve ter algum erro no que você digitou, pois o pessoal acima conseguiu fazer direitinho...
e para esclarecer, o alert do javascript É UMA DIV, então nós sobrescrevemos a função dando o mesmo nome, "alert", ou seja, essa função é a mesma que é chamada quando você invoca o alert do javascript na função alert() e passando o parametro para ele.. porém no meu exemplo, vc deve chamar a função invocaDialog() que é generica para o alert() e o confirm(), e nessa função vc define o que vc vai chamar e os parametros.

Grato. : Não avaliado
"a função confirm recebe um parâmetro a mais "callback", este parâmetro é a página que deverá ser redirecionada caso o usuário clique na opção "SIM" do confirm"

No es cierto que deba ser una página. El parámetro callback puede ser una cadena, la cual sí debería contener la dirección a una página web, o bien puede ser UNA FUNCIÓN CALLBACK. Si uno se lee el código, queda bastante claro:

(typeof callback == 'string') ?
window.location.href = callback : callback;

El código anterior es equivalente a un IF - THEN - ELSE (en caso de que no conozcas el operador ternario).

Es decir, puedes hacer que te dirija a una página web o hacer cualquier otra cosa que quieras en javascript pasándole la función callback que desees.