Lista de Pedidos — Exemplo adicionar e remover elementos usando Javascript.

CSS, HTML, Javascript, PHP, Sites, Template Comentar >> Marcelo Korjenioski

Neste exem­plo irei mos­trar como criar ele­men­tos den­tro do código html usando javas­cript e remo­ver ele­mento estes ele­men­tos.
Criei uma lista de pedi­dos para exem­pli­fi­car o uso des­tas funções.

Exem­plo funcionando.

Crie um arquivo html cha­mado pedidos.html e insira o código abaixo.

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN">
<html>
<head>
<script type="text/javascript">

// Remove elementos
function removeElement(id) {
// Declara variavel lista que indica  onde o elemento será removido.
var lista    = document.getElementById('lista');
// Declara variavel elemento que indica qual elemento será removido.
var elemento = document.getElementById(id);

// Função removeChild irá procurar elementos que estão dentro da variavel lista com o valor
// da variavel elemento para remover.
lista.removeChild(elemento);
}

// Adiciona elementos basedo no valor dos combo box (select)
function adicionar(id) {
// Cria uma variavel que captura o valor do elemento selecionado no combo box.
var valor   = document.getElementById(id).value;

// Cria uma variavel com referencia ao Id do Elemento
var lista    = document.getElementById('lista');
// Cria uma variavel para inidicar a quantidade de elementos com o mesmo Id. Com valor inicial 1.
var qtd = 1;

// Verifica se elemento com o Id informado existe.
if(document.getElementById('element_' + valor)){

// Caso o elemento exista é atribuido o valor referente a quandide de vezes que foi adicionado
// este elemento.
qtd = document.getElementById('item_' + valor).value;

// Apos pegar o valor da quantidade. O elemento é removido para que não ocorra duplicação.
removeElement('element_' + valor);

// Incrementa a quantidade do elemento para o proximo registro.
qtd++;
}

// Variavel que contem dados dos novos elementos na lista.
// É criado uma tag <li> que contem informação do elemento adicionado.
// Dentro deste registro é adicionado um link <a> para remover o elemento.
// Tambem é adicionado um <input> do tipo hidden com o valor e a quantidade do elemento.
var dado = '<li id="element_' + valor + '"><span><strong>'
+ valor +
' Qtd '
+ qtd +
'</strong> <a title="Remover" onclick="removeElement(\'element_' + valor +  '\'); return false;" href="javascript:void(0);">Remover</a></span><input id="item_'
+ valor +
'" type="hidden" value="'
+ qtd +
'" name="pedido['
+ valor +
']"/></li>';

// Pega o codigo HTML dento da lista e adiciona novos registros.
lista.innerHTML = lista.innerHTML + dado;

}

</script>
<style type="text/css">

body {
background:#FFFFFF none repeat scroll 0 0;
font-family:Arial,Helvetica,sans-serif;
font-size:12px;
height:100%;
line-height:1.3em;
margin:0;
width:100%;
}

div#wrapper {
margin:auto;
position:relative;
width:906px;
z-index:0;
}

input {
border:1px solid #CDCDCD;
background:#FFFFFF;
color:#000033;
}

input, select, textarea, label, button {
line-height:normal;
margin:2px 1px 1px 2px;
}

ul, li {
list-style: none;
}

li {
background:#FDFDFD;
color:#000033;
padding: 2px;
margin:  4px;
text-transform: uppercase;
}

legend {
color: #EB7800;
font-size:14px;
font-weight: bold;
}

</style>
<title>Lista de Pedidos</title>
</head>

<body>

<div id="wrapper">

<fieldset>
<legend>Cardápio</legend>

<label for="desc_bebidas">Bebidas</label>
<select id="desc_bebidas" name="desc_bebidas">
<option value="coca-cola">Coca-Cola</option>
<option value="fanta">Fanta</option>
</select>
<!--  Botão com a função de adicionar valor selecionado no combo box ao ser clicado -->
<input type="button" name="adicionar" value="Adicionar" onclick="adicionar('desc_bebidas');"><br>
<label for="desc_pratos">Pratos</label>
<select id="desc_pratos" name="desc_pratos">
<option value="espaguete">Espaguete</option>

