Sobre mim

Trabalho com programação há cerca de 5 anos, sempre interessado nas linguagens WEB (PHP, Ruby, Java, JS, etc). Atualmente desenvolvo em PHP com o CodeIgniter, utilizando metodologias ágeis, na Fortes Informática.

Páginas

18 February 2008 - 16:00Transferência entre selects múltiplos usando JQuery (Parte I)

Nessa primeira parte iremos mostrar como transferir itens entre dois selects usando JQuery, e o comparativo com JavaScript puro. Na segunda parte abordaremos como receber os valores deste Select Multiplo via PHP.

Primeiro, devemos incluir a biblioteca do JQuery, que você já deve ter baixado caso tenha lido o artigo anterior ( http://jquery.com/ ), no nosso caso, ele fica dentro de uma pasta chamada dll na raiz do diretório:

<script language="javascript">
type="text/javascript" src="../dll/jquery.js">
</script>

Agora devemos criar a função que fará a transferência entre os Selects:

<script language="javascript">
function transfereItem(idList, idList2){
	$("#"+idList2).append($("#"+idList+" option[@selected]"));
}
</script>

A função a cima recebe o id das duas listas de seleção e adiciona na lista 2 todas as opções marcadas na lista 1 através da função append do JQuery. Repare também que com um simples option[@selected] conseguimos pegar todas as opções selecionadas da lista 1 (Você pode aprender mais sobre como “pegar” objetos através do JQuery clicando aqui:).

Antes de seguir com o código, irei fazer uma demonstração de como poderíamos criar a mesma função através de JavaScript puro. Repare na diferença no número de linhas:

<script language="javascript">
function transfereItem(idList, idList2){
	var transferir = new Array();
	var contador = 0;
    	var oldList = document.getElementById(idList); 
	var opcoes = oldList.getElementsByTagName("option"); 
	var newList = document.getElementById(idList2); 
 
	// Pega as opcoes selecionadas
	for (var i = 0; i < opcoes.length; i++) { 
		if (opcoes[i].selected == true) {
			transferir[contador] = opcoes[i];
			contador++;
		}
	}
 
	// Passa para a nova lista
	for (var i = 0; i < transferir.length; i++) { 
		newList.appendChild(transferir[i]);
	}
}
</script>

Impressionado com a diferença? Agora vamos continuar com nossos selects criando os mesmos:
- Primeira lista com algumas opções para teste:

<select name="lista1" id="lista1" size="10" multiple="multiple">
<option value="1">Um</option>
<option value="2">Dois</option>
<option value="3">Três</option>
<option value="4">Quatro</option>
<option value="5">Cinco</option>
<option value="6">Seis</option>
</select>

- Agora o segundo select para fazer a transferência:

<select name="lista2[]" id="lista2" size="10" multiple="multiple"></select>

Estamos quase terminando, agora só precisamos criar as setas para transferir os elementos entre os dois Selects, repare que também poderíamos fazer a transferência ao realizar um duplo clique em cima de um elemento através do evento “ondblclick”.

<a href="#" onclick="transfereItem('lista1', 'lista2');"> &lt; </a>
 
<a href="#" onclick="transfereItem('lista2', 'lista1');"> &lt; </a>

Pronto, os selects com transferência já estarão funcionando. Observe que passei dentro da função chamada no link o ID contido nos dois selects, indicando de qual para qual select os elementos irão ser transferidos.
Você pode ver o exemplo do código funcionando clicando aqui

6 Comments | Tags: JavaScript e JQuery

Comments:

  1. Primeiramente gostaria de parabenizá-lo pelo seu artigo, que ficou de muito fácil entendimento.

    Agora vem a pergunta que não quer calar. Quando eu vou pegar via $_POST os dados da lista2 para gravar no banco ela grava apenas o ultimo valor inserido, teria como pegar todos os itens selecionado?

    Grato pela atenção

  2. Thanks..

  3. Guilherme says;
    22 Sep 2008 - 21:11

    Insira colchetes [], no id do select, exemplo: lista1[].

    O php irá interpretar como um vetor, depois é soh percorrer ele com um foreach por exemplo ;)

    Abraços

  4. [...] Na primeira parte, vimos como transferir itens entre os dois selects, agora vamos salvar os valores marcados (ou seja, transferidos para o select da direita). [...]

  5. Eric Saboia says;
    04 Dec 2008 - 12:11

    Guilherme, na verdade os colchetes devem ser inseridos no “name” e não no “id” .
    Valeu!

  6. I think I will try to recommend this post to my friends and family, cuz it’s really helpful.

Add a Comment