Take the value of the Avascript table and place it in an array

Asked

Viewed 4,908 times

4

I have a problem, I made a dynamic table in Javascript and I want to play your data in an array, I tried to use JSON but when I click on the button to run the event it does nothing. I don’t know if any plugin is missing, because I had never worked with JSON, follow the code.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" type="text/css" href="../css/bootstrap.css"/>

    <script type="text/javascript" src="../js/jquery-1.11.3.min.js"></script>
    <script type="text/javascript" src="../js/jquery.validate.min.js"></script>
    <script src="https://code.jquery.com/jquery-1.10.2.js"></script>

    <!-- Aqui esta o meu script para criar a tabela  -->
    <title> Controle de Material </title>

    <script type="text/javascript">
      totals = 0;
      function adiciona() {
        totals++

        var tbl = document.getElementById("tabelaPedido");
        var novaLinha = tbl.insertRow(-1);
        var novaCelula;

        if(totals%2==0)
          cl = "#FFFFFF";
        else
          cl = "##FFFFFF";

        novaCelula = novaLinha.insertCell(0);
        novaCelula.align = "left";
        novaCelula.style.backgroundColor = cl;
        novaCelula.innerHTML = document.getElementById('cprod').value;

        totals;

        novaCelula = novaLinha.insertCell(1);
        novaCelula.align = "left";
        novaCelula.style.backgroundColor = cl;
        novaCelula.innerHTML =  document.getElementById('cquant').value;
        novaCelula2 = novaLinha.insertCell(2);
        novaCelula.align = "left";
        novaCelula.style.backgroundColor = cl;

        var btnEl = document.createElement('input');

        btnEl.setAttribute('type', 'button');
        btnEl.setAttribute('class', 'btn');

        btnEl.onclick = function () {
          deleteRow(this.parentNode.parentNode.rowIndex)
        };

        btnEl.setAttribute('value', 'Delete');
        novaCelula2.appendChild(btnEl);
      }

      //Função para excluir a linha
      function deleteRow(i) {
        document.getElementById('tabelaBanco').deleteRow(i)
      }

      function pedido() {
        // Percorrer todas as linhas do corpo da tabela
        $('#tabelaPedido tbody tr').each(function () {
          // Recuperar todas as colunas da linha percorida
          var colunas = $(this).children();
          var pedidos = [];
          // Criar objeto para armazenar os dados
          var pedido = {
            'produto': $(colunas[0]).text(), // valor da coluna Produto
            'quantidade': $(colunas[1]).text() // Valor da coluna Quantidade
          };
          // Adicionar o objeto pedido no array
          pedidos.push(pedido);
        });
        // listando os pedidos função teste
        alert(pedidos);
        alert("esta funcionando");
      }
    </script>
  </head>
  <body>
    <form>
      <table>
        <tr>
          <td><p>Produto:</p></td>
          <td><p>Quantidade</p></td>
        </tr>
        <tr>
          <td><input type="text" name="produto" id="cprod"></td>
          <td><input type="text" name="quantidade" id="cquant"></td>
          <td><input type='button' id='incluir' class="btn" value='Incluir Produto' onclick='adiciona()'/></td>
        </tr>
      </table>
      <table id='tabelaPedido' class="table table-hover" border='0' width='100%'>
        <thead>
          <tr style='background-color:#FBF6F7'>
            <td class="produto"><strong>Produto</strong></td>
            <td class="quantidade"><strong>Quantidade</strong></td>
            <td><strong>Excluir</strong></td>
          </tr>
        </thead>
        <tbody>
        </tbody>
      </table>
      <br>
      <!-- chamando a função para pegar os dados e imprimir na telana -->
      <input class="btn" type = "submit" name = "but" value = "Confirmar Pedido" onclick='pedido()'/>
      <br>
      <br>
      <br>
    </form>
  </body>
</html>

2 answers

4

One of the mistakes evident is in fact you are not adding the table rows in the right place, as in this image, when adding two products see where they were inserted in the code: Inclusão de produto

Your code not many things that can be improved, I took the liberty of developing a script with some features that helped you in the performance and organization aspects.

Following example:

