Jump to content
Fórum Script Brasil
  • 0

Quantos campos hidden há no form?


Carlos Rocha
 Share

Question

Pessoal, como eu faço para saber quantos campos hidden há no form?

Fiz do jeito abaixo mas não deu certo.

A ideia é fazer um for com o numero de campos hidden que há no form

function valida_carrinho(form)
  {
     with (form) 
    {
           for (var i=0; i < elements.typeof("hidden").length; i++) 
           {
                  ......
           }
     }
}
onclick="return valida_carrinho(this.form)"

Como fazer isso?

Edited by Carlos Rocha
Link to comment
Share on other sites

Recommended Posts

  • 0

não é possivel achar a propriedade lenght .

A ideia é a seguinte:

function valida_carrinho(form)
  {
     with (form) 
    {
           for (var i=0; i < elements.typeof("hidden").length; i++) 
           {
             nome = elements[i].name;
             alert(nome);
             
             if (document.getElementById(nome).value > document.getElementById('hd'+nome).value)
             {
                 alert('Observe um dos produtos do carrinho\nVocê adicionou '+document.getElementById(nome).value+' \nPorem, só tem '+ document.getElementById('hd'+nome).value);
                 document.getElementById(nome).focus();
                 return false;           
             }     
           }
     }
}

Edited by Carlos Rocha
Link to comment
Share on other sites

  • 0

tambem tentei assim:

function valida_carrinho(form)
  {
    with (form) 
    {
        alert(elements.length);
     for (var i=0; i < elements.length; i++) 
     {
       nome = elements[i].name;
       alert(nome);
       if ((document.getElementById(nome).type=="hidden") || (document.getElementById(nome).type=="text"))
       {
         if (document.getElementById(nome).value > document.getElementById('hd'+nome).value)
         {
             alert('Observe um dos produtos do carrinho\nVocê adicionou '+document.getElementById(nome).value+' \nPorem, só tem '+ document.getElementById('hd'+nome).value);
             document.getElementById(nome).focus();
             return false;           
         }     
       }
     }
  }
}

Do jeito acima, e nesse momento, o form tem 2 campos text, 2 campos hidden e 1 campo submit.

O codigo imprime o primeiro alert que i nforma quantos camposa tem o form, informa o valor do nome do porimeiro campo text mas não informa o nome do segundo campo text

Parece que estou tendo erro de logica.

Meu form cria um campo text e um campo hidden para cada item adicionado no carrinho.

Precio comparar um com o outro

Edited by Carlos Rocha
Link to comment
Share on other sites

  • 0

Tive que mudar o codigo pois minha logica esta errada;

function valida_carrinho(form, itens)
  {
    with (form) 
    { 
     for (var i=0; i < itens; i++) 
     {
       nome = elements[i].name;
       
       alert(document.getElementById(nome).value);
       alert(document.getElementById('hd'+nome).value);
       
         if (document.getElementById(nome).value > document.getElementById('hd'+nome).value)
         {
             alert('Observe um dos produtos do carrinho\nVocê adicionou '+document.getElementById(nome).value+' \nPorem, só tem '+ document.getElementById('hd'+nome).value);
             document.getElementById(nome).focus();
             return false;           
         }     
     }
  }
}
Ta dando esse erro:
Linha: 9
Erro: Não é possível obter valor da propriedade 'value': o objeto é nulo ou não definido

O que acontece: o valor de itens, nesse, teste, é 2.

Então ele tenta fazer os alerts. faz duas vezes o alert pro primeiro e pro segundo campos quando chega no terceiro lê mas no quartp, fa erro

Ta tofa errada essa logica. Desse jeito ele vai ficar inciando o loop do primeira campo de novo em v ez de continuar pro campo de baixo

Edited by Carlos Rocha
Link to comment
Share on other sites

  • 0

Bom, meu form é esse abaixo:

para cada produto adicionado ao carrinho, eu crio um campo input que receberá o mesmo id e name do campo que carrega a quantidade de itens do produto porem trazendo o estoque daquele produto para comparar com a quantidade que o usuario adicionou.

<form method="post" action="altera_carrinho.php?op=atualizar" id="form_carrinho" name="form_carrinho">
  <tr>
    <td align='left'><font size=-1>Doce de Menta</font></td>
    <td align='center'><font size=-1>20</font></td>
    <td align='center'>R$ 3.24 </td>
    <td align='center'>
      <input style=\"text-align:right\" type="text" id="8"  name="8" size="2" value="20" onkeypress="BloqueiaLetras();" />
      <input type="hidden" id="hd8" name="hd8" value="20"
      </td>
    <td align='center'>R$ 64.80</td>          
    <td align='center'><b><a href="carrinho.php?op=excluir&id_prod=8">Excluir</a></b></td>
  </tr>
        
  <tr>
    <td align='left'><font size=-1>Pós de Mico Boa Sorte</font></td>
    <td align='center'><font size=-1>35</font></td>
    <td align='center'>R$ 2.33 </td>
    <td align='center'>
      <input style=\"text-align:right\" type="text" id="7"  name="7" size="2" value="20" onkeypress="BloqueiaLetras();" />
      <input type="hidden" id="hd7" name="hd7" value="35"
      </td>
    <td align='center'>R$ 46.60</td>          
    <td align='center'><b><a href="carrinho.php?op=excluir&id_prod=7">Excluir</a></b></td>
  </tr>
  <tr>
  <tr>
      <td align="center" colspan="7"> 
         <input type="button"  onclick="return valida_carrinho(this.form, 2)" value="Atualizar" name="Atualizar" WIDTH="78" HEIGHT="20" /><br>
      </td>
  </tr>  
</form>

É isso que eu preciso fazer.

Nesse caso ai, produtos inventados, tem dois produtos

Edited by Carlos Rocha
Link to comment
Share on other sites

  • 0

Carlos,

O problema com o seu script é que ele está iterando todos os campos do formulário, e em cada iteração você tá tendando achar o campo oculto.

PRIMEIRO INPUT: <input style=\"text-align:right\" type="text" id="8" name="8" size="2" value="20" onkeypress="BloqueiaLetras();" />

nome = 8;

alert(document.getElementById('8').value); -- Ok!

alert(document.getElementById('hd8').value); -- Ok!

SEGUNDO INPUT: <input type="hidden" id="hd8" name="hd8" value="20" (tá faltando fechar a tag aqui ein, mas ok)

nome = hd8;

alert(document.getElementById('hd8').value); -- Ok!

alert(document.getElementById('hdhd8').value); -- Erro: Não é possível obter valor da propriedade 'value': o objeto é nulo ou não definido

Conseguiu ver o problema?

Link to comment
Share on other sites

  • 0

Ví sim.

Mas não estou conseguindo contornar.

Resolvi fazer o seguinte:

deu um name tambem para o type text igual fiz com o input 'hd'+campo

<td align='center'>
  <input style=\"text-align:right\" type="text" id="text<?php echo $id;?>"  name="text<?php echo $id;?>" size="2" value="<?php echo $_SESSION["MeuCarrinhoAltera"]->ObtemQuantidadeItem($id);?>" onkeypress="BloqueiaLetras();" />

   <input type="hidden" id="<?php echo "hd".$id;?>" name="<?php echo "hd".$id;?>" value="<?php echo $estoque;?>" />
</td>

Mas a logica não estou conseguindo implementar

Link to comment
Share on other sites

  • 0

Mudar o nome/id do campo não vai servir de nada. Você não está entendendo sua própria lógica.

Tenta assim:

function valida_carrinho(form, itens) {
    with (form) { 
        for (var i=0; i < itens; i++) {                    
            tipo = elements[i].type;            
            if (tipo != 'hidden') { 
            
                nome = elements[i].name;
                alert(document.getElementById(nome).value);
                alert(document.getElementById('hd'+nome).value);

                if (document.getElementById(nome).value > document.getElementById('hd'+nome).value) {
                    alert('Observe um dos produtos do carrinho\nVocê adicionou '+document.getElementById(nome).value+' \nPorem, só tem '+ document.getElementById('hd'+nome).value);
                    document.getElementById(nome).focus();
                    return false;           
                }     
            }            
        }
    }
}

Link to comment
Share on other sites

  • 0

Desse jeito ele não retorna erro nem prossegue.

Retornar erro ele retorna sim. Testei colocar 30 e ele reclamou que só tinha 20 (IE, firefox e Chrome).

Porém, sobre não prosseguir: Bem, porque ele deveria prosseguir? você não mandou ele prosseguir em lugar nenhum.

Esse return true/false que você tentou usar no onclick do button só funciona no onsubmit. E ele pode falhar quando tem alerts envolvidos. De qualquer forma, mesmo que funcionasse, você não colocou "return true" em nenhum lugar do seu código, portanto ele nunca iria submeter.

Tenta assim:

function valida_carrinho(form, itens) {
    var tudo_ok = true; // inicia supondo que tudo está certo
    with (form) { 
        for (var i=0; i < itens; i++) {                    
            tipo = elements[i].type;            
            if (tipo != 'hidden') { 
            
                nome = elements[i].name;
                if (document.getElementById(nome).value > document.getElementById('hd'+nome).value) {
                    alert('Observe um dos produtos do carrinho\nVocê adicionou '+document.getElementById(nome).value+' \nPorem, só tem '+ document.getElementById('hd'+nome).value);
                    document.getElementById(nome).focus();
                    tudo_ok = false; // se der problema, marca a flag como false
                }     
            }            
        }
    }
    // se ainda estiver tudo ok, submete o formulário
    if (tudo_ok) form.submit();
}

Edited by fiote
Link to comment
Share on other sites

  • 0

Aqui

Tentei no ie e no firefox.

Nos dois ele deixou submeter o form mesmo com valor acima do estoque

Em baixo, um print screem da tela.

No caso, dois produtos ficticios.

carrinho.png

A ideia é que para cada produto do carrinho eu crio um outro hiden com o memo name e id mas com 'hd' na frente.

Preciso comparar se o value hd do produto é maior que o digitado no campo quantidade.

Edited by Carlos Rocha
Link to comment
Share on other sites

  • 0

Compra ou atualiza?

Na duvida, vai o form todo:

<form method="post" action="altera_carrinho.php?op=atualizar" id="form_carrinho" name="form_carrinho">
<table BORDER=0 WIDTH="95%" align="center">
<tr BGCOLOR="#0080C0"><td align="center" colspan="9">Pedido: 37</td></tr>
<tr BGCOLOR="#004080">
  <td align="center" width="30%">Produto</td>
  <td align="center" width="10%">Estoque</td>
  <td align="center" width="15%">PRE&Ccedil;O UNIT&Aacute;RIO</td>
  <td align="center" width="15%">Quant.</td>
  <td align="center" width="15%">TOTAL</td>
  <td align="center" width="15%">EXCLUIR</td>
</tr>

<tr>
  <td align='left'><font size=-1>Doce de Menta</font></td>
  <td align='center'><font size=-1>20</font></td>
  <td align='center'>R$ 3.24 </td>
  <td align='center'>
    <input style="text-align:right" type="text" id="8"  name="8" size="2" value="20" onkeypress="BloqueiaLetras();" />
    <input type="hidden" id="hd8" name="hd8" value="20" />
  </td>
  <td align='center'>R$ 64.80</td>          
  <td align='center'><b><a href="carrinho.php?op=excluir&id_prod=8">Excluir</a></b></td>
</tr>
      
<tr>
  <td align='left'><font size=-1>Pós de Mico Boa Sorte</font></td>
  <td align='center'><font size=-1>35</font></td>
  <td align='center'>R$ 2.33 </td>
  <td align='center'>
    <input style="text-align:right" type="text" id="7"  name="7" size="2" value="45" onkeypress="BloqueiaLetras();" />
    <input type="hidden" id="hd7" name="hd7" value="35" />
  </td>
  <td align='center'>R$ 104.85</td>          
  <td align='center'><b><a href="carrinho.php?op=excluir&id_prod=7">Excluir</a></b></td>
</tr>

<tr>
<td align="center" colspan="7"> 
   <input type="button"  onclick="return valida_carrinho(this.form, 2)" value="Atualizar" name="Atualizar" WIDTH="78" HEIGHT="20" /><br>
</td>
</tr>  
</table>
</form>

Edited by Carlos Rocha
Link to comment
Share on other sites

  • 0

FUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU

Não acredito que gastei tampo tempo nisso PQP

onclick="return valida_carrinho(this.form, 2)"

Esse 2 (pelo seu código) quer dizer que ele vai olhar 2 inputs.

- Ele olha o primeiro, compara o valor.

- Ele olha o segundo (que é hidden), e passa.

----- ele para aqui. afinal já olhou dois inputs.

E com isso ele não checa o valor do "segundo" campo. Aqui funcionou direitinho porque eu estava testando o valor do "primeiro" campo. Pra você "não estava funcionando" porque você provavelmente estava tentando no "segundo" campo.

Mudae e tenta de novo =)

Edited by fiote
Link to comment
Share on other sites

  • 0

Mas ai o que eu faço pois o o button tambem é input?

multipliquei por 2( um text e um hidden)

funcionou mas quando tiver n produtos.

Será que não vai dar pau?

E mesmo assim ta parando em qualquer valor colocado. menor ou maior que o estoque

To achando que o certo é contar quantos input type text tem.

Como faz essa contagem?

Tentei:

alert(length(elements.type="text"));

mas deu erro

Edited by Carlos Rocha
Link to comment
Share on other sites

  • 0

Uma opinião:

function valida_carrinho(form, itens) 
{
    with (form) 
    {       
        j=0;
        for (var i=0; i < (itens-1)*2; i++) 
        {              
              if (elements(j).value > elements(j+1).value) 
              {
                  alert('Observe um dos produtos do carrinho\nVocê adicionou '+elements(j).value+' \nPorem, só tem '+ elements(j+1).value);
                  elements(j).focus();
                  exit;
              }                     
              j=j+2;
        }
        form.submit();
    }
}

O parâmetro itens, entregará a quantidade de produtos adicionados ao carrinho.

Como para cada produto adicionado ao carrinho eu tenho um campo text e um hidden, então, fiz itens-1(o input button) e multiplicado por 2(que é o niumero de campos text e hidden que terpa o formulario.

Será que essa lógica ta certa?

Edited by Carlos Rocha
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.9k
    • Total Posts
      648.8k
×
×
  • Create New...