Jump to content


Photo

Pegando Valores De Radio E Checkbox


  • Faça o login para participar
10 replies to this topic

#1 lanlan

lanlan

    12 Horas

  • Usuários
  • 180 posts
  • Sexo:Não informado
  • Localidade:Teresina
  • Interesses:design, php, photoshop. ;} webdesign em geral!

Posted 25/05/2008, 01:12

Então, eu estou tentando usar essa função para pegar todos os valores dos elementos de um formulário.
Tudo funciona ok até eu tentar com um radio e uma checkbox.
O que está errado?

function pegaElementos(Form){var cForm = document.forms[Form]var formArray = new Array(); for(i=0; i<cForm.elements.length; i++){	switch(cForm.elements[i].type)	{	// Indefinido		case 'undefined': var value = "nenhum";	// Select one		// case 'select-one':		//	var value = cForm.elements[i].selectedIndex.value;	// Select-Multiple		case 'select-multiple':			var myArray = new Array();			for(var x=0; x < cForm.elements[i].length; x++) 				if(cForm.elements[i][x].selected == true)					myArray[myArray.length] = cForm.elements[i][x].value;			var value = myArray;	// Radio		case 'radio':			for(var x=0; x < cForm.elements[i].length; x++) 				if(cForm.elements[i][x].checked == true)			var value = cForm.elements[i][x].value;		  	// Checkbox		case 'checkbox':			var value = cForm.elements[i].checked;	// Padrão		default: var value = cForm.elements[i].value;	}		  var campo = cForm.elements[i].name;   } // for}


#2 Alex Hiroshi

Alex Hiroshi

    Super Veterano

  • Ex-Admins
  • 4923 posts
  • Sexo:Masculino
  • Localidade:São Paulo - SP

Posted 25/05/2008, 09:16

Eu achei o código um pouco confuso. Não entendi o for() dentro dos case, que fazem a busca mais uma vez.

Como você quer pegar esses valores? Quer ele tudo em um variável? Porque do jeito que está, com a definição de uma variável local em cada case, ele vai retornar só o valor do último campo encontrado. Se você pretende que a função retorne todos os valores, use um array ou não define a variável como local e vai concatenando os valores na variável 'value'.
O uso do break também seria bom para não retornar falso e verdadeiro nos checkbox e radio.

Se você mexer nessas coisas, com certeza a função retornará o esperado.
Fórum WMO - Equipe de Desenvolvimento / Banco de Dados - Ex-Administrador

#3 lanlan

lanlan

    12 Horas

  • Usuários
  • 180 posts
  • Sexo:Não informado
  • Localidade:Teresina
  • Interesses:design, php, photoshop. ;} webdesign em geral!

Posted 25/05/2008, 13:00

Eu tinha esquecido de colocar a parte do Array. Aproveitei e troquei a var value para o item do array diretamente.
(Arrumei o break; e os 'for' duplicados.
Agora ele pega o que está selecionado e também o que não está, adicionando no array um elemento 'em branco'.
Como faço para ele ignorar o elemento não selecionado?)

function pegaElemento(Form){
var cForm = document.forms[Form]
var formArray = new Array();
var campos = new Array("","nome","preco","tamanho","cor","manga");
	
 for(i=0; i<cForm.elements.length; i++){
  
  var campo = cForm.elements[i].name;
  // Se o item do form estiver no array de campos definido pelo usuário, adiciona ao array do form
  if ((','+campos.toString()+',').indexOf(',' + campo + ',')!==-1) {

	switch(cForm.elements[i].type)
	{
	// Indefinido
		case 'undefined': formArray[i] = "nenhum"; break;
	// Select one
		//case 'select-one':
		//	formArray[i] = cForm.elements[i].selectedIndex.value;
			   // break;
	// Select-Multiple
		case 'select-multiple':
			var myArray = new Array();
				if(cForm.elements[i].selected == true)
					myArray[myArray.length] = cForm.elements[i].value;
			formArray[i] = myArray;
			 break;
	// Radio
		case 'radio':
				if(cForm.elements[i].checked == true)
				formArray[i] = cForm.elements[i].value;
			 break;
	// Checkbox
		case 'checkbox':
				if(cForm.elements[i].checked == true)
				formArray[i] = cForm.elements[i].value;
			 break;
	// Padrão
		default: formArray[i] = cForm.elements[i].value; break;
	}
	} //if
   } // for
}

E aqui o formulário que estou usando:

<form name="item1">
<fieldset>
<legend>Item 1 R$10,00</legend>
	<input type="hidden" value="Item 1" name="nome" class="hidden" /><br />
	<input type="hidden" value="10.00" name="preco" class="hidden" />
<label for="tamanho">Tamanho</label>
	<select name="tamanho">
	   <option selected="selected" value="P">P</option>
	   <option value="M">M</option>
	   <option value="G">G</option>
	</select><br />
<label for="cor">Cor</label>
	<select name="cor">
	   <option selected="selected" value="Vermelho">Vermelho</option>
	   <option value="Azul">Azul</option>
	</select><br />
<label for="manga">Manga</label>
	   <input type="radio" name="manga" value="Curta" /> Curta<br />
	   <input type="radio" name="manga" value="Comprida" /> Comprida
	</select><br />
	<input type="submit" class="bt" onclick="pegaElemento(this.form.name)" value="Comprar" />
	</fieldset>
</form>

Edição feita por: lanlan, 25/05/2008, 16:03.


#4 Alex Hiroshi

Alex Hiroshi

    Super Veterano

  • Ex-Admins
  • 4923 posts
  • Sexo:Masculino
  • Localidade:São Paulo - SP

Posted 25/05/2008, 19:01

Estou um pouco sem tempo para olhar agora, mas tente usar o push().
Fórum WMO - Equipe de Desenvolvimento / Banco de Dados - Ex-Administrador

#5 lanlan

lanlan

    12 Horas

  • Usuários
  • 180 posts
  • Sexo:Não informado
  • Localidade:Teresina
  • Interesses:design, php, photoshop. ;} webdesign em geral!

Posted 25/05/2008, 23:35

Funcionou com o radio.
O checkbox ainda tá dando trabalho, mas eu vou tentar resolver aqui.
Brigada mesmo. :)

