Inquiridor
Função Javascript sem carregar a página inteira

Pergunta
-
Bom dia, Pessoal, tudo bom?
Seguinte, estou com um problema.
Tenho uma aplicação Web(Asp.NET/C#) que tem muitos div's, e eles piscam atráves de uma função javascript.
Até ai beleza, tenho essa função, os Div's piscam perfeitamente. O meu problema está no seguinte, tenho um Timer em Minha página que utilizo para atualizar um UpdatePanel a cada segundo, e no método pelo .CS eu chamo essa função javascript que pisca meus div's.
Estou passando dessa forma:
public void Atualizar(object sender, EventArgs e) { ScriptManager.RegisterStartupScript(this, this.GetType(), "Alarme", "window.onload = function(){setInterval('alerta1(" + alarmes.Atributo1 + ");alerta2(" + alarmes.Atributo2 + ");alerta3(" + alarmes.Atributo3 + ");alerta4(" + alarmes.Atributo4 + ");', 500)};", true); }
PAsso como parâmetro para essa função script um valor retornado do banco (0 ou 1).
O problema é que se ele executa uma vez e não tem erro nenhum (0), beleza, ai na próxima vez que ele atualizar, e pega um erro (1), minha função não pisca, pois a página não atualizou inteira. Ao contrário acontece igual, se a primeira vez tiver erro (1) e roda o script, pisca perfeitamente, mas ai nas outras vezes que não tiver mais erro, continua piscando, só´para se eu dar F5 na página.
Não sei como resolver isso, preciso que a função seja executada dinamicamente, já tentei de tudo.
Podem me ajudar, por favor?
Grato desde já!
Todas as Respostas
-
-
-
-
-
Para garantir que toda a página tenha sido carregada ao executar uma função JS, a função deve ser colocada no Head da página, pois ele é carregado antes do Body.
Suas funções (alerta1, alerta2..) estão no Head ?
Abraços,
Daniel Cheida de Oliveira -
-
Bom dia,
entendo que suas informações estão dentro de ContentPlaceHolder, a questão é, onde este Content está ? No Body ou no Head da página. Não se esqueça de que o resultado da sua página é sempre HTML, e quande se trata de JavaScript é com o momento da execução que você deve se preocupar.
Abraços,
Daniel Cheida de Oliveira -
-
-
-
-
-
-
-
Olá Programador.C,
Você esta atachando a função ao evento window.onload, mas o onload da pagina só ocorre em seu carregamento, o updatePanel não chama esse evento após o Update.
Para resolver isso tente chamar o evento Sys.WebForms.PageRequestManager.getInstance().add_endRequest:
ScriptManager.RegisterStartupScript( this, this.GetType(), "Alarme", "<script language='javascript'>Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(){alert('x');});</script>", false);
Fiz os testes e funcionou corretamente. -
-
Cara, até funcionou, chamei assim:
ScriptManager.RegisterStartupScript(this, this.GetType(), "Alarme", "<script language='javascript'>Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(){setInterval('alertaMMA(" + alarmes.AtributoSegmentoMMA1 + ");piscarBox1(" + alarmes.Intermitente1 + ");piscarBox2(" + alarmes.Intermitente2 + ");piscarBox3(" + alarmes.Intermitente3 + ");piscarBox4(" + alarmes.Intermitente4 + ");', 500)});</script>", false);
Mas ficou enlouquecido o pisque com o Set Interval e outra, ele demora pra piscar, não pisca assim que a página carrega...
Perfeito, tirando isso, acredito que funcionou perfeitamente, me salvou...
-
-
Olá Progamador.C
Tudo leva a conclusão que a função Javascript que esta errada.
No momento em que o servidor retornou a chamada javascript, ele não tem mais nenhuma interação com a função do lado do cliente, apenas a chamada.
Se após a chamada o comportamente não é o esperado, olhe a função js. Ou poste ela aqui.
Abraços.
Atenciosamente Fernando Henrique Silva www.metaora.com.br -
function alerta1(erro)//Caminhão { switch(erro) { case 0://NORMAL var div1 = document.getElementById('ctl00_cphConteudo_divMMA1'); var div2 = document.getElementById('ctl00_cphConteudo_divMMA2'); var div3 = document.getElementById('ctl00_cphConteudo_divMMA3'); var div4 = document.getElementById('ctl00_cphConteudo_divMMA4'); var div5 = document.getElementById('ctl00_cphConteudo_divMMA5'); div1.style.display = 'block'; div2.style.display = 'block'; div3.style.display = 'block'; div4.style.display = 'block'; div5.style.display = 'block'; break; case 1://Piscante var div1 = document.getElementById('ctl00_cphConteudo_divMMA1'); var div2 = document.getElementById('ctl00_cphConteudo_divMMA2'); var div3 = document.getElementById('ctl00_cphConteudo_divMMA3'); var div4 = document.getElementById('ctl00_cphConteudo_divMMA4'); var div5 = document.getElementById('ctl00_cphConteudo_divMMA5'); if(div1.style.display == 'block') { div1.style.display = 'none'; } else { div1.style.display = 'block'; } if(div2.style.display == 'block') { div2.style.display = 'none'; } else { div2.style.display = 'block'; } if(div3.style.display == 'block') { div3.style.display = 'none'; } else { div3.style.display = 'block'; } if(div4.style.display == 'block') { div4.style.display = 'none'; } else { div4.style.display = 'block'; } if(div5.style.display == 'block') { div5.style.display = 'none'; } else { div5.style.display = 'block'; } break; } }
Uma das funções é essa, as outras são "iguais"... -
Boa tarde Progamador.C
Na verdade, precisa mudar a função js, e a chamada dela!
seguinte, no final da função alerta, adicione o código:
if(countAlerta1 <=5) setTimeout(function () { alerta1(erro) }, 500); countAlerta1++;
Crie a variável countAlerta1 fora da função.
No if(countAlerta1 <=5), defina quantas vezes você quer que pisque.
A chamada das funções pelo servidor não deve ser chamado com o SetInterval, assim como eu havia postado anteriormente:
ScriptManager.RegisterStartupScript( this, this.GetType(), "Alarme", "<script language='javascript'>Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(){alert('x');});</script>", false);
Eu fiz um teste simples e funcionou, faça o teste.
Atenciosamente Fernando Henrique Silva www.metaora.com.br- Sugerido como Resposta Fernando Henrique A Silva quarta-feira, 4 de janeiro de 2012 10:32
-
-
-
Bom dia Progamador.C
Então, o setInterval deveria estar dentro da própria função, que é aquele código que postei com o setTimeout.
Atenciosamente Fernando Henrique Silva www.metaora.com.br -
-
Veja o código:
var countAlerta1 = 0; function alerta1(erro)//Caminhão { switch(erro) { case 0://NORMAL var div1 = document.getElementById('ctl00_cphConteudo_divMMA1'); var div2 = document.getElementById('ctl00_cphConteudo_divMMA2'); var div3 = document.getElementById('ctl00_cphConteudo_divMMA3'); var div4 = document.getElementById('ctl00_cphConteudo_divMMA4'); var div5 = document.getElementById('ctl00_cphConteudo_divMMA5'); div1.style.display = 'block'; div2.style.display = 'block'; div3.style.display = 'block'; div4.style.display = 'block'; div5.style.display = 'block'; break; case 1://Piscante var div1 = document.getElementById('ctl00_cphConteudo_divMMA1'); var div2 = document.getElementById('ctl00_cphConteudo_divMMA2'); var div3 = document.getElementById('ctl00_cphConteudo_divMMA3'); var div4 = document.getElementById('ctl00_cphConteudo_divMMA4'); var div5 = document.getElementById('ctl00_cphConteudo_divMMA5'); if(div1.style.display == 'block') { div1.style.display = 'none'; } else { div1.style.display = 'block'; } if(div2.style.display == 'block') { div2.style.display = 'none'; } else { div2.style.display = 'block'; } if(div3.style.display == 'block') { div3.style.display = 'none'; } else { div3.style.display = 'block'; } if(div4.style.display == 'block') { div4.style.display = 'none'; } else { div4.style.display = 'block'; } if(div5.style.display == 'block') { div5.style.display = 'none'; } else { div5.style.display = 'block'; } //######################################################## //######################################################## if(countAlerta1 <=5){//AJUSTE A QUANTIDADE PARA QUE AO FINAL, O PANEL FIQUE VISIVEL OU NÃO CONFORME NECESSIDADE setTimeout(function () { alerta1(erro) }, 500); countAlerta1++; } else{ countAlerta1=0; } //######################################################## //######################################################## break; } }
Repare que é a mesma função que você postou, com um código adicional que irá chamar a própria função X vezes.
A chamada:
ScriptManager.RegisterStartupScript( this, this.GetType(), "Alarme", "<script language='javascript'>Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(){alerta1(" + alarmes.Atributo1 + ");});</script>", false);
Aqui irá chamar a função alerta1 passando uma variável que retornará um inteiro.
Atenciosamente Fernando Henrique Silva www.metaora.com.br -
-
-
Olá Progamador.C!
Então, criei a mesma função e funcionou, apenas criei um Timer pra ficar chamando o servidor, e do servidor retorno o script que chama o javascript, tudo "lindo".
Execute a aplicação no Chrome, abra o Developer Tools, vá em Scripts, acha a pagina, coloque breakpoints na função e chame ela manualmente pelo commandline...
Acho que só debugando mesmo, como o meu exemplo funcionou, fiquei de mãos atadas, infelizmente...
Atenciosamente Fernando Henrique Silva www.metaora.com.br