<option value="pizza">Pizza</option>
</select>
<!--  Botão com a função de adicionar valor selecionado no combo box ao ser clicado -->
<input type="button" name="adicionar" value="Adicionar" onclick="adicionar('desc_pratos');"> <br>
<label for="desc_sobremesas">Sobremesas</label>
<select id="desc_sobremesas" name="desc_sobremesas">
<option value="pudim">Pudim</option>
<option value="sorvete">Sorvete</option>
</select>

<!--  Botão com a função de adicionar valor selecionado no combo box ao ser clicado -->
<input type="button" name="adicionar" value="Adicionar" onclick="adicionar('desc_sobremesas');"><br>
</fieldset>

<!--  Envia dados via POST para pedidos.php -->
<form action="pedidos.php" method="post">
<fieldset>
<legend>Descrição</legend>
<textarea rows="3" cols="100" id="desc_observacao" name="desc_observacao"></textarea>
</fieldset>

<div id="pedidos">
<fieldset>
<legend>Pedidos</legend>

<div>
<!--  Lista onde será adicionado registros dos valores dos combo box selecionados -->
<ul id="lista"></ul>
</div>
</fieldset>
</div>
<input type="submit" value="Enviar Pedido">
</form>

</div>

</body>

</html>

Crie um arquivo php cha­mado pedidos.php e insira o código abaixo.

<?php
// Organiza lista do array para o debug.
echo "<pre>";
// Mostra Array de entrada de POST e GET
print_r($_REQUEST);
?>

Caso tenha alguma duvida deixe um comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­rias aqui apresentados.

Com­par­ti­lhe com seus ami­gos:
  • Print
  • Facebook
  • Google Bookmarks
  • PDF
  • RSS
  • Twitter
  • LinkedIn



  • Eddie

    Olá. Estou ini­ci­ando em php e gos­ta­ria de saber como eu pode­ria fazer para gra­var os dados no banco. A parte de inserts eu con­sigo fazer, mas não sei como pegar os dados para gra­var. Obrigado!

  • http://www.phaneronsoft.com Mar­celo Korjenioski

    Olá Eddie.
    Criei um post com um exem­plo básico de como efe­tuar o insert de dados usando PHP e um fomu­lá­rio HTML espero que ajude.
    Pegar dados via POST e inse­rir no banco de dados MySQL com PHP

  • http://www.fmt.to.gov.br Char­les Jefferson

    Olá.. gos­tei muito do seu exem­plo, pre­ciso de algo bem pare­cido, quais as alte­ra­ções que teria que fazer se no caso do com­bo­bo­xes fos­sem file upload? Quero que ele colo­casse abaixo os arqui­vos que serão uplo­ads.
    Se puder me aju­dar agradeceria

  • http://www.fmt.to.gov.br Char­les Jefferson

    Eu con­se­gui fazer.…. só que esse seu exem­plo só tá fun­ci­o­nando no Fire­fox, no IE nao.. por­que será? Vc testou?

  • http://www.phaneronsoft.com Mar­celo Korjenioski

    Eu tes­tei com o IE6 e Fire­fox e fun­ci­o­nou sem pro­ble­mas. Esta tendo pro­ble­mas com o antigo plu­gin de mar­ca­ção de código ele estava dando uns esca­pes e alguns códi­gos que pos­tei não esta­vam fun­ci­o­nando.
    Enviei o código nova­mente e copiei e fun­ci­o­nou sem pro­ble­mas. Qual­quer duvida me avise.
    Esta semana vou criar um tuto­rial para fazer upload de mul­ti­plos arqui­vos e dei­xar uma lista para adi­ci­o­nar ou remo­ver o arquivo.
    Obri­gado pela ajuda Charles

  • http://www.phaneronsoft.com Mar­celo Korjenioski

    Char­les você esta que­rendo colo­car vários inputs de file ou ape­nas um e con­forme vc for sele­ci­o­nando os arqui­vos eles irão ficando na lista abaixo?

  • http://www.fmt.to.gov.br Char­les Jefferson

    Isso, exa­ta­mente isso. Veja aí as modi­fi­ca­ções que fiz… http://10.169.3.3/tela_upload.htm

    tenta no fire­fox e no IE, no fire­fox per­feito, no ie não funciona.

    ve o que fiz de errado

  • http://www.fmt.to.gov.br Char­les Jefferson

    Caso não con­siga abrir o link acima, tenta esse:
    http://www.fmt.to.gov.br/tela_upload.htm

    tava que­rendo algo mais ou menos do tipo http://www.easyalgo.com/examples/eaflashupload/simpleupload.html

    com seu código quase con­se­gui, só que ele só fun­ci­ona no fire­fox. :(

  • http://www.phaneronsoft.com Mar­celo Korjenioski

    Char­les eu fiz um sis­tema para enviar e remo­ver os arqui­vos. Ele ainda esta pri­mi­tivo com fun­ções muito bási­cas e com pouco segu­rança. Mas já é pos­sí­vel ter uma idéia de como tra­ba­lhar com ele para adap­tar a sua neces­si­dade. Segue o link Upload e Remo­ção de arquivo via AJAX.

  • http://www.fmt.to.gov.br Char­les Jefferson

    Beleza, ficou per­feito e bem bonito!!! Cara vc me aju­dou muito com esse blog, obrigado.

    Só falta mais uma coi­si­nha pra eu fechar meu form…

    Minha dúvida é outra, mas é pare­cida e acho que dê pra fazer via Jquery……

    Me diga uma maneira fácil de fazer o seguinte:

    Tipo assim tenho um text­box que vai rece­ber o nome da pes­soa, ao cli­car no botão inse­rir ele joga abaixo nome dessa pes­soa, qse igual como no blog, só que não upload de arqui­vos, são nomes de pes­soas que vou pre­ci­sar guar­dar no bando de dados.

    Quero que fique assim, os nomes e a opção excluir do lado do nome:

    João (excluir)
    Paulo (excluir)
    Lucas (excluir)
    Maria (excluir)

    Tem uma maneira mais fácil de se fazer isso?

    Tava pen­sando tam­bém em abrir um pop-up e desse pop-up vol­tasse ao form ini­cial (mas não sei fazer isso sem dei­xar de atu­a­li­zar o form)

  • http://www.phaneronsoft.com Mar­celo Korjenioski

    Bem neste caso você pode ape­nas subs­ti­tuir os com­bos por um text­box que ele irá pegar o valor digi­tado.
    É para cada insert vc cria um input do tipo hid­den com o valor do nome e com um name em for­mato de array “nomes[]” assim do outro lado você pega o post com um array dos nomes e faz um loo­ping para inse­rir cada regis­tro. Se não con­se­guir neste final de semana eu crio um exemplo.

  • http://www.fmt.to.gov.br Char­les Jefferson

    Acho que eu con­se­gui, seguindo tuas dicas!!

    Abra aí no navegador(funcionando no IE e Fire­fox, per­fei­tim), http://www.fmt.to.gov.br/teste/autor.php

    Desse jeito que pre­ciso, agora só me ajude a fazer com que os dados digi­ta­dos vol­tem pro form ini­cial, veja o form inicial(http://www.fmt.to.gov.br/teste/cad_artigo.html)

    Ten­tei fazer com que tudo ficasse no form mas não con­se­gui, acho que assim jogando pra outra página e vol­tando possa ficar mais fácil.

    Fico aguar­dando.

  • http://www.phaneronsoft.com Mar­celo Korjenioski

    Certo o unico erro é que den­tro de um form você não pode exe­cu­tar javas­cript com um input tipo but­ton.
    Então tro­que para
    Adi­ci­o­nar
    que irá fun­ci­o­nar.
    Outra coisa que esta com pro­blema é a con­ca­te­na­ção da saída do input copie da outra página que esta fun­ci­o­nando. Caso queira exe­cu­tar um js den­tro do form use um input do tipo sub­mit ok?

  • http://www.fmt.to.gov.br Char­les Jefferson

    Não entendi muito bem o que quis passar…

    Pra tro­car o but­ton pelo Adi­ci­o­nar é no arquivo cad_artigo.html ou no autor.php ?

    E o pro­blema de con­ca­te­na­ção tb é pra qual dos dois?

    Eu alte­rei o but­ton pelo sub­mit do arquivo cad_artigo.html, mas ainda não roda, veja aí.

  • http://www.phaneronsoft.com Mar­celo Korjenioski

    Copie o for­mu­lá­rio e o javas­cript do autor.php para o cad_artigo e subs­ti­tua o input but­ton por
    Adi­ci­o­nar
    Lem­bre que o desc_bebidas é o id do input que vc esta digi­tando o nome do autor.

  • http://www.fmt.to.gov.br Char­les Jefferson

    Fun­ci­o­nou per­fei­ta­mente… cara muito obri­gado!!!!
    Agora só mais uma coi­si­nha pra fechar:

    Esses nomes digi­ta­dos, pre­ci­sam ir pro banco de dados, como salvá-los agora no BD? Como armazená-los junto com os outros dados do form?

  • http://www.phaneronsoft.com Mar­celo Korjenioski

    Você vai pegar um array com todos o nomes dando um var_dump($_POST);
    Agora vc terá que fazer um fore­ach deste array de dados efe­tu­ando o insert ou se for para inse­rir todos os nomes no mesmo campo da tabela faça um implode do array trans­for­mando em uma string. Se tiver duvida me manda os cam­pos da tabela que você era inse­rir os dados que te dou uma idéia.

  • http://www.fmt.to.gov.br Char­les Jefferson

    Olha, tá quase que pra­ti­ca­mente ter­mi­nado o meu form, olha ele aí, com as alte­ra­ções e como eu quero que seja… http://www.fmt.to.gov.br/teste/cad_artigo.php

    Bom, eu quero sal­var todos esses cam­pos no BD, então os auto­res pre­ci­sam ser sal­vos no BD. A tua expli­ca­ção acima eu não entendi muito bem, por isso tou te pas­sando o FORM, e o campo que quero é todos, em espe­cial o de Auto­res pois não sei como pegar os valo­res dos nomes que serão digitados.

    O código fonte caso não con­siga visu­a­li­zar tá aqui http://www.fmt.to.gov.br/teste/cad_artigo.txt

    Me ajuda aí pra eu finalizar.

    Tam­bém vou pre­ci­sar pegar os arqui­vos do Ane­xar Docu­men­tos, se tiver tempo vê pra mim se será do mesmo jeito que o de autores.

    Valeu, obri­ga­dão, bom fim de semana pra nós.

  • http://www.alanhidalgopagoto.com.br Alan Hidalgo Pagoto

    Fala Mar­celo, tudo bom?
    Então, muito bacana o seu tuto­rial, porém eu tenho uma dúvida que, mesmo não sendo sobre ele, está con­tida no mesmo con­texto.
    Eu tenho uma lista que é gerada dina­mi­ca­mente, como esta aí em cima.
    O que eu que­ria era que, quando o usuá­rio tro­casse de página, ou desse um F5 nesta, ele não per­desse o con­teúdo. O que teria que fazer, colo­car, além do , um ele­mento em uma variá­vel de ses­são? Como faria isto pelo JS?
    Abraço
    Alan

  • http://www.phaneronsoft.com Mar­celo Korjenioski

    Como vai Eddie.
    Para resol­ver seu pro­blema você pode jogar a lista na ses­são mesmo. Desta vez você terá que trans­fe­rir infor­ma­ção via AJAX usando GET ou POST. Aqui tem um exem­plo de como aces­sar uma pagina usando AJAX. Assim a cada item adi­ci­o­nado você irá fazer um acesso via AJAX para tra­ba­lhar com a ses­são. Outra solu­ção seria usar coo­kies no JS segue um link com exem­plo tam­bém.

  • Pro­fis­si­o­nal Ti

    Ficou muito show, pode­ria ficar melhor ainda de duas for­mas:
    1 — Come­çar com um combo e na medida que o usuá­rio qui­ser novos itens ter um botão tipo (+), dai quando ele cli­car apa­rece outra combo para inse­rir novos dados.
    Ou
    2 — Invês de combo usar check­box, dai depois de esco­lher todos os itens o usuá­rio cli­car no adi­ci­o­nar e todos itens serem add de uma vez só…

  • Lord_korjenioski

    Otima ideia quando tiver um tempo irei atu­a­li­zar este Post.
    Obrigado.

  • Pro­fis­si­o­nal Ti

    Beleza fica­mos no aguardo então. Só uma dúvida: Imple­men­tei o seu script num pro­jeto que estou desen­vol­vendo com php, mas fiquei na dúvida no ponto onde estou usando list­box com dados vin­dos do banco mysql, até ai beleza esta fun­ci­o­nando, mas o pro­blema é que na DIV onde apa­rece os valo­res esta apa­re­cendo o id do produto(Pois nos meus list­box recu­pero o id_prod(valor) e Nome_produto(label)). Gos­ta­ria de con­ti­nuar pegando o value=id_prod, mas na hora de exi­bir na div que apa­re­cesse a label e não o id do produto…tem como? Abraços.

blog comments powered by Disqus
Designed by NattyWP Wordpress Themes.
Images by desEXign.