2014-04-23 20 views
18

il codice qui sotto aggiungere e rimuovere riga della tabella con l'aiuto di jQuery funzione add funziona bene, ma la rimozione funzionano solo se mi tolgo la prima filacancellare riga della tabella utilizzando jQuery

<table> 
    <tr> 
    <td><button type="button" class="removebutton" title="Remove this row">X</button> 
</td> 
     <td><input type="text" id="txtTitle" name="txtTitle"></td> 
     <td><input type="text" id="txtLink" name="txtLink"></td> 
    </tr> 
</table> 
<button id ="addbutton">Add Row</button> 

e lo script

var i = 1; 
$("#addbutton").click(function() { 
    $("table tr:first").clone().find("input").each(function() { 
    $(this).val('').attr({ 
     'id': function(_, id) {return id + i }, 
     'name': function(_, name) { return name + i }, 
     'value': ''    
    }); 
    }).end().appendTo("table"); 
    i++; 
}); 

$('button.removebutton').on('click',function() { 
    alert("aa"); 
    $(this).closest('tr').remove(); 
    return false; 
}); 

qualcuno può darmi la spiegazione del motivo per cui posso rimuovere solo la prima riga? grazie mille

+0

Ecco bell'articolo http://codepedia.info/2015/02/remove-table-row-tr -in-jquery/su come rimuovere la tabella anche per aggiunto dinamicamente tr –

risposta

35

È necessario utilizzare la delega evento perché non esistono quei pulsanti sul carico:

http://jsfiddle.net/isherwood/Z7fG7/1/

$(document).on('click', 'button.removebutton', function() { // <-- changes 
    alert("aa"); 
    $(this).closest('tr').remove(); 
    return false; 
}); 
3

Quando la clonazione, per impostazione predefinita è non clonare gli eventi. Le righe aggiunte non hanno un gestore eventi collegato a loro. Se chiami clone(true) allora dovrebbe gestirli pure.

http://api.jquery.com/clone/

+0

Ancora più semplice della mia risposta. Bello. http://jsfiddle.net/isherwood/Z7fG7/5/ – isherwood

+0

@isherwood - è solo di recente che ho trovato il tuo stile di delega degli eventi. Stavo sempre allegando gli eventi subito dopo aver creato gli oggetti. Mi piace il tuo modo perché potrei avere una sezione di codice in cui raggruppo tutto il mio evento gestendo in anticipo. È una questione di preferenze personali, o è un modo più standard rispetto all'altro? – Danny

+0

Direi che dipende dalla situazione. Cosa c'è di più chiaro al prossimo sviluppatore che inciampa nel tuo codice? – isherwood

0

Una soluzione semplice è incapsulare il codice di evento tasto in una funzione, e lo chiamano quando si aggiunge TR troppo:

var i = 1; 
$("#addbutton").click(function() { 
    $("table tr:first").clone().find("input").each(function() { 
    $(this).val('').attr({ 
     'id': function(_, id) {return id + i }, 
     'name': function(_, name) { return name + i }, 
     'value': ''    
    }); 
    }).end().appendTo("table"); 
    i++; 

    applyRemoveEvent(); 
}); 


function applyRemoveEvent(){ 
    $('button.removebutton').on('click',function() { 
     alert("aa"); 
     $(this).closest('tr').remove(); 
     return false; 
    }); 
}; 

applyRemoveEvent(); 

http://jsfiddle.net/Z7fG7/2/

4

Usa delegazione evento, siccome stai creando righe dinamiche.

$(document).on('click','button.removebutton', function() { 
    alert("aa"); 
    $(this).closest('tr').remove(); 
    return false; 
}); 

Live Demo

-1
$(document.body).on('click', 'buttontrash', function() { // <-- changes 
    alert("aa"); 
    /$(this).closest('tr').remove(); 
    return false; 
}); 

Questo funziona perfettamente, non di prendere document.body

+0

Scusa, ma questa è una copia diretta di Wilfredo ma non funzionerà neanche. Hai un mezzo commento. –

Problemi correlati