NaN

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:
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...... />
 
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:
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.
 
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.
 
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:

<html>
<head>
<script language="Javascript">

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 if(parseInt(objecto.value)>=0){
dec=parseInt(objecto.value);
if (opr=='mais'){
objecto.value=dec+1;
}
if ((opr=='menos')&&(dec!=0)){
objecto.value=dec-1;
}
}
}

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=0;
form.set3_equipa2.value=0; //e limpa conteúdo.
}
}

</script>
</head>
<body>
<form name="form">
<center><p>1ºSet</p>
<p>
<input type="button" name="botaomais1" value='+' onclick='operacao(form.set1_equipa1, "mais")'>
<input type="button" name="botaomenos1" value='-' onclick='operacao(form.set1_equipa1, "menos")'>
<input type="text" size="5" name="set1_equipa1" value=0>
<input type="text" size="5" name="set1_equipa2" value=0>
<input type="button" name="botaomais2" value='+' onclick='operacao(form.set1_equipa2, "mais")'>
<input type="button" name="botaomenos2" value='-' onclick='operacao(form.set1_equipa2, "menos")'>
</p>
<p>
2ºSet
</p>
<p>
<input type="button" name="botaomais3" value='+' onclick='operacao(form.set2_equipa1, "mais")'>
<input type="button" name="botaomenos3" value='-' onclick='operacao(form.set2_equipa1, "menos")'>
<input type="text" size="5" name="set2_equipa1" value=0>
<input type="text" size="5" name="set2_equipa2" value=0>
<input type="button" name="botaomais4" value='+' onclick='operacao(form.set2_equipa2, "mais")'>
<input type="button" name="botaomenos4" value='-' onclick='operacao(form.set2_equipa2, "menos")'>
</p>
<p>
3ºSet
</p>
<p>
<input type="checkbox" name="chk" value="s" onclick="habilita();">
</p><p>
<input type="button" name="botaomais5" value='+' onclick='operacao(form.set3_equipa1, "mais")'>
<input type="button" name="botaomenos5" value='-' onclick='operacao(form.set3_equipa1, "menos")'>
<input type="text" size="5" name="set3_equipa1" disabled="true" value=0>
<input type="text" size="5" name="set3_equipa2" disabled="true" value=0>
<input type="button" name="botaomais6" value='+' onclick='operacao(form.set3_equipa2, "mais")'>
<input type="button" name="botaomenos6" value='-' onclick='operacao(form.set3_equipa2, "menos")'>
</p>
</center>
</form>
</body>
</html>
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.
 
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?
 
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.
 
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?

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:
Back
Topo