none
Função Javascript sem carregar a página inteira RRS feed

  • 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á!
     

    sexta-feira, 9 de dezembro de 2011 10:20

Todas as Respostas

  • Ninguém? =/
    sexta-feira, 9 de dezembro de 2011 12:50
  • Alguém?
    sexta-feira, 9 de dezembro de 2011 15:25
  • Boa tarde,

    para ser sincero não entendi o motivo pela qual você executa o JavaScript pelo server-side. Qual a sua intenção ao fazer isso ? Seria vincular o Timer da página à execução do JS ?

    Abraços,


    Daniel Cheida de Oliveira
    sexta-feira, 9 de dezembro de 2011 16:03
  • Exato.

     

     

    sexta-feira, 9 de dezembro de 2011 16:28
  • 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
    sexta-feira, 9 de dezembro de 2011 17:03
  • Daniel, na verdade, eu uso Master Page, então essa página herda tudo da Master. Minhas funções estão dentro de um CONTENT nessa página...
    segunda-feira, 12 de dezembro de 2011 10:55
  • 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
    terça-feira, 13 de dezembro de 2011 13:03
  • Alguém?
    terça-feira, 20 de dezembro de 2011 12:30
  • esperimente colocar esse código no overide do evento Render da pagina,.,.,

    não esqueça de apó você fazer isso chamar o base.Render(). para que possa continuar a renderização


    Robson Gmack Programador e Fan .net \o/
    terça-feira, 20 de dezembro de 2011 12:56
  • Como faço isso?
    terça-feira, 20 de dezembro de 2011 13:07
  • Como resolve isso? =/

    Já estou sem alternativas...

    terça-feira, 20 de dezembro de 2011 15:50
  • Ninguém mesmo?
    quarta-feira, 21 de dezembro de 2011 09:43
  • Ninguém pode me ajudar mesmo? =/
    quinta-feira, 22 de dezembro de 2011 10:43
  • Alguém, por favor?
    quarta-feira, 28 de dezembro de 2011 10:06
  • 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.

     

     

     

    quarta-feira, 28 de dezembro de 2011 13:10
  • Só substitui o que já estou chamando ou chama a que eu já estou chamando e mais essa?
    terça-feira, 3 de janeiro de 2012 09:56
  • 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...

     

    terça-feira, 3 de janeiro de 2012 10:15
  • Na verdade, mesmo assim não funcionou..

     

    Testei agora, e se ele começa a piscar, não para mais, precisei dar um F5 pra parar de piscar... =/

    terça-feira, 3 de janeiro de 2012 10:22
  • 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
    terça-feira, 3 de janeiro de 2012 13:53
  • 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"...
    terça-feira, 3 de janeiro de 2012 14:39
  • 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
    terça-feira, 3 de janeiro de 2012 16:19
  • Se vc não quer que sua pagina pisque, basta utilizar o preventDefault(), da uma pesquisadinha é bem simples.
    terça-feira, 3 de janeiro de 2012 18:04
  • Não tem como fazer com o SetInterval, Fernando?

     

    Dessa forma que você fez não sei se seria viável...

    Queria manter o SetInterval.

    quarta-feira, 4 de janeiro de 2012 09:48
  • 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
    quarta-feira, 4 de janeiro de 2012 10:32
  • Entendi.

    Na chamada pelo servidor, eu preciso passar como parâmetro 0 ou 1, que vem do banco.

     

    Do modo que você colocou, não daria né?

    quarta-feira, 4 de janeiro de 2012 10:42
  • Progamador.C

     

    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
    quarta-feira, 4 de janeiro de 2012 13:11
  • Valeu, vou testar novamente.

    E já te falo.

     

    Muito obrigado ein, Fernando.

    quarta-feira, 4 de janeiro de 2012 13:33
  • Cara, fiz igualzinho, segui todos os passos...

     

    E não funcionou =/

    Ele até pisca, mas não para nunca mais se eu passar o atributo como 1 HAHA só se eu dar F5 ele para...

    quarta-feira, 4 de janeiro de 2012 14:49
  • 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
    quarta-feira, 4 de janeiro de 2012 16:52