由ajax发送请求以在数据库中插入数据。提交成功后,我的按钮消息没有改变。在触发成功时按i消息Please wait...
设置新的html值Done
。数据库中的记录已成功创建,但Done
的按钮文本未更改。
我的剧本:
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>
当我点击按钮时,文本被更改为Please wait..
但成功后未更改为Done
并且警报成功执行。
点击后看起来它不是DOM的一部分!另外,我尝试使用on()
得到的结果。
答案 0 :(得分:4)
this
是.... 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");
},
答案 1 :(得分: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
}
});
答案 2 :(得分:1)
在回调中,这是指Ajax调用的jqXHR
对象,而不是元素。所以尝试在ajax请求之前将它分配给变量,然后在成功函数中使用这个变量:
//Before ajax request
var _this = $(this);
//Inside success function
_this.html("Done");
希望这有帮助。