Hope someone can advise. Having issues trying to remove a row once a link has been clicked.
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>
Now the 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);
}
}
})
});
This should be real simple buts its not removing the row. Just for kicks if I change it to something like
$('.remove-row').addClass('foo');
It will add foo to all table rows. So can understand why its not removing the closest row.
Any Ideas ?
Thank in advanced.
The closest() is an inbuilt method in jQuery that returns the first ancestor of the selected element in the DOM tree. This method traverse upwards from the current element in the search of first ancestor of the element.
jQuery | parent() & parents() with ExamplesThe parent() is an inbuilt method in jQuery which is used to find the parent element related to the selected element. This parent() method in jQuery traverse a single level up the selected element and return that element.
Definition and UsageThe closest() method searches up the DOM tree for elements which matches a specified CSS selector. The closest() method starts at the element itself, then the anchestors (parent, grandparent, ...) until a match is found. The closest() method returns null() if no match is found.
The problem is this
currently refers to the ajax object in your success
callback, but it's an easy fix, use the content
option like this:
$("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);
}
}
})
});
The context
option dictates what this
will be in the $.ajax()
callback functions, since you want it to be the .remove-row
you clicked on, use this
as the option.
Nick's answer should work, but you can do this too, I don't know which one is better, probably Nick's one, but it may help anyway...
$("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);
}
}
})
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With