2010-08-23 30 views
7

Hy vọng ai đó có thể tư vấn. Gặp sự cố khi cố xóa một hàng sau khi một liên kết được nhấp vào.jQuery lựa chọn TR gần nhất

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> 

Bây giờ 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); 
    }  
    } 
    }) 
}); 

này cần được thực đơn giản buts nó không loại bỏ hàng. Chỉ cần đá nếu tôi đổi nó thành một cái gì đó như

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

Nó sẽ thêm foo vào tất cả các hàng trong bảng. Vì vậy, có thể hiểu tại sao nó không loại bỏ hàng gần nhất.

Bất kỳ ý tưởng nào?

Cảm ơn bạn đã nâng cao.

Trả lời

18

Vấn đề là this hiện đề cập đến đối tượng ajax trong success callback của bạn, nhưng nó là một sửa chữa dễ dàng, sử dụng tùy chọn content như thế này:

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

Tùy chọn context mệnh lệnh gì this sẽ được trong $.ajax() chức năng gọi lại, vì bạn muốn nó là .remove-row bạn đã nhấp vào, hãy sử dụng this làm tùy chọn.

+0

Nick - sửa chữa nhỏ. Trong 'success:' callback, 'this' dùng để chỉ đối tượng' xhr', không phải 'window'. http://jsfiddle.net/WzeAh/ * Điều này, tất nhiên, không liên quan gì đến giải pháp được đề xuất của bạn. * +1 – user113716

+0

@patrick - Xin lỗi, tôi sẽ làm rõ thêm một chút trong câu trả lời, nó * cư xử * như 'cửa sổ' cho mục đích sử dụng hiện tại, ví dụ '$ (this) .find (selector)' hoạt động giống như nếu '$ (this)' là '$ (window)' hoặc '$ (document)'. –

+0

Nick - Trừ khi tôi hiểu lầm rõ ràng của bạn, nó không có vẻ (bên trong gọi lại) như thể '$ (this)' cung cấp cho bạn hành vi tương tự như '$ (document)', vì thực hiện '.find()' '0' khớp. http://jsfiddle.net/WzeAh/1/ EDIT: '$ (cửa sổ)' cũng cho kết quả '0'. – user113716

0

Bạn có thuộc tính chưa được đính kèm class="remove-row ở hàng đầu tiên.

See here

2

câu trả lời của Nick nên làm việc, nhưng bạn có thể làm điều này quá, tôi không biết cái nào là tốt hơn, có lẽ Nick của một, nhưng nó có thể giúp 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); 
    }  
    } 
    }) 
}); 
0

Nó sẽ không được dễ dàng hơn để làm việc loại bỏ/ẩn trước khi tay?

như thế này:

$("a.remove-row").live('click', function(eve){ 
     $(this).hide(); 
     <The rest of your code logic> 
     ...... 
Các vấn đề liên quan