jQuery - hasClass问题

时间:2017-07-15 15:02:15

标签: javascript jquery

我有一个在页脚中有这些按钮的表单

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

奇怪的是,第一次检查是有效的。无论我点击什么按钮,它都不会在上课时触发部分&#34;重定向&#34;检查。我有点难以解决这个问题,我不知道我可能做错了什么。任何帮助都会受到高度赞赏。

度过愉快的一天。

2 个答案:

答案 0 :(得分: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 :(得分: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')) {

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

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