2010-08-23 10 views
7

Hoffe jemand kann beraten. Probleme beim Versuch, eine Zeile zu entfernen, nachdem auf einen Link geklickt wurde.jQuery nächste TR-Auswahl

HTML

<table> 
    <tr><td>Some Data</td><td><a href="#" class="remove-row>Remove Row</a></td></tr> 
    <tr><td>Some Data</td><td><a href="#" class="remove-row">Remove Row</a></td></tr> 
</table> 

die JS Jetzt

$("a.remove-row").live('click', function(eve){ 
    eve.preventDefault(); 
    $.ajax({ 
    type: 'GET', 
    url: '/someaction/', 
    dataType: 'json', 
    success: function(msg){ 
    if(msg.error){ 
    alert(msg.error); 
    }else{ 
    $(this).closest('tr').remove(); 
    alert(msg.success); 
    }  
    } 
    }) 
}); 

Dies sollte wirklich einfach sein buts seine die Zeile nicht entfernen. Nur für Tritte, wenn ich es in etwas wie

$('.remove-row').addClass('foo'); 

ändern Es wird foo zu allen Tabellenzeilen hinzufügen. So kann verstehen, warum es nicht die nächste Zeile entfernt.

Irgendwelche Ideen?

Vielen Dank im Voraus.

Antwort

18

Das Problem ist this bezieht sich derzeit auf die Ajax-Objekt in Ihrem success Rückruf, aber es ist eine einfache Lösung, verwenden Sie die content Option wie folgt aus:

$("a.remove-row").live('click', function(eve){ 
    eve.preventDefault(); 
    $.ajax({ 
    context: this,     //add this here! 
    type: 'GET', 
    url: '/someaction/', 
    dataType: 'json', 
    success: function(msg){ 
    if(msg.error){ 
    alert(msg.error); 
    }else{ 
    $(this).closest('tr').remove(); 
    alert(msg.success); 
    }  
    } 
    }) 
}); 

Die context Option diktiert, was this in der $.ajax() sein Callback-Funktionen, da Sie möchten, dass es die .remove-row, die Sie geklickt haben, verwenden Sie this als die Option.

+0

Nick - Schwacher Korrektur. Im 'success:' Callback bezieht sich 'this' auf das' xhr' Objekt, nicht auf 'window'. http://jsfiddle.net/WzeAh/ * Dies hat natürlich keine Relevanz in Bezug auf Ihre vorgeschlagene Lösung. * +1 – user113716

+0

@patrick - Sorry, ich werde ein bisschen mehr in der Antwort klären, es verhält sich * wie "Fenster" für die aktuelle Verwendung, z '$ (this) .find (selector)' funktioniert genauso, als wäre '$ (this)' '$ (window)' oder '$ (document)'. –

+0

Nick - Wenn ich Ihre Klarstellung nicht missverstanden habe, scheint es (innerhalb des Callbacks) nicht so, als ob '$ (this)' Ihnen das gleiche Verhalten wie '$ (document)' gibt, da ein '.find()' zurückkommt '0' stimmt überein. http://jsfiddle.net/WzeAh/1/ EDIT: '$ (window)' gibt auch ein "0" Ergebnis. – user113716

0

Sie haben das Attribut class="remove-row in der ersten Zeile nicht geschlossen.

See here

2

Nick Antwort sollte funktionieren, aber Sie können dies auch tun, ich weiß nicht, was man besser ist, wahrscheinlich ein Nick, aber es kann trotzdem helfen ...

$("a.remove-row").live('click', function(eve){ 
    var row = this; 
    eve.preventDefault(); 
    $.ajax({ 
    type: 'GET', 
    url: '/someaction/', 
    dataType: 'json', 
    success: function(msg){ 
    if(msg.error){ 
    alert(msg.error); 
    }else{ 
    $(row).closest('tr').remove(); 
    alert(msg.success); 
    }  
    } 
    }) 
}); 
0

Wäre es nicht einfacher, das Entfernen/Verbergen vor der Hand zu machen?

wie folgt aus:

$("a.remove-row").live('click', function(eve){ 
     $(this).hide(); 
     <The rest of your code logic> 
     ......