2010-08-23 151 views
7

希望有人能提供建議。一旦鏈接被點擊,試圖刪除行就會出現問題。jQuery最接近的TR選擇

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> 

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

這應該是真正簡單的擊打它不刪除行。只是爲了踢,如果我改變它像

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

它會將foo添加到所有錶行。所以可以理解爲什麼它沒有刪除最近的行。

任何想法?

先進的感謝。

回答

18

的問題是this目前指的是Ajax對象在success回調,但它是一個簡單的辦法,使用content選項是這樣的:

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

context選項規定什麼this將在$.ajax()回調函數,因爲您希望它是您單擊的.remove-row,請使用this作爲選項。

+0

尼克 - 小幅調整。在'success:'回調中,'this'是指'xhr'對象,而不是'window'。 http://jsfiddle.net/WzeAh/ *這當然與您提出的解決方案沒有關係。* +1 – user113716 2010-08-23 15:33:13

+0

@patrick - 對不起,我會在答案中進一步澄清,它*表現*像當前使用的「窗口」,例如'$(this).find(selector)'的作用與'$(this)'爲'$(window)'或'$(document)'相同。 – 2010-08-23 15:57:35

+0

尼克 - 除非我誤解你的說明,它似乎(在回調中)好像'$(this)'給你'$(document)'相同的行爲,因爲做一個'.find()'返回'0'匹配。 http://jsfiddle.net/WzeAh/1/編輯:'$(窗口)'也給出了'0'結果。 – user113716 2010-08-23 16:05:33

2

尼克的回答應該可行,但你也可以這樣做,我不知道哪一個更好,可能是尼克的一個,但它可以幫助反正...

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

手動去除/隱藏不是更容易嗎?

這樣的:

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