2010-08-23 12 views
7

आशा है कि कोई सलाह दे सकता है। एक लिंक पर क्लिक करने के बाद एक पंक्ति को हटाने की कोशिश कर रहे मुद्दों को क्लिक करना।jQuery निकटतम टीआर चयन

एचटीएमएल

<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> 

अब जे एस

$("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 है वर्तमान में आपके success कॉलबैक में ajax वस्तु को संदर्भित करता है, लेकिन यह एक आसान ठीक है, 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

निक - माइनर सुधार। 'सफलता:' कॉलबैक में, 'यह' 'xhr' ऑब्जेक्ट को संदर्भित करता है, न कि 'विंडो'। http://jsfiddle.net/WzeAh/ * यह निश्चित रूप से आपके प्रस्तावित समाधान के संबंध में कोई प्रासंगिकता नहीं है। * +1 – user113716

+0

@patrick - क्षमा करें, मैं उत्तर में थोड़ा और स्पष्टीकरण दूंगा, यह * व्यवहार * वर्तमान उपयोग के लिए 'विंडो' की तरह, उदाहरण के लिए '$ (यह)। ढूँढें (चयनकर्ता) 'वही काम करता है जैसे' $ (यह) '' $ (विंडो) 'या' $ (दस्तावेज़) 'था। –

+0

निक - जब तक मैं आपकी स्पष्टीकरण को गलत समझा नहीं जाता, ऐसा लगता है कि यह (कॉलबैक के अंदर) नहीं लगता है कि '$ (यह) आपको '$ (दस्तावेज़)' के समान व्यवहार देता है, क्योंकि' .find() 'रिटर्न '0' मैचों। http://jsfiddle.net/WzeAh/1/ संपादित करें: '$ (विंडो) '' 0' परिणाम भी देता है। – user113716

0

आपके पास पहली पंक्ति में class="remove-row संलग्न विशेषता है।

See here

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> 
     ...... 
संबंधित मुद्दे