2015-02-24 61 views
0

我在使用jQuery時遇到了一些麻煩。我試圖做一個AJAX請求,並改變點擊元素,如果該請求給出正確的響應。在jQuery中使用replaceWith()時出現奇怪的行爲

我的jQuery:

$(document).on('click', '.add-to-check', function (e) { 
    e.preventDefault(); 
    var url = $(this).attr('href'); 
    $.ajax({ 
     url: url, 
     type: "GET", 
     success: function (response) { 
      var result = jQuery.parseJSON(response); 
      if (result.status == 'success') { 
       $(e.target).replaceWith('<i class="fa fa-check"></i>'); 
      } else if (result.status == 'failure') { 
       // failure 
      } 
     }, 
    }); 
    return false; 
}); 

我的HTML:

<a class="btn btn-sm btn-primary pull-left add-to-check" href="/tasks/check/1235"><i class="fa fa-close"></i></a> 

這不能正常工作,但是。當我點擊按鈕時,大多數時候按鈕會消失,並顯示一個檢查圖標。這是它應該工作的方式。

然而,有時候:複選標記出現,但它仍然是一個按鈕。我無法弄清楚爲什麼會這樣。

+0

@RienNeVaPlu͢s用$(this)替換它是我最初的想法。但是,當我這樣做時,腳本不起作用。我認爲這是因爲我使用$(文檔)。有人可以支持我嗎? – Peter 2015-02-24 16:03:26

+0

不,它不會工作,因爲'this'的上下文已經改變。 – Michelangelo 2015-02-24 16:04:31

+2

只是瘋狂的猜測,但是當你點擊元素 - 是不是目標實際元素?因此,當您替換它時,鏈接元素將保留,因爲腳本替換了原始目標的元素。 – koressak 2015-02-24 16:10:17

回答

1

試試這樣說:

$(document).on('click', '.add-to-check', function (e) { 
e.preventDefault(); 
var $this = $(this); 
var url = $this.attr('href'); 
$.ajax({ 
    url: url, 
    type: "GET", 
    success: function (response) { 
     var result = jQuery.parseJSON(response); 
     if (result.status == 'success') { 
      $this.replaceWith('<i class="fa fa-check"></i>'); 
     } else if (result.status == 'failure') { 
      // failure 
     } 
    }, 
}); 
return false; 

});

+0

使用您的解決方案,圖標會更改,但按鈕保持一個按鈕。我希望按鈕消失。 – Peter 2015-02-24 16:10:13

+0

好的,那麼它應該是'$ this.replaceWith'而不是'$ this.html' – Rudi 2015-02-24 16:15:15

+0

似乎我已經用'$ this.closest('。add-to-check')修復了這個問題。replaceWith(' ');' – Peter 2015-02-25 07:54:36

0

其他方法是預先生成並隱藏成功的圖標元素(例如類成功)。

當你到達服務器的成功響應時(任務已經完成),你只需隱藏鏈接元素並顯示成功的圖標。

相關問題