1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

NaN

Discussão em 'Web Development' iniciada por moriva, 8 de Maio de 2008. (Respostas: 8; Visualizações: 632)

  1. moriva

    moriva Power Member

    Dem uma olhada neste código e digam-me qual e o erro que faz mostrar nas caixas de texto "NaN" (not a number).

    <html>
    <head>
    <script language="Javascript">
    function mais1 () {
    form.set1_equipa1.value = parseInt(form.set1_equipa1.value)+1;
    }
    function menos1 () {
    var dec = parseInt(form.set1_equipa1.value);
    if (dec<=0){
    form.set1_equipa1.value=0;
    }else{
    form.set1_equipa1.value=dec-1;
    }
    }
    </script>
    <script language="Javascript">
    function mais2 () {
    form.set1_equipa2.value = parseInt(form.set1_equipa2.value)+1;
    }
    function menos2 () {
    var dec = parseInt(form.set1_equipa2.value);
    if (dec<=0){
    form.set1_equipa2.value=0;
    }else{
    form.set1_equipa2.value=dec-1;
    }
    }
    </script>
    <script language="Javascript">
    function mais3 () {
    form.set2_equipa1.value = parseInt(form.set2_equipa1.value)+1;
    }
    function menos3 () {
    var dec = parseInt(form.set2_equipa1.value);
    if (dec<=0){
    form.set2_equipa1.value=0;
    }else{
    form.set2_equipa1.value=dec-1;
    }
    }
    </script>
    <script language="Javascript">
    function mais4 () {
    form.set2_equipa2.value = parseInt(form.set2_equipa2.value)+1;
    }
    function menos4 () {
    var dec = parseInt(form.set2_equipa2.value);
    if (dec<=0){
    form.set2_equipa2.value=0;
    }else{
    form.set2_equipa2.value=dec-1;
    }
    }
    </script>
    <script language="Javascript">
    function mais5 () {
    form.set3_equipa1.value = parseInt(form.set3_equipa1.value)+1;
    }
    function menos5 () {
    var dec = parseInt(form.set3_equipa1.value);
    if (dec<=0){
    form.set3_equipa1.value=0;
    }else{
    form.set3_equipa1.value=dec-1;
    }
    }
    </script>
    <script language="Javascript">
    function mais6 () {
    form.set3_equipa2.value = parseInt(form.set3_equipa2.value)+1;
    }
    function menos6 () {
    var dec = parseInt(form.set3_equipa2.value);
    if (dec<=0){
    form.set3_equipa2.value=0;
    }else{
    form.set3_equipa2.value=dec-1;
    }
    }
    </script>
    <script language="JavaScript">
    function habilita()
    {
    var form = document.form;

    if (form.chk.checked){ //Se o checkbox estiver marcado,
    form.set3_equipa1.disabled = false;
    form.set3_equipa2.disabled = false; //habilita o campo
    }
    else{ //Se não,
    form.set3_equipa1.disabled = true;
    form.set3_equipa2.disabled = true; //desabilita o campo
    form.set3_equipa1.value='';
    form.set3_equipa2.value=''; //e limpa conteúdo.
    }
    }
    </script>
    </head>
    <body>
    <form name="form">
    <center>1ºSet
    <center><input type="button" name="botaomais1" value='+' onclick='mais1()'>
    <input type="button" name="botaomenos1" value='-' onclick='menos1()'>
    <input type="text" size="5" name="set1_equipa1">
    <input type="text" size="5" name="set1_equipa2">
    <input type="button" name="botaomais2" value='+' onclick='mais2()'>
    <input type="button" name="botaomenos2" value='-' onclick='menos2()'><p>
    2ºSet
    <center><input type="button" name="botaomais3" value='+' onclick='mais3()'>
    <input type="button" name="botaomenos3" value='-' onclick='menos3()'>
    <input type="text" size="5" name="set2_equipa1">
    <input type="text" size="5" name="set2_equipa2">
    <input type="button" name="botaomais4" value='+' onclick='mais4()'>
    <input type="button" name="botaomenos4" value='-' onclick='menos4()'>
    <p>
    3ºSet
    <center>
    <input type="checkbox" name="chk" value="s" onclick="habilita();"><p>
    <input type="button" name="botaomais5" value='+' onclick='mais5()'>
    <input type="button" name="botaomenos5" value='-' onclick='menos5()'>
    <input type="text" size="5" name="set3_equipa1" disabled="true">
    <input type="text" size="5" name="set3_equipa2" disabled="true">
    <input type="button" name="botaomais6" value='+' onclick='mais6()'>
    <input type="button" name="botaomenos6" value='-' onclick='menos6()'>
    <p>
    </form>
    </body>
    </html>

    Dica:Façam copiar/colar do codigo e abram com o browser para perceberem melhor.
    se conseguirem ajudem-me por favor.Obrigado!
     
    Última edição: 8 de Maio de 2008
  2. MPalhas

    MPalhas Power Member

    porque de inicio o javascript vai procurar um valor nas textbox e vai encontrar null. null é diferente de 0, e não é um número, logo ao fazer o parseInt e a conta ele vai estar a usar um NaN

    podes criar uma função para verificar se o conteudo é numerico, e se não for, considera 0

    e mudando de assunto, aquilo que tu ai fizeste com 6 funções diferentes, eu fazia com apenas uma função que recebia dois parametros, o objecto a afectar e o valor a incrementar/decrementar

    já para não falar do html que puseste ai. os <center> e os <p> fecham-se sabias?? e se estivermos a falar de XHTML, também os inputs, <input type...... />
     
  3. Mavors

    Mavors Power Member

    O MPalhas tem razão.

    Existem várias maneiras de fazer isso.
    Ou crias uma função com dois parametros de entrada, em que um deles vai ser o objecto para saberes qual o input a trabalhar e o outro o tipo de operação a fazer. A função é assim generica e não vais ter de criar uma nova função por cada input.

    Podes também criar um array em que cada posição corresponde a um nome, e por cada input crias uma nova entrada no array e passas apenas o indice a afectar.

    Há ainda duas coisas importantas tal como foi dito no post anterior: as tags fecham-se, e além disso não precisas de abrir e fechar o script por cada função criada. Fazeres <script language="JavaScript"></script> por cada uma é errado.
    O espaço contido no meio do script já serve para toda e qualquer função de javascript.
     
    Última edição: 8 de Maio de 2008
  4. moriva

    moriva Power Member

    Podiam me postar o codigo da função para verificar se o conteudo é numerico, e se não for, considerar como 0. Por favor.
    Obrigado:-D.
     
  5. Mavors

    Mavors Power Member

    Tens que meter em todos os inputs de texto um default value.

    Tipo <input type="text" size="5" name="set1_equipa1" value=0>

    A questão é que estás a fazer uma conversão de uma String para um inteiro de um valor que não existe (null), como tal ele rebenta. Com o value inicial a 0 isso já não acontece.

    Para controlares se o valor é númerico e meteres o valor que queres pões isto antes do parseInt e de acordo com cada inputbox:
    if (isNaN(form.set1_equipa1.value)){
    form.set1_equipa1.value='0';
    }

    Mas volto a frisar que estás a desenrascar problemas e não estás a construir um código como deve de ser.
    Assim vai ser complicado perceberes como se programa.
     
  6. Mavors

    Mavors Power Member

    Eu não tenho por hábito dar mais que soluções simples, até pq não é boa prática para o fórum.
    Não tomes isto como ponto de comparação, pq este fórum é para ajudar-te em partes especificas, não é para fazer programas nem te dar listas de código extensas. Geralmente ajuda-se o raciocinio e cada um faz por si.

    Mas parece que tás mesmo numa fase muito inicial e acho que para perceberes como é que as coisas devem ficar feitas também deves ter um ponto de comparação.

    O código, com incidência na parte lógica, feito da forma que penso ser a mais correcta, seria assim:

    Como podes ver 7 funções passaram para duas. E agora podes adicionar 30 mil input boxes que não vais ter de fazer nada na função principal.

    A parte do body praticamente não lhe toquei, a n ser nos onclicks. Hoje em dia usa-se CSS e XHTML. Passa pela w3c (http://www.w3.org/) e lê alguma coisa sobre o assunto que pode ser útil.
    Coisas como <p>, <center> e cenas não fechadas já não se usam há mto. Não quer dizer que não funcione, mas é uma péssima prática.

    Bom seguimento.
     
  7. MPalhas

    MPalhas Power Member

    mais correcto ainda seria, em vez de "mais" e "menos" no onClick, por os números 1 ou -1.
    deixava de ser necessário esses dois ultimos IFs.
    mas isso já são optimizações, secalhar já estou a complicar demais

    fiquei com uma duvida no teu codigo

    Código:
    function operacao (objecto, opr){
        if (objecto.disabled==true){
            alert("Não pode mudar o resultado. \nTem de activar a checkbox.") ;
        }
        else if (isNaN(objecto.value)){
            objecto.value=0;
            alert("Só podes introduzir números");
        }
        else [COLOR=Red]if(parseInt(objecto.value)>=0)[COLOR=White]{[/COLOR][/COLOR]
            dec=parseInt(objecto.value);
            if (opr=='mais'){
                objecto.value=dec+1;
            }
            if ((opr=='menos')&&(dec!=0)){
                objecto.value=dec-1;
            }
        }
    }
    
    qual é o objectivo daquela linha a vermelho?
     
  8. moriva

    moriva Power Member

    Como o meu projecto se trata de inserção de valores desportivos não poderia colocar valores negativos.
    Dai essa linha que assinalas-te a vermelho indicar isso mesmo.
    Obrigado por tudo!!!!
    Tinham razão eu sou principiante nesta materia mas quando puder irei ajudar.
     
  9. Mavors

    Mavors Power Member

    Seria para não incrementar positivamente um número negativo colocado pelo utilizador, uma vez que o isNaN não ia cobrir essa excepção.

    Para ficar correcto:
    Código:
    else [COLOR=Red]if(parseInt(objecto.value)>=0)[COLOR=White]{[/COLOR][/COLOR]
            dec=parseInt(objecto.value);
            if (opr=='mais'){
                objecto.value=dec+1;
            }
            if ((opr=='menos')&&(dec!=0)){
                objecto.value=dec-1;
            }
    }else{
                alert("Só pode introduzir números iguais ou maiores que zero.");
                objecto.value=0;
            }
    
    Mas agora validações é um mundo. A melhor maneira ainda era fazer por event.keyCode e o utilizador só introduzia valores entre 0-9 nas input boxes. Mas não quis complicar tanto.

    Concordo com o teu ponto do 1 -1, ficava mais prático. :)
     
    Última edição: 8 de Maio de 2008

Partilhar esta Página