#6 Alex Hiroshi

Alex Hiroshi

    Super Veterano

  • Ex-Admins
  • 4923 posts
  • Sexo:Masculino
  • Localidade:São Paulo - SP

Posted 26/05/2008, 07:53

Checkbox é igual o radio.
Fórum WMO - Equipe de Desenvolvimento / Banco de Dados - Ex-Administrador

#7 lanlan

lanlan

    12 Horas

  • Usuários
  • 180 posts
  • Sexo:Não informado
  • Localidade:Teresina
  • Interesses:design, php, photoshop. ;} webdesign em geral!

Posted 26/05/2008, 13:57

Utilizando isso:

if(cForm.elements[i].checked == true)
formArray.push(cForm.elements[i].value);

com o checkbox, ele adiciona mais um item ao meu array do form, assim:
campo1 = input text
campo 2 = radio
campo 3 = checkbox

campo1,campo2,valor1checkedcampo3,valor2checkedcampo3

e eu gostaria que ficasse assim (um array multidimensional):

campo1,campo2,[valor1checkecampo3,valor2checkedcampo3]

é possível?

#8 Alex Hiroshi

Alex Hiroshi

    Super Veterano

  • Ex-Admins
  • 4923 posts
  • Sexo:Masculino
  • Localidade:São Paulo - SP

Posted 28/05/2008, 08:58

É possível, aí é só acessar os valores como formArray[X][Y]. Cria um novo array para os checkbox e depois adiciona esse array no array dos outros elementos. Como o push vai adicionar o array no final do array, você vai ter que usar um reverse() para funcionar direito.
Fórum WMO - Equipe de Desenvolvimento / Banco de Dados - Ex-Administrador

#9 lanlan

lanlan

    12 Horas

  • Usuários
  • 180 posts
  • Sexo:Não informado
  • Localidade:Teresina
  • Interesses:design, php, photoshop. ;} webdesign em geral!

Posted 28/05/2008, 16:03

case 'checkbox':
			var myArray = new Array();		
				if(cForm.elements[i].checked == true)
					myArray[myArray.length] = cForm.elements[i].value;
					formArray.reverse(myArray);
			 break;

Tentei isso, mas não deu certo. Ele sequer pega os valores do checkbox.

#10 Alex Hiroshi

Alex Hiroshi

    Super Veterano

  • Ex-Admins
  • 4923 posts
  • Sexo:Masculino
  • Localidade:São Paulo - SP

Posted 28/05/2008, 18:50

Array deve ser iniciado fora do for; use push nele também; mais um push para adicionar o array dentro do array, mas esse deixa para fora do for e é bom colocar uma verificação para não adicionar valor vazio, caso não exista checkbox.
Fórum WMO - Equipe de Desenvolvimento / Banco de Dados - Ex-Administrador

#11 lanlan

lanlan

    12 Horas

  • Usuários
  • 180 posts
  • Sexo:Não informado
  • Localidade:Teresina
  • Interesses:design, php, photoshop. ;} webdesign em geral!

Posted 29/05/2008, 00:28

Está funcionando mas com um pequeno bug: Se houverem mais de um grupo de checkbox, ele continua adicionando todos os valores a uma única posição no formArray.
Eu acho que a única forma de resolver isso é criando o chkArray dentro do for e adicionando-o ao formArray ainda dentro do for. Porém não consigo achar um jeito de fazer isso.
É possível ou, ainda, existe outra solução?

function pegaElemento(Form){
var cForm = document.forms[Form]
var formArray = new Array();
var chkArray = new Array();
var selArray = new Array();
	
 for(i=0; i<cForm.elements.length; i++){
  
  var campo = cForm.elements[i].name;
  
	switch(cForm.elements[i].type)
	{
	// Indefinido ou Submit
		case 'undefined': case 'submit': break;
	// Select one
		//case 'select-one':
		//	formArray[i] = cForm.elements[i].selectedIndex.value;
		// break;
	// Select-Multiple
		case 'select-multiple':
		for (var x = 0; x < cForm.elements[i].options.length; x++)
		if (cForm.elements[i].options[x].selected)
		selArray.push(cForm.elements[i].options[x].value);
		var selposition = i;
			 break;
	// Radio
		case 'radio':
				if(cForm.elements[i].checked == true)
				formArray.push(cForm.elements[i].value);
			 break;
	// Checkbox
		case 'checkbox':	
				if(cForm.elements[i].checked == true)
					chkArray.push(cForm.elements[i].value);
					var chkposition = i;
			 break;
	// Padrão
		default: formArray.push(cForm.elements[i].value); break;
	}

   } // for
   
   if (chkArray != 0) {
	chkArray = chkArray.join("**")
	formArray.splice ( chkposition, 0, chkArray );
	}
   if (selArray != 0) {
	selArray = selArray.join("**")
	formArray.splice ( selposition, 0, selArray );
	}
	
} // function

Edição feita por: lanlan, 29/05/2008, 00:34.





1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq