删除表单Laravel之外的请求


DELETE request outside of form Laravel

我是Laravel的新手,我正在使用这个Jeffrey Way脚本提交一个不带表单的DELETE请求。

我的链接:

<a class="btn btn-danger btn-sm delete" href="files/<?=$file->id?>" data-method="delete">
    <i class="fa fa-check"></i> Yes I&#39;m sure
</a>

目前在视图文件中的脚本如下:

   $(document).on("click", ".delete", function() {
      var laravel = {
        initialize: function() {
          this.methodLinks = $('a[data-method]');
          this.registerEvents();
        },
        registerEvents: function() {
          this.methodLinks.on('click', this.handleMethod);
        },
        handleMethod: function(e) {
          var link = $(this);
          var httpMethod = link.data('method').toUpperCase();
          var form;
          // If the data-method attribute is not PUT or DELETE,
          // then we don't know what to do. Just ignore.
          if ( $.inArray(httpMethod, ['PUT', 'DELETE']) === - 1 ) {
            return;
          }
          // Allow user to optionally provide data-confirm="Are you sure?"
          if ( link.data('confirm') ) {
            if ( ! laravel.verifyConfirm(link) ) {
              return false;
            }
          }
          form = laravel.createForm(link);
          form.submit();
          e.preventDefault();
        },
        verifyConfirm: function(link) {
          return confirm(link.data('confirm'));
        },
        createForm: function(link) {
          var form = 
          $('<form>', {
            'method': 'POST',
            'action': link.attr('href')
          });
          var token = 
          $('<input>', {
            'type': 'hidden',
            'name': 'csrf_token',
              'value': '<?=csrf_token();?>' // hmmmm...
            });
          var hiddenInput =
          $('<input>', {
            'name': '_method',
            'type': 'hidden',
            'value': link.data('method')
          });
          return form.append(token, hiddenInput)
                     .appendTo('body');
        }
      };
      laravel.initialize();
    });

这是从Gist中提取的确切脚本,我所做的唯一更改是添加了触发器$(document).on("click", ".delete", function()

我遇到的问题是,当我点击要删除的链接时,我会被发送到另一个页面(比如/files/6或任何文件id)。它将<a>标签视为常规链接,而不是DELETE请求,正如我所希望的那样。有人知道为什么会发生这种事吗?

锚点的默认操作是导航,您需要在单击处理程序中阻止它。

 $(document).on("click", ".delete", function(e) {
    e.preventDefault();
    ...

我找到了一个解决方案-我有两个问题。

首先,你可能需要在href中添加一个额外的斜杠,对我来说,我不得不更改

href="files/<?=$file->id?>"href="/files/<?=$file->id?>"

其次,我遇到了问题,因为我的链接在Bootstrap popover(在data-content中)内,这使事情更加复杂。我将脚本恢复为Jeffrey Way提供的原始脚本(使用$(function() {而不是$(document).on("click", ".delete", function() {)。然后我在popover之外创建了一个隐藏的链接元素:

<a href="/files/<?=$file->id?>" class="delete-file hidden" data-method="delete"></a>

然后我使用jQuery触发了对该链接的点击(这两个元素都在父<div class="panel-body">:下

$(document).on("click", ".delete", function(){ 
    $(this).closest(".panel-body").find(".delete-file").trigger("click");
});