[英]Jquery ajax multiple calls
I have a jquery code that pop ups a modal before deleting a message from table but even if u click cancel and click on another delete message it still pretains previous ones id and deletes multiple selected messages 我有一个jQuery代码,在从表中删除一条消息之前会弹出一个模式,但是即使您单击“取消”并单击另一条删除消息,它仍然保留先前的ID,并删除多条选定的消息
i added console.log on the ajax success function for id and it showed me the ids of every delete message button clicked after executing it one by one like 我在ajax成功函数上添加了id的console.log,它向我显示了一个像一个一个地执行后单击的每个删除消息按钮的ID
id-2
xhr executed
id 3
xhr executed
id 4.....
non stop 不间断
$(function() {
$(document).on('click', '.delete_message', function() {
var element = $(this);
var del_id = element.attr("id");
var token = $("meta[name='csrf-token']").attr("content");
$('#deletemessage').modal('show');
$('#cnf_del').click(function() {
var currentRequest = null;
currentRequest = jQuery.ajax({
type: 'get',
url: "/messages_table/delete/" + del_id,
data: {
"id": del_id,
"_token": token,
},
beforeSend: function() {
if (currentRequest != null) {
currentRequest.abort();
}
},
success: function() {
$('.id' + del_id).hide();
$('#deletemessage').modal('hide');
console.log(del_id);
}
});
});
});
});
I want it to stop saving the previous one's id and its execution 我希望它停止保存前一个的ID及其执行
modal
<!-- Modal for delete -->
<div class="modal fade" id="deletemessage" tabindex="-1" role="dialog" aria-labelledby="deletemessage" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLongTitle">Delete message</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
Are you sure you want to delete this message ?
</div>
<div class="modal-footer">
<button type="button" id="cnf_del" class="btn btn-danger" >Delete</button>
<button type="button" class="btn btn-primary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<table>
@foreach ($messages as $message)
<tr><td class="id{{$message->id}}" >{{$message->id}}</td>
<td id="show_name{{$message->id}}" class="id{{$message->id}}" >{{$message->name}}</td>
<td id="show_email{{$message->id}}" class="id{{$message->id}}" >{{$message->email}}</td>
<td id="show_email{{$message->id}}" class="id{{$message->id}}" >{{$message->message}}</td>
<td class="id{{$message->id}}" >
<button class="btn btn-danger delete_message id{{$message->id}}" data-target="deletemessage" id="{{$message->id}}">Delete</button>
</td></tr>
@endforeach
</table>
You are setting a new click listener for #cnf_del
each time you click on a .delete_message
element. 每次单击
.delete_message
元素时,都将为#cnf_del
设置新的Click侦听器。
I would personally look to change this. 我个人希望改变这种状况。
One way to do this would be to add a new hidden input to your modal. 一种方法是将新的隐藏输入添加到模态中。
<input type="hidden" id="temp-id-holder" />
Now when you click on the first delete message button, set this field: 现在,当您单击第一个删除消息按钮时,请设置以下字段:
$('#cnf_del').click(function() {
$('#temp-id-holder').val($(this).attr("id"));
});
This is now a single isolated click listener. 现在,这是一个独立的单击侦听器。
You can now create another isolated click listener for the confirm button: 现在,您可以为确认按钮创建另一个隔离的单击侦听器:
$('#cnf_del').click(function() {
var currentRequest = null;
var token = $("meta[name='csrf-token']").attr("content");
var del_id = $('#temp-id-holder').val();
currentRequest = jQuery.ajax({
type: 'get',
url: "/messages_table/delete/" + del_id,
data: {
"id": del_id,
"_token": token,
},
beforeSend: function() {
if (currentRequest != null) {
currentRequest.abort();
}
},
success: function() {
$('.id' + del_id).hide();
$('#deletemessage').modal('hide');
$('#temp-id-holder').val('');
console.log(del_id);
}
});
Note: I have cleared the value of that hidden field at the end of the success function.
注意:在成功函数的末尾,我已经清除了该隐藏字段的值。 You may also want to do the same if the cancel button is clicked:
如果单击“取消”按钮,您可能还想做同样的事情:
change 更改
<button type="button" class="btn btn-primary" data-dismiss="modal">Close</button>
to 至
<button type="button" id="modal-close" class="btn btn-primary" data-dismiss="modal">Close</button>
and add the following to the JS: 并将以下内容添加到JS:
$('#modal-close').click(function(){
$('#temp-id-holder').val('');
});
I would also look to wrap all of this around a 我也希望将所有这些都包装在
$(document).ready(function(){ });
Also, if your _token data is just to satisfy the laravel ajax security, then you could also just add this at the start inside the document ready function: 另外,如果您的_token数据仅是为了满足laravel ajax安全性,那么您也可以在文档准备好函数的开头添加它:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.