2015-05-18 18 views
7

Ho una struttura di tabella come questa. Abbastanza semplice.Trova il selettore della tabella figlio dalla tabella padre - jQuery

<table id="myTable" class="table"> 
    <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> 
     </tr> 
     <tr> 
     <td>Mary</td> 
     <td>Moe</td> 
     <td>[email protected]</td> 
     </tr> 
     <tr> 
     <td>July</td> 
     <td>Dooley</td> 
     <td>[email protected]</td> 
     </tr> 
    </tbody> 
    </table> 

In fase di esecuzione sto vincolante una nuova riga a questa tabella per un particolare rowclick. Questa nuova riga contiene una nuova tabella.

Ora, facendo nuovamente clic sulla riga, desidero essere in grado di rimuovere lo row(the new table) appena aggiunto.

Sto usando bootstrap table.

Ecco cosa ho provato finora.

$('#myTable').on('click-row.bs.table', function (e, row, $element) { 
    //if ($element.has('#newlyAddedTable').length) { ....// did not work 

    if ($('#myTable').has('#newlyAddedTable').length) { // this removes the table on any row click. Not what I intend to do 
    { 
     $("#newlyAddedTable").remove(); 
    } else { 
     // some operation... 
    } 
} 

Voglio essere in grado di rimuovere la tabella appena aggiunta sulla riga è stata creata.

Proprio maggiori spiegazioni sulla base delle risposte di seguito:

<tr> ----------> if i click this 
    <td> 
    <table id="newlyAddedTable"> ---------> this is added 
    </table> 
    </td> 
</tr> 

<tr> ----------> if i again click this or maybe any other row in the table 
    <td> 
    <table id="newlyAddedTable"> ---------> this is removed 
    </table> 
    </td> 
</tr> 
+0

Si prega di non utilizzare un selettore di id per la nuova tabella; una volta aggiunte due nuove tabelle, il codice HTML non è più valido e non è possibile prevedere come il browser gestirà eventuali manipolazioni rispetto all'id ripetuto. – PeterKA

+0

@peterka, ha senso .... in realtà ho avuto un sacco di classi di 'bootstrap' scritte sul tavolo e quindi ho pensato al selettore ID –

risposta

7

Aggiornamento: dal commento dell'OP di seguito sembra che il modo migliore per implementare la nuova tabella sia utilizzare un selettore di classe e non un selettore di ID. Il codice sottostante è stato aggiornato di conseguenza. *** Dove prima c'era un ID per newTable c'è una classe --->#newTable ===>.newTable:

Basta cambiare:

$('#myTable').has('#newlyAddedTable').length 

A:

$('.newlyAddedTable', $element).length //element === clicked row -- see demo 

vvvvv DEMO vvvvv

$('#myTable').bootstrapTable().on('click-row.bs.table', function(e, row, $element) { 
 
    if($('.newTable', $element).length) { 
 
     $('.newTable', $element).remove(); 
 
    } else { 
 
     $('td:first', $element) 
 
     .append('<table class="newTable"><tr><td>NEW TABLE</td></tr></table>'); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script> 
 
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.7.0/bootstrap-table.min.js"></script> 
 
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-table/1.7.0/bootstrap-table.min.css" rel="stylesheet"/> 
 
<table id="myTable" class="table"> 
 
    <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> 
 
     </tr> 
 
     <tr> 
 
     <td>Mary</td> 
 
     <td>Moe</td> 
 
     <td>[email protected]</td> 
 
     </tr> 
 
     <tr> 
 
     <td>July</td> 
 
     <td>Dooley</td> 
 
     <td>[email protected]</td> 
 
     </tr> 
 
    </tbody> 
 
    </table>

+0

Vedere il commento:' // rimuove la tabella su qualsiasi riga clic Non è quello che intendo fare ' – jcuenod

+0

Cosa intendi esattamente? Hai più tabelle con sa ID mio? Ciò invaliderebbe il tuo comportamento HTML e browser non sarebbe coerente. Se un clic deve inserire una tabella qualsiasi riga cliccata, utilizzare una classe per la nuova tabella. Si prega di consultare il mio aggiornamento sopra - a breve. – PeterKA

+0

@PeterKA, se un clic inserisce una tabella su una riga fare clic quindi dovrebbe rimuovere la stessa tabella sullo stesso clic di riga o qualsiasi altro clic di riga. Più simile alla funzione di fisarmonica. –

3

provare a sostituire il codice di rimuovere con questo:

$(document).on("click", "#newlyAddedTable", function(){ 
    $(this).remove(); 
}); 

Il codice precedente registra un clic ascoltatore sul document. Il secondo parametro filtra tali eventi per quelli con l'obiettivo #newlyAddedTable. In questo modo non devi registrare un nuovo gestore di clic ogni volta che inserisci una riga (come nella soluzione di @ VimalanJayaGanesh).

P.S. Se si aggiunge HTML che assomiglia a questo:

<tr> 
    <td> 
    <table id="newlyAddedTable"> 
    </table> 
    </td> 
</tr> 

probabilmente stai in realtà voler rimuovere il genitore tr (non la tabella con il id). Ci sono due modi per risolvere questo problema.

  1. È possibile modificare il selettore che filtri eventi click e così hanno l'tr gestire il clic, piuttosto che l'elemento table nel mio codice di esempio:

$(document).on("click", "tr:has(#newlyAddedTable)", function(){

  1. Puoi lasciare il selettore come è ma afferrare il genitore tr dalla tabella e rimuovere quella modificando la riga di rimozione sopra a:

$(this).parents("tr").first().remove()

o

$(this).parent().parent().remove()

+0

mi stai chiedendo di rimuovere questo dal mio codice e sostituire con il tuo -' $ (' #myTable '). on (' click-row.bs.table ', funzione (e, riga, $ elemento) {' –

+0

@NitinP scusa - fuso orario errato per aiutare ma vedo che sei ordinato. – jcuenod

3

Come io non ho il tuo codice completo/violinista, ecco una possibile soluzione.

Stai cercando qualcosa di simile?

$('#add').on('click', function() 
 
    { 
 
    var newRow = '<tr CLASS="newrow"><td colspan="3"><table><tr><td>Test</td><td>User</td><td>[email protected]</td></table></td></tr>' 
 
    $('#myTableBody').append(newRow); 
 
    Remove() 
 
    }); 
 

 
function Remove() 
 
{ 
 
$('.newrow').off('click').on('click', function() 
 
    { 
 
     $(this).remove(); 
 
    }); 
 
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<table id="myTable" class="table"> 
 
    <thead> 
 
     <tr> 
 
     <th>Firstname</th> 
 
     <th>Lastname</th> 
 
     <th>Email</th> 
 
     </tr> 
 
    </thead> 
 
    <tbody id="myTableBody"> 
 
     <tr> 
 
     <td>John</td> 
 
     <td>Doe</td> 
 
     <td>[email protected]</td> 
 
     </tr> 
 
     <tr> 
 
     <td>Mary</td> 
 
     <td>Moe</td> 
 
     <td>[email protected]</td> 
 
     </tr> 
 
     <tr> 
 
     <td>July</td> 
 
     <td>Dooley</td> 
 
     <td>[email protected]</td> 
 
     </tr> 
 
    </tbody> 
 
    </table> 
 
<button type='button' id='add'>Add</button>

Nota:

La riga seguente indica che,

$('.newrow').off('click').on('click', function() 

l'evento click sarà binded alla nuova riga solo una volta.

Il motivo dell'aggiunta di "off" ("clic") è, quando si aggiungono dinamicamente le righe (con la classe comune "newrow") alla tabella, gli eventi verranno associati più volte. Per evitare ciò, rimuovere l'evento click precedentemente associato e aggiungerne uno nuovo.

+0

puoi spiegarlo in la tua risposta che cosa fa - '$ ('. newrow'). off ('click'). on ('click', function()' –

+0

quindi dovrei rimuovere - '$ ('# myTable'). on ('click-row.bs.table', function (e, row, $ element) {'o sarà il tuo codice -' $ ('. newrow'). off ('click'). on ('clic', funzione () 'sii all'interno dell'evento click che sto usando –

Problemi correlati