var produtos = {
    index : 0,
    tBody: document.getElementById('lstProdBody'),
    pedidos: {}, 
	adicionar: function(e) {
        // Impede de submeter a página.
        e.preventDefault();
    	
        var prod = document.getElementById('produto'),
            qtd = document.getElementById('quantidade');
        
        // Cria estrutura de elementos para adicionar a tabela.
        var tr     = document.createElement('tr'),
           	tdProd = document.createElement('td'),
            tdQtd  = document.createElement('td'),
            tdBtn  = document.createElement('td'),
            btn    = document.createElement('button');
        
        // Faz o aninhamento dos elementos, atribui os valores adicionados e acrescenta a tabela.
        tdProd.textContent = prod.value;
        tdQtd.textContent = qtd.value;
        
        // Limpa campos.
        prod.value = '';
        qtd.value = '';
        
        btn.setAttribute('onclick', 'produtos.excluir(event, this);');
        btn.textContent = 'Excluir';
        
        tdBtn.appendChild(btn);
        
        tr.appendChild(tdProd);
        tr.appendChild(tdQtd);
        tr.appendChild(tdBtn);
        
       	this.tBody.appendChild(tr);
    },
    excluir: function(e, elem) {
        // Impede de submeter a página.
        e.preventDefault();
        
        // Pega o elemento pai do elemento pai do botão e deleta da tabela.
        var a = elem.parentElement.parentElement;
        this.tBody.removeChild(a);
    },
    send: function(e) {
        // Impede de submeter a página.
        e.preventDefault();
        
        // Pega os valores de cada linha da tabela inclui em uma array, apos isto, adiciona no objeto pedidos.
        var pedido = [];
        
        Array.prototype.forEach.call(this.tBody.children, function(arr, index) {
            pedido.push({'produto': arr.children[0].textContent, 'quantidade': arr.children[1].textContent});
        });
        
        this.pedidos = { "pedido" : pedido };
        
        console.log(this.pedidos);
    }
}
* {
    box-sizing: border-box;
}
.cadastro-produtos {
    background-color: lightgray;
    height: 40px;
    padding: 10px;
    width: 100%;
}
.lista-produtos {
    width: 100%;
}
.lista-produtos thead tr th {
    background-color: #fbf6f7;
}
<form>
    <div class="cadastro-produtos">
        <labe>Produto:</label>
        <input type="text" id="produto">
        <labe>Quantidade:</label>
        <input type="text" id="quantidade">
        <button onclick="produtos.adicionar(event);">Adicionar</button>
    </div>
    <table class="lista-produtos">
        <thead>
            <tr>
                <th>Produto</th>
                <th>Quantidade</th>
                <th>Excluir</th>
            </tr>
        </thead>
        <tbody id="lstProdBody">
            <!-- Inclusão dinâmica -->
        </tbody>
    </table>
    <button onclick="produtos.send(event);">Confirmar Pedido</button>
    <div id="showJson"></div>
</form>

  • seeing your suggestion, I remembered that I could use a handleEvent to help in the organization of my own example. as for his example, became very good, just did not understand the need to assign a value inline to the onclick, Even you do it in Java itself btn.setAttribute('onclick', 'produtos.excluir(event, this);');

  • 1

    @Tobymosque This! I just looked at your example, it’s cool! I didn’t use the onclick inline by sloth... rsrs! Thank you.

  • Thank you very much for your attention but the add event is not working which plugins need to work with json and jquery ?

3


I believe your code is adding new lines in the table body and not in the tbody, then the selector $('#tabelaPedido tbody tr') should not be bringing records.

in any case, I am leaving a little more complete implementation for what you want to do:

var handler = {
  tabela: {},
  acoes: {},
  templates: {},
  init: function (tableName) {
    this.templates.novo = document.getElementById("tmplNovo").content;        
    this.templates.editar = document.getElementById("tmplEdit").content;
    this.templates.salvar = document.getElementById("tmplView").content;
    this.templates.cancelar = this.templates.salvar;

    this.tabela.root = document.getElementById(tableName);
    this.tabela.thead = this.tabela.root.querySelector("thead");
    this.tabela.tbody = this.tabela.root.querySelector("tbody");
    this.tabela.tfoot = this.tabela.root.querySelector("tfoot");

    this.acoes.novo = this.tabela.thead.querySelector("[data-action='novo']");
    this.acoes.finalizar = this.tabela.tfoot.querySelector("[data-action='finalizar']");

    this.acoes.novo.addEventListener("click", this);
    this.acoes.finalizar.addEventListener("click", this);

  },
  handleEvent: function (event) {
    var self = this;
    var atual = {};
    var linha = {};
    var action = event.target.dataset.action;

    atual.root = event.target.parentNode.parentNode;  
    if (atual.root.dataset.estado) {
      atual.produto = atual.root.querySelector("[name='produto']");
      atual.quantidade = atual.root.querySelector("[name='quantidade']");
    }

    if (self.templates[action]) {        
      linha.root = document.importNode(self.templates[action], true);    
      linha.actions = linha.root.querySelectorAll("[data-action]");  
      linha.produto = linha.root.querySelector("[name='produto']");
      linha.quantidade = linha.root.querySelector("[name='quantidade']");

      [].forEach.call(linha.actions, function (elem, indice) {
        elem.addEventListener("click", self);
      });
    }

    self[action](event, atual, linha);
  },
  novo: function (event, atual, linha) {
    var self = this;
    self.acoes.novo.disabled = "disabled";
    self.acoes.novo.readOnly = "readOnly";

    self.tabela.tbody.appendChild(linha.root);
    linha.produto.focus();
  },
  salvar: function (event, atual, linha) {
    var self = this;
    if (atual.root.dataset.estado === "novo") {
      self.acoes.novo.disabled = null;
      self.acoes.novo.readOnly = null;
    }

    linha.produto.textContent = atual.produto.value;
    linha.quantidade.textContent = atual.quantidade.value;

    self.tabela.tbody.insertBefore(linha.root, atual.root);
    self.tabela.tbody.removeChild(atual.root);
  },
  apagar: function (event, atual, linha) {
    var self = this;
    if (atual.root.dataset.estado === "novo") {
      self.acoes.novo.disabled = null;
      tselfhselfis.acoes.novo.readOnly = null;
    }
    self.tabela.tbody.removeChild(atual.root);
  },
  editar: function (event, atual, linha) {
    var self = this;

    linha.produto.value = atual.produto.textContent;
    linha.quantidade.value = atual.quantidade.textContent;
    linha.produto.dataset.oldValue = linha.produto.value;
    linha.quantidade.dataset.oldValue = linha.quantidade.value;   

    self.tabela.tbody.insertBefore(linha.root, atual.root);
    self.tabela.tbody.removeChild(atual.root);
    linha.produto.focus();
  },
  cancelar: function (event, atual, linha) {
    var self = this;

    linha.produto.textContent = atual.produto.dataset.oldValue;
    linha.quantidade.textContent = atual.quantidade.dataset.oldValue;

    self.tabela.tbody.insertBefore(linha.root, atual.root);
    self.tabela.tbody.removeChild(atual.root);
  },
  finalizar: function (event) {
    var self = this;

    self.acoes.novo.disabled = null;
    self.acoes.novo.readOnly = null; 

    var pedidos = [];
    var linhas = this.tabela.tbody.querySelectorAll("tr[data-estado]");
    [].forEach.call(linhas, function (linha, indice) {
      var pedido = {};        
      var atual = {};
      atual.produto = linha.querySelector("[name='produto']");
      atual.quantidade = linha.querySelector("[name='quantidade']");

      if (linha.dataset.estado == "view") {
        pedido.produto = atual.produto.textContent;
        pedido.quantidade = atual.quantidade.textContent;
        pedidos.push(pedido);
      }

      if (linha.dataset.estado == "edit") {
        pedido.produto = atual.produto.dataset.oldValue;
        pedido.quantidade = atual.quantidade.dataset.oldValue;
        pedidos.push(pedido);
      }

      self.tabela.tbody.removeChild(linha);
    });

    console.log(pedidos);
  }
}

