2017-07-15 99 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