2017-07-15 76 views
1

我雖然形式不被這些提出,在頁腳jQuery的 - hasClass問題

<button type="button" class="btn btn-warning redirect store-submit">Add and redirect</button> 
<button type="submit" class="btn btn-success store-submit">Just add</button> 

這些按鈕的形式。它們被用來觸發jQuery事件

$("button").click(function(e){ 
if($(this).hasClass('store-submit')){ 
    e.preventDefault(); 
    var form_action = $("#add-modal").find("form").attr("action"); 
    var data = $("#add-modal").find("textarea[name='data']").val(); 
    var token = $('meta[name="csrf-token"]').attr('content'); 
    var type = {{$user->type}}; 
    $.ajax({ 
     dataType: 'json', 
     type:'POST', 
     url: form_action, 
     data:{data:data, _token:token} 
    }).done(function(data){ 
     $("#add-modal").modal('hide'); 
     update(data.id); //calling out another function 
     if($(this).hasClass('redirect')){  //DOESNT WORK 
      //some action 
     } 
    }).error(function(data){ 
    //error 
    }); 
} 
}); 

奇怪的是,第一個類檢查工作。無論按下哪個按鈕,它都不會在選中「重定向」類時觸發部分內容。我有點努力解決這個問題,我不知道我可能做錯了什麼。任何幫助將非常感激。

祝您有愉快的一天。

+0

回調函數內'$ .fn.ajax'方法有不同的上下文比你期待。你應該設置選項'上下文:this' of ajax方法 –

回答

1

$(this)沒有指向按鈕了。爲了解決這個問題,您可以按照@dfsq的建議使用.bind(),或者您可以將$(this)分配給一個變量,然後使用它。像

var btn = $(this); 

後來使用上面

.done(function(data) { 
    $("#add-modal").modal('hide'); 
    update(data.id); 
    if(btn.hasClass('redirect')) { 
    //some action 
    } 

而且,在這裏好的部分是,你不必叫$(this)無處不在,因爲你持有一個一個的$(this)參考變量。所以,你也可以改變

if($(this).hasClass('store-submit')) { 

TO

if(btn.hasClass('store-submit')) { 

//and practically everywhere you can use btn instead of $(this) 
+1

好吧,這似乎很容易。很好的答案。將盡快接受:D – Ethris

1

您需要綁定回調函數以更正上下文。做到這一點的方法之一是使用Function.prototype.bind

.done(function(data) { 
    $("#add-modal").modal('hide'); 
    update(data.id); // calling out another function 
    if ($(this).hasClass('redirect')) { 
     //some action 
    } 
}.bind(this)) // note: bind(this) call 
+1

jQuery'ajax'方法有一個選項:) –

+0

@ A.WolffI知道,也有jQuery有'$ .proxy',也可以保存var self = this。我接受的答案是最佳的。 – dfsq