handler.init("tabela");
.action input[type="image"] {
  float: right;
  width: 24px;
  height: 24px;
}

.action-novo:disabled {
  opacity: 0.5;
}
input, span {
  box-sizing: border-box;
  margin: 0px;
}

td {
  min-width: 150px;
}

td.action {
  min-width: 48px;
}

#tabela thead tr, #tabela tfoot tr { background: darkgrey; }
#tabela tbody tr:nth-child(even) {background: gainsboro}
#tabela tbody tr:nth-child(odd) {background: whitesmoke}
<table id="tabela">
  <thead>
    <tr>
      <td>Produto</td>
      <td>Quantidade</td>
      <td class="action">
        <input type="image" data-action="novo"
               src="http://cdn.flaticon.com/svg/66/66820.svg" />
      </td>
    </tr>
  </thead>
  <tfoot>
    <tr>
      <td></td>
      <td></td>
      <td class="action">
        <input type="image" data-action="finalizar" 
               src="http://cdn.flaticon.com/svg/70/70050.svg" />
      </td>
    </tr>
  </tfoot>
  <tbody>

  </tbody>
</table>

<template id="tmplNovo">
  <tr data-estado="novo">
    <td><input type="text" name="produto" /></td>
    <td><input type="text" name="quantidade" /></td>
    <td class="action">
      <input type="image" data-action="salvar"
             src="http://cdn.flaticon.com/svg/64/64082.svg" />
      <input type="image" data-action="apagar"
             src="http://cdn.flaticon.com/svg/24/24313.svg" />            
    </td>
  </tr>
</template>

<template id="tmplEdit">
  <tr data-estado="edit">
    <td><input type="text" name="produto" data-old-value="" /></td>
    <td><input type="text" name="quantidade" data-old-value="" /></td>
    <td class="action">
      <input type="image" data-action="salvar"
             src="http://cdn.flaticon.com/svg/64/64082.svg" />
      <input type="image" data-action="cancelar"
             src="http://cdn.flaticon.com/svg/61/61918.svg" />
    </td>
  </tr>
</template>

<template id="tmplView">
  <tr data-estado="view">
    <td><span name="produto"></span></td>
    <td><span name="quantidade"></span></td>
    <td class="action">
      <input type="image" data-action="apagar"
             src="http://cdn.flaticon.com/svg/24/24313.svg" />
      <input type="image" data-action="editar"
             src="http://cdn.flaticon.com/svg/66/66931.svg" />
    </td>
  </tr>
</template>

  • I noticed that both in your example and in my example, we do not use the zebra style in the table, but because it is using the Bootstrap library it is not necessary to use this statement. Bootstrap already comes with a specific class for this ?

  • @devgaspa, since you mentioned, I added a css to make the table zebra.

  • @devgaspa, and as for Bootstrap having a style for this, I really don’t know, until pq I usually use the datatables.net with Bootstrap style

Browser other questions tagged

You are not signed in. Login or sign up in order to post.