none
event.keyCode funcionava no XP e agora não no W7 RRS feed

  • Pergunta

  • Pessoal,

    Sou novo por aqui, desenvolvia em oura linguagem, agora trabalho num projeto com .Net, pretendo participar bastant por aqui. Vamos à questão.

    Fiz um formulário onde em um determinada caixa de texto o usuário conseguiria digitar apenas números

    dentro do page load:

    txCam.Attributes.Add("onkeypress", "if (event.keyCode < 48 || event.keyCode > 58) {event.keyCode = 0;}");

    Este formulário está num sistema intranet e ele sempre funcionou normalmente quando estava rodando no IIS do Windows XP, funcionando tanto no IE quanto no FF, porém usar o IIS do Windows 7, esta funcionalidade não funciona mais em nenhum browser.

    Acabo de fazer outro teste, coloquei o sistema novamente num pc com windows xp e rodei localhost e a funcionalidade do código acima funciona normalmente, ao rodar ele localhost numa máquina com Windows 7 o código não funciona.

    Alguém sabe me dizer o motivo?

    Até cheguei a fazer uma gambiarra, que até funcionou aqui no windows 7, mas não é o que quero, fica muito sujo, quando o usuário digitar letra dá um postback:

    txCam.Attributes.Add("onkeypress", "if(event.keyCode < 48 || event.keyCode > 58)__doPostBack('txCam','');");

    Sinal que a sintaxe é essa mesma, ao menos até a parte txCam.Attributes.Add("onkeypress", "if(event.keyCode < 48 || event.keyCode > 58) o problema deve ser o que vem depois disso. Tentei detalhar o máximo possível meu problema.
    Desde já obrigado!

    quarta-feira, 24 de outubro de 2012 16:17

Respostas

  • Corrigindo o código acima...

    Deve ficar assim:

    $(document).ready(function() {

    $("#ID_do_meu_Elemento").keyup(function (e) {

    if(e.which == 13)

    alert("Cliquei no Enter");

    });

    });

    A função $(document).ready(function() {}); Indica que o bloco de código interno só sera executado após o carregamento da página. Isso é necessário, pois se você colocar sem essa função o script executará antes da página carregar e assim não funcionará pois os elementos citados no script ainda não foram carregados.


    quarta-feira, 24 de outubro de 2012 17:36

Todas as Respostas

  • Angelo, 

    Sempre que preciso de um campo que aceite apenas numero faço da seguinte forma

    Crio minha função js

    function validaNumero(evento) {
                var tecla = event.keyCode;
                if ((tecla == 44 || tecla == 46) || (tecla > 47 && tecla < 58)) // numeros de 0 a 9
                    return true;
                else
                {
                    if (tecla != 8) // espaço
                        event.keyCode = 0; //return false;
                    else
                        return true;
                }
            }

    <asp:TextBox ID="txt1" runat="server" onkeypress="return validaNumero(event);" MaxLength="9"></asp:TextBox>

    []'s


    Bruno Viegas D. Ribeiro

    Analista Desenvolvedor de Sistemas
    www.brunoviegas.com.br
     

    quarta-feira, 24 de outubro de 2012 16:26
  • Olá Bruno,

    Muito obrigado pela resposta, eu fiz do jeito que você falou, mas no W7 continua sem funcionar, pela lógica o seu jeito é a mesma coisa que o meu, porém eu não crio a função, uso o javascript direto no código.

    Eu testei outa possibilidade que funcionou no windows 7:

         function is_int(event) {
             var Key = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
             if (Key == 13 || (Key >= 48 && Key <= 57)) return true;
             else return false;
         }
             </script>

    Em suma é o mesmo script, porém com a seguinte diferença:

    var Key = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;

    pelo que entendi, de igualar cada tipo de evento numa mesma variável, então independente de qual evento um browser específico usa, o evento ocorrerá. Desta forma funcionou, então desfiz e tentei fazer da forma que costumo fazer, sem criar uma função, e usar o js direto no código fazendo para cada tipo de evento:

    txCam.Attributes.Add("onkeypress", "if (event.keyCode < 48 || event.keyCode > 58) {event.keyCode = 0;}");

    txCam.Attributes.Add("onkeypress", "if ( event.which < 48 || event.which > 58) {event.which = 0;}");

    txCam.Attributes.Add("onkeypress", "if (event.charCode < 48 || event.charCode > 58) {event.charCode = 0;}");

    Porém, desta forma continua sem funcionar, só que não vejo a menor lógica em não funcionar, não consigo descobrir o motivo.

    Ou então usar a lógica da função que mencionei:

         function is_int(event) {
             var Key = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
             if (Key == 13 || (Key >= 48 && Key <= 57)) return true;
             else return false;
         }
             </script>

    Porém sem ter que criar a função, queria fazer a lógica direto no código:

    algo por exemplo, dentro do page load:

            var Key = "event.keyCode ? event.keyCode : event.which ? event.which : event.charCode";

            txCam.Attributes.Add("onkeypress", "if ('" + Key  + "' < 48 || '" + Key  + "' > 58) {'" + Key  + "' = 0;}");

    =============

    Porém não sei direito a sintaxe pra fazer de forma similar à da função sem ter que fazer a função, fazendo com js direto no código.

    Por exemplo usando esses "?", ":" que nunca usei, enfim..., direto no código (.cs).

    Desde já agradeço!

    quarta-feira, 24 de outubro de 2012 17:23
  • Olá,

    Rapaz, se você utilizar código javascript puro sempre ocorrerá chance de não funcionar pelo browser ou windows e etc. Aconselho você utilizar "jquery", que encapsula vários métodos javascript sendo que é executado cross-browser sem nenhum problema. Essa biblioteca está muto conhecida sendo que não há mais desenvolvimento web sem utilizar essa biblioteca, visto que a parte client-side das aplicações web cada vez mais ocupa espaço na aplicação.

    coloque está referência no header da página para utilizar a biblioteca jquery:

     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript">
        </script>

    Aí para fazer o que você está querendo, você pode fazer assim:

    Exemplo Didático:

    $("#ID_do_meu_Elemento").onkeyup(function (e) {

    if(e.which == 13)

    alert("Cliquei no Enter");

    });

    Neste bloco de código, declaro o evento "onkeyup" para o meu controle especificado. E assim declaro a função que será executada quando ocorrer o evento. Digo que se a tecla clicada for "Enter" dá um alert.

    quarta-feira, 24 de outubro de 2012 17:31
  • Eu utilize e mesmo código no W7.

    Qual o Pool de aplicação o seu site esta usando? eu já tive um problema com javascript e era o pool da aplicação, 

    eu sinceramente não conheço muito sobre configuração do IIS, mas é uma coisa que pode tentar ver


    Bruno Viegas D. Ribeiro

    Analista Desenvolvedor de Sistemas
    www.brunoviegas.com.br
     

    quarta-feira, 24 de outubro de 2012 17:34
  • Corrigindo o código acima...

    Deve ficar assim:

    $(document).ready(function() {

    $("#ID_do_meu_Elemento").keyup(function (e) {

    if(e.which == 13)

    alert("Cliquei no Enter");

    });

    });

    A função $(document).ready(function() {}); Indica que o bloco de código interno só sera executado após o carregamento da página. Isso é necessário, pois se você colocar sem essa função o script executará antes da página carregar e assim não funcionará pois os elementos citados no script ainda não foram carregados.


    quarta-feira, 24 de outubro de 2012 17:36
  • Faça o teste e informe se funcionou.

    Abraço!

    quarta-feira, 24 de outubro de 2012 17:36
  • Quando ele não funciona chega a gerar algum erro de script na página? é um código extremamente simples, não faz muito sentido não funcionar apenas por ser o windows 7, qualquer outro script funciona?
    quinta-feira, 25 de outubro de 2012 11:38