Obtenha o conteúdo de uma linha da tabela com um clique de botão

87

Preciso extrair os detalhes de cada coluna da minha tabela. Por exemplo, coluna "Nome / Nr.".

  • A tabela contém vários endereços
  • A última coluna de cada linha possui um botão que permite ao usuário escolher um endereço listado.

Problema: Meu código só pega o primeiro <td>que tem uma classe nr. Como faço para que isso funcione?

Aqui está a parte jQuery:

$(".use-address").click(function() {
    var id = $("#choose-address-table").find(".nr:first").text();
    $("#resultas").append(id); // Testing: append the contents of the td to a div
});

Tabela:

<table id="choose-address-table" class="ui-widget ui-widget-content">
    <thead>
        <tr class="ui-widget-header ">
            <th>Name/Nr.</th>
            <th>Street</th>
            <th>Town</th>
            <th>Postcode</th>
            <th>Country</th>
            <th>Options</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td class="nr"><span>50</span>
            </td>
            <td>Some Street 1</td>
            <td>Leeds</td>
            <td>L0 0XX</td>
            <td>United Kingdom</td>
            <td>
                <button type="button" class="use-address" />
            </td>
        </tr>
        <tr>
            <td class="nr">49</td>
            <td>Some Street 2</td>
            <td>Lancaster</td>
            <td>L0 0XX</td>
            <td>United Kingdom</td>
            <td>
                <button type="button" class="use-address" />
            </td>
        </tr>
    </tbody>
</table>
Chuckfinley
fonte
3
Aqui está o tutorial completo com demonstração ao vivo sobre como obter o valor TD da célula da tabela codepedia.info/jquery-get-table-cell-td-value-div
Satinder singh

Respostas:

260

O objetivo do exercício é encontrar a linha que contém as informações. Quando chegarmos lá, podemos facilmente extrair as informações necessárias.

Responda

$(".use-address").click(function() {
    var $item = $(this).closest("tr")   // Finds the closest row <tr> 
                       .find(".nr")     // Gets a descendent with class="nr"
                       .text();         // Retrieves the text within <td>

    $("#resultas").append($item);       // Outputs the answer
});

VER DEMO

Agora, vamos nos concentrar em algumas perguntas frequentes nessas situações.

Como encontrar a linha mais próxima?

Usando .closest():

var $row = $(this).closest("tr");

Usando .parent():

Você também pode subir na árvore DOM usando o .parent()método. Esta é apenas uma alternativa que às vezes é usada junto com .prev()e .next().

var $row = $(this).parent()             // Moves up from <button> to <td>
                  .parent();            // Moves up from <td> to <tr>

Obtendo todos os <td>valores das células da tabela

Portanto, temos nosso $rowe gostaríamos de produzir o texto da célula da tabela:

var $row = $(this).closest("tr"),       // Finds the closest row <tr> 
    $tds = $row.find("td");             // Finds all children <td> elements

$.each($tds, function() {               // Visits every single <td> element
    console.log($(this).text());        // Prints out the text within the <td>
});

VER DEMO

Obtendo um <td>valor específico

Semelhante ao anterior, porém podemos especificar o índice do <td>elemento filho .

var $row = $(this).closest("tr"),        // Finds the closest row <tr> 
    $tds = $row.find("td:nth-child(2)"); // Finds the 2nd <td> element

$.each($tds, function() {                // Visits every single <td> element
    console.log($(this).text());         // Prints out the text within the <td>
});

VER DEMO

Métodos úteis

  • .closest() - obtenha o primeiro elemento que corresponda ao seletor
  • .parent() - obtém o pai de cada elemento no conjunto atual de elementos correspondentes
  • .parents() - obter os ancestrais de cada elemento no conjunto atual de elementos correspondentes
  • .children() - obtenha os filhos de cada elemento no conjunto de elementos correspondentes
  • .siblings() - obter os irmãos de cada elemento no conjunto de elementos correspondentes
  • .find() - obtém os descendentes de cada elemento no conjunto atual de elementos correspondentes
  • .next() - obter o irmão imediatamente seguinte de cada elemento no conjunto de elementos correspondentes
  • .prev() - obter o irmão imediatamente anterior de cada elemento no conjunto de elementos correspondentes
martynas
fonte
E se eu tiver um pop-up e quiser acessar uma tabela da página e excluir a linha? Eu tentei um dos métodos, mas não está funcionando para mim: /
Si8
Você pode preparar um jsFiddle?
martynas de
1
Aqui eu tenho um problema semelhante ao lidar com valores de ID dinâmicos.
5
Não sei como essa resposta não é muito mais votada. Dicas excelentes! Só queria adicionar, você sempre pode obter o valor da coluna como este depois de obter a linha específica $ (this) .closest ("tr"). Find ("td: eq (2)"). Html (); Você receberá a coluna número 2. Felicidades!
Matias
1
Ainda uso essa resposta de vez em quando. Realmente útil e com algumas pequenas modificações, basicamente funciona com todas as tabelas!
Mese
11

Experimente isto:

$(".use-address").click(function() {
   $(this).closest('tr').find('td').each(function() {
        var textval = $(this).text(); // this will be the text of each <td>
   });
});

Isso encontrará o mais próximo tr(subindo pelo DOM) do botão atualmente clicado e, em seguida, fará um loop em cada um td- você pode querer criar uma string / array com os valores.

Exemplo aqui

Obter o endereço completo usando um exemplo de array aqui

Manse
fonte
10

Você precisa alterar seu código para encontrar a linha relativa ao botão que foi clicado. Experimente isto:

$(".use-address").click(function() {
    var id = $(this).closest("tr").find(".nr").text();
    $("#resultas").append(id);
});

Exemplo de violino

Rory McCrossan
fonte
4
function useAdress () { 
var id = $("#choose-address-table").find(".nr:first").text();
alert (id);
$("#resultas").append(id); // Testing: append the contents of the td to a div
};

então em seu botão:

onclick="useAdress()"
Cody Collicott
fonte
1
Isso tem o mesmo problema que o código da pergunta - sempre obtém o id da primeira linha da tabela, independentemente de qual botão da linha foi clicado.
dgvid
3

O seletor ".nr:first"está procurando especificamente pelo primeiro, e apenas o primeiro, elemento com classe "nr"dentro do elemento de tabela selecionado. Se, em vez disso, você chamar .find(".nr"), obterá todos os elementos da tabela com classe "nr". Depois de ter todos esses elementos, você pode usar o método .each para iterar sobre eles. Por exemplo:

$(".use-address").click(function() {
    $("#choose-address-table").find(".nr").each(function(i, nrElt) {
        var id = nrElt.text();
        $("#resultas").append("<p>" + id + "</p>"); // Testing: append the contents of the td to a div
    });
});

No entanto, você obteria todos os td.nrelementos da tabela, não apenas aquele da linha que foi clicado. Para limitar ainda mais sua seleção à linha que contém o botão clicado, use o método .closest , assim:

$(".use-address").click(function() {
    $(this).closest("tr").find(".nr").each(function(i, nrElt) {
        var id = nrElt.text();
        $("#resultas").append("<p>" + id + "</p>"); // Testing: append the contents of the td to a div
    });
});
dgvid
fonte
0

Encontre o elemento com id na linha usando jquery

$(document).ready(function () {
$("button").click(function() {
    //find content of different elements inside a row.
    var nameTxt = $(this).closest('tr').find('.name').text();
    var emailTxt = $(this).closest('tr').find('.email').text();
    //assign above variables text1,text2 values to other elements.
    $("#name").val( nameTxt );
    $("#email").val( emailTxt );
    });
});
Super Model
fonte
0
var values = [];
var count = 0;
$("#tblName").on("click", "tbody tr", function (event) {
   $(this).find("td").each(function () {
       values[count] = $(this).text();
       count++;
    });
});

Agora a matriz de valores contém todos os valores da célula daquela linha podem ser usados ​​como valores [0] primeiro valor da célula da linha clicada

Muhammad Waqas Aziz
fonte
0

Aqui está o código completo para um exemplo simples de delegado

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

</head>
<body>

<div class="container">
  <h2>Striped Rows</h2>
  <p>The .table-striped class adds zebra-stripes to a table:</p>            
  <table class="table table-striped">
    <thead>
      <tr>
        <th>Firstname</th>
        <th>Lastname</th>
        <th>Email</th>

      </tr>
    </thead>
    <tbody>
      <tr>
        <td>John</td>
        <td>Doe</td>
        <td>[email protected]</td>
        <td>click</td>
      </tr>
      <tr>
        <td>Mary</td>
        <td>Moe</td>
        <td>[email protected]</td>
        <td>click</td>
      </tr>
      <tr>
        <td>July</td>
        <td>Dooley</td>
        <td>[email protected]</td>
        <td>click</td>
      </tr>

    </tbody>
  </table>
  <script>
  $(document).ready(function(){
  $("div").delegate("table tbody tr td:nth-child(4)", "click", function(){
  var $row = $(this).closest("tr"),        // Finds the closest row <tr> 
    $tds = $row.find("td:nth-child(2)");
     $.each($tds, function() {
        console.log($(this).text());
        var x = $(this).text();
        alert(x);
    });
    });
});
  </script>
</div>

</body>
</html>
Ankush
fonte