2016-01-14 3 views
3

Отправка запроса ajax для вставки данных в базу данных. После успешной отправки моего сообщения кнопки не было изменено. При нажатии i загорается сообщение Please wait... при успешном запуске устанавливается новое значение html Done. Записи в db созданы успешно, но текст кнопки до Done не был изменен.Jquery ajax не выполняет успех

Мой сценарий:

var Friend = { 

    // Add new friend 
    add: function() { 
     var btn = $(".btn-add-friend"); 

     btn.click(function() { 

      $(this).html("Please wait..."); 

      $.ajax({ 
       type: "post", 
       url: baseurl + "/FriendRequest/send", 
       data: { 
        friend: $(this).data('friend') 
       }, 

       success: function(xhr, status) { 
        $(this).html("Done"); // Not wortk 

        alert("done"); // <-- Work 
       }, 
       error: function(response, s, e) { 
        alert(response.responseText); 
       }, 
       complete: function() { 
        //. the some from success 
       } 
      }); 
     }); 
     }, 

    // Initialise 
    init: function() { 
     Friend.add(); 
    } 
}; 

Html:

<button type="button" id="item-<?=$person->account_id;?>" class="btn btn-xs btn-add-friend has-spinner" data-friend="<?= $person->account_id;?>"><i class="fa fa-plus-circle"></i> Add Friend</button> 

Когда я нажимаю на кнопку текст был changet к Please wait.., но после того, как успех не изменил Done и оповещения успешно выполнена.

похоже, что это не часть DOM после нажатия! Я также пытаюсь с on() получить некоторый результат.

+0

Проверьте, что ваша переменная 'baseurl' имеет некоторое значение перед передачей ее в' url'. – divy3993

+0

baseurl не является проблемой для его простого URL-адреса для контроллера, после того, как все данные успешно вставляются в базу данных. – Ivan

ответ

4

this Внутри функции обратного вызова функции ajax есть ... ajax-вызов, а не элемент с щелчком.
Вы должны заменить его с ним

add: function() { 
    var btn = $(".btn-add-friend"); 

    btn.click(function() { 

     var self = $(this); 

     self.html("Please wait..."); 

     $.ajax({ 
      type: "post", 
      url: baseurl + "/FriendRequest/send", 
      data: { 
       friend: self.data('friend') 
      }, 
      success: function(xhr, status) { 
       self.html("Done"); 
      }, 
+0

Am looping list list db и есть 100 пользователей с некоторой кнопкой. Если я установил 'btn.html (« done »), я изменил все кнопки на выполнение :(для этого мне нужно указывать только одну кнопку – Ivan

+0

Вам понадобится переменная для хранения значения' this', отредактированного – adeneo

+0

Правильно .... Спасибо, теперь работа. Так что в следующий раз мне нужно определить переменную, которая будет содержать 'this', спасибо человеку. – Ivan

1

Чтобы использовать this, вам нужно дополнительный атрибут. Добавьте следующие с url

context:this 

Итак, обновленный код будет

$.ajax({ 
      type: "post", 
      url: baseurl + "/FriendRequest/send", 
      context:this, 
      data: { 
       friend: $(this).data('friend') 
      }, 

      success: function(xhr, status) { 
       $(this).html("Done"); // Will work 

       alert("done"); // <-- Work 
      }, 
      error: function(response, s, e) { 
       alert(response.responseText); 
      }, 
      complete: function() { 
       //. the some from success 
      } 
     }); 
1

Внутри функции обратного вызова, это относится к jqXHR объекта вызова Ajax, а не элемент. поэтому постарайтесь, чтобы присвоить его переменный перед АЯКСОМ запроса, а затем использовать этот variale внутри функции успеха:

//Before ajax request 
var _this = $(this); 

//Inside success function 
_this.html("Done"); 

Надеется, что это помогает.

Смежные вопросы