Jump to content


carcleo

Member Since 25/01/2005
Offline Last Active 01/02/2014, 09:38
-----

Topics I've Started

Java Script Validação Em Loop

01/02/2014, 07:25

Pessoal, bom dia!

Preciso de ajuda para localizar uma falha.


Tenho um formulário html obviamente com vários campos.

Estou usando uma função valida JavaScript que faz o seguinte:

1) Varre o formulário em busca dos elementos em um for atribuindo índice 'i' à cada campo.
2) Apenas valida se os campos input forem dos tipos text, button ou radio.
3) De fato, tenho dois campos radio no formulário que habilitam(s)/desabilitam(n) outro campo do formulário.
4) Partindo desse raciocínio,do primeiro campo radio(o que habilita o outro campo), até o campo a ser habilitado São 2 campos a saber: o segundo radio (o que desabilita) e o campo a ser habilitado)
5) Então, dos campos que passam pela validação de serem radio, button ou text, eu filtro assim:
Se for radio, e se não for.
Caso radio, eu verifico a propriedade id do campo (não pode ser a propriedade name pois os names estão sendo criadas e forma de array (nomeCampo[0][0] e então o JavaScript não reconhece), e, de posse do id, pego seu valor e comparo: Se o radio estiver marcado E seu valor for 's' , valida habilita o segundo campo e o valida. Senão, não faz nada.

Bom, ai é que esta o problema: O scritpt chega dentrro do filtro por radio, text e button, entra no filtro de radio. Aqui entramos no filtro por radio com o primeiro radio, o do value='s', ele esta marcado, então, o outro campo é habilitado e seu valor validade corretamente. Acontece que, caso o radio com value 'n' seja o que esta marcado, a função continua cobrando a validação embora não habilite o segundo campo.

Onde será que esta o erro?

Eis a unção JavaScript
function valida_cad_empresa2(form)
{
	for (i=0;i<document.gravatipos.elements.length;i++)
	{
	  if (
		  (document.gravatipos.elements[i].type == 'text')	|| 
		  (document.gravatipos.elements[i].type == 'radio')	|| 
		  (document.gravatipos.elements[i].type == 'textarea')
		 )
	  {
		  if(document.gravatipos.elements[i].type=='radio')
		  {
			idCampo=document.gravatipos.elements[i].id;
	
			//alert('Id: '+idCampo+', Marcado? '+document.getElementById(idCampo).checked+', Valor? '+document.getElementById(idCampo).value);

			if((document.getElementById(idCampo).checked==true) &&  (document.getElementById(idCampo).value=='s'))
		    {
   		      if(document.gravatipos.elements[i+2].value=='')	
			  {
				alert("Campo obrigatório!");
				document.gravatipos.elements[i+2].focus();
				return (false);			
			  }			
			}
		  }
		  else 
		  {
			if(document.gravatipos.elements[i].value == "")
			{
			  alert("Campo obrigatório!");
			  document.gravatipos.elements[i].focus();
			  return (false);			
			}
     	  }
	  }
	}
	form.submit();
 }
Adicionei ao códgo, como pode ser visualizado, um alert para ver a saída.
Quando o capo da vez é o radio co value='s', a saída é:
Id: taxa_cad_empresass[3], Marcado? n, Valor: s
E o segundo radio:
Id: taxa_cad_empresasn[3], Marcado? s, Valor: n
Por que será que esta pedindo a validação mesmo assim?
O Trecho do HTML
...
  <label  class='passo2'>Taxa de Servi&ccedil;o?</label> : <input type="radio" name="taxa_cad_empresas[<?php echo $servico;?>]" id="taxa_cad_empresass[<?php echo $servico;?>]" value="s" onclick="abre('taxa[<?php echo $servico;?>]')" /> Sim &nbsp; &nbsp; &nbsp;<input type="radio" name="taxa_cad_empresas[<?php echo $servico;?>]" id="taxa_cad_empresasn[<?php echo $servico;?>]" value="n" onclick="fecha('taxa[<?php echo $servico;?>]')"  checked="checked" /> N&atilde;o<br />
  
  <div id="taxa[<?php echo $servico;?>]" style="display:none">
      <label  class='passo2'>Valor </label> : <input type="text" name="taxaValor_cad_empresas[<?php echo $servico;?>]" id="taxaValor_cad_empresas[<?php echo $servico;?>]" value="" class="real"/>
  </div><br />
...

consegui:
function valida_cad_empresa2(form)
{
for (i=0;i<document.gravatipos.elements.length;i++)
{
 if (
 (document.gravatipos.elements[i].type == 'text') || 
 (document.gravatipos.elements[i].type == 'radio') || 
 (document.gravatipos.elements[i].type == 'textarea')
)
 {
 if(document.gravatipos.elements[i].type=='radio')
 {
idCampo=document.gravatipos.elements[i].id;

if((document.getElementById(idCampo).checked==true) &&  (document.getElementById(idCampo).value=='s'))
   {
          if(document.gravatipos.elements[i+2].value=='') 
 {
alert("Campo obrigatório!");
document.gravatipos.elements[i+2].focus();
return (false); 
 } 
}
 }
 else 
 {
if(document.gravatipos.elements[i].name.substr(0,22) != "taxaValor_alt_empresas")
   {
 if(document.gravatipos.elements[i].value == "")
 {
alert("Campo obrigatório A!");
document.gravatipos.elements[i].focus();
return (false); 
 }
      }
        }
 }
}
form.submit();
 }
Grato a todos!
Sei: com gabiarra. Mas funcionou seguro. Isso é o que vale!
Alguma sugestão melhor?

IPB Skin By Virteq