2010-08-23 17 views
7

Spero che qualcuno possa consigliare. Problemi durante il tentativo di rimuovere una riga dopo aver fatto clic su un collegamento.jQuery selezione TR più vicina

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> 

Ora il JS

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

Questo dovrebbe essere semplice reale senza ma la sua non è la rimozione della fila. Solo per calci se lo cambio a qualcosa come

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

Aggiungerà foo a tutte le righe della tabella. Così può capire perché non rimuove la riga più vicina.

Qualsiasi idea?

Grazie in anticipo.

risposta

18

Il problema è this attualmente si riferisce all'oggetto ajax nella vostra success richiamata, ma è una soluzione semplice, utilizzare l'opzione content in questo modo:

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

L'opzione context detta ciò this sarà nel $.ajax() funzioni di callback, dal momento che si desidera che sia il .remove-row su cui si è fatto clic, utilizzare l'opzione this come opzione.

+0

Nick - piccola correzione. Nel 'successo:' callback, 'this' si riferisce all'oggetto' xhr', non 'window'. http://jsfiddle.net/WzeAh/ * Questo, ovviamente, non ha rilevanza per quanto riguarda la soluzione proposta. * +1 – user113716

+0

@patrick - Scusa, chiarirò un po 'di più nella risposta, si * si comporta * come 'window' per l'uso corrente, ad es '$ (this) .find (selector)' funziona come se '$ (this)' fosse '$ (window)' o '$ (document)'. –

+0

Nick - A meno che non abbia frainteso il tuo chiarimento, non sembra (all'interno del callback) come se '$ (this)' ti dà lo stesso comportamento di '$ (document)', poiché facendo un '.find()' restituisce Partite '0'. http://jsfiddle.net/WzeAh/1/ EDIT: '$ (window)' dà anche un risultato '0'. – user113716

2

risposta di Nick dovrebbe funzionare, ma si può fare anche questo, non so che uno è meglio, probabilmente uno di Nick, ma può aiutare in ogni modo ...

$("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

Non sarebbe più facile fare la rimozione/nascondino prima mano?

come questo:

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