简体   繁体   English

jQuery Ajax多个调用

[英]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">&times;</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>


Use a hidden field to stop nested click listeners and clear the value at the end of the function. 使用隐藏字段可停止嵌套的Click侦听器,并清除函数末尾的值。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM