2014-04-23 15 views
18

der Code unten addiert und Tabellenzeile mit Hilfe von JQuery die Add-Funktion funktioniert gut zu entfernen, aber das Entfernen nur funktionieren, wenn ichTabellenzeile löschen mit 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> 

und das Skript die erste Zeile entfernen

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; 
}); 

Kann mir jemand die Erklärung geben, warum ich nur die erste Reihe entfernen kann? danken so viel

+0

Hier schöner Artikel http://codepedia.info/2015/02/remove-table-row-tr -in-jquery/auf, wie man Tabelle sogar für dynamisch hinzugefügtes tr –

Antwort

35

Sie benötigen Ereignis Delegation verwenden, da diese Tasten auf Last existieren nicht:

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

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

Beim Klonen, die standardmäßig wird es nicht die Ereignisse klonen. Den hinzugefügten Zeilen ist kein Ereignishandler zugeordnet. Wenn Sie clone(true) anrufen, dann sollte es sie auch behandeln.

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

+0

entfernt, sogar einfacher als meine Antwort. Nett. http://jsfiddle.net/isherwood/Z7fG7/5/ – isherwood

+0

@isherwood - es ist erst vor kurzem, dass ich auf Ihre Art der Event-Delegation stieß. Ich habe Ereignisse immer direkt nach dem Erstellen von Objekten angehängt. Ich mag deinen Weg, weil ich einen Codeabschnitt haben könnte, in dem ich meine gesamten Event-Handling-Aufgaben bündle. Ist es eine Frage der persönlichen Präferenz, oder ist ein Weg mehr Standard als der andere? – Danny

+0

Ich würde sagen, dass es situationsabhängig ist. Was ist für den nächsten Entwickler klarer, der durch Ihren Code stolpert? – isherwood

0

Eine einfache Lösung ist Code von Tastenereignis in einer Funktion kapseln, und es nennen, wenn Sie TRs zu addieren:

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

Verwendet Ereignis Delegation, becouse Sie erstellen dynamische Zeilen.

$(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; 
}); 

Das perfekt funktioniert, nehmen Sie nicht von document.body

+0

Sorry, aber dies ist eine direkte Kopie von Wilfredo, aber es wird auch nicht funktionieren. Sie haben einen halben Kommentar. –

Verwandte Themen