Ir para conteúdo
Fórum Script Brasil
  • 0

Quantos campos hidden há no form?


Carlos Rocha

Pergunta

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?

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 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;           
             }     
           }
     }
}

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros 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

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros 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

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros 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

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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();
}

Editado por fiote
Link para o comentário
Compartilhar em outros 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.

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros 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>

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros 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 =)

Editado por fiote
Link para o comentário
Compartilhar em outros 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

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros 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?

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...