循环表单并使用 jQuery 使用 AJAX 提交

Posted

技术标签:

【中文标题】循环表单并使用 jQuery 使用 AJAX 提交【英文标题】:Looping through forms and submitting with AJAX with jQuery 【发布时间】:2021-10-26 03:37:19 【问题描述】:

我在页面上的表格中有一系列表单,我希望能够使用位于任何表单之外的单个按钮提交。

所以我的 html 看起来像这样:

<button id="save_all">Save all</button>

<form class="form">… <button>Save</button></form>
<form class="form">… <button>Save</button></form>
<form class="form">… <button>Save</button></form>

目前,我有这个,用于提交个人表单:

function submitForms(form) 
    form.submit(function(e) 
        e.preventDefault();
        let form = $(this),
            url = form.attr('action');
        $.ajax(
            type: 'POST',
            url: url,
            data: form.serialize(),
            success: function(data) 
        );
    );


$('.form button').click(function()
    submitForms($(this).parents('form'));
);

但这不起作用:

$('#save_all').click(function()
    $('.form').each(function()
        submitForms($(this));
    );
);

谁能告诉我为什么?

【问题讨论】:

【参考方案1】:

问题是您的submitForms 函数没有提交表单。它只添加了一个 submit 事件监听器。您提交表单的唯一原因是您点击了提交按钮。

试试这样的

// This is your AJAX submitter, it returns a deferred object
const ajaxSubmit = (form) => $.ajax(
  url: form.action,
  method: form.method,
  data: $(form).serialize()
)

// Add individual submit handlers
const forms = $(".form").on("submit", e => 
  e.preventDefault()
  ajaxSubmit(e.target).done(data => 
    // handle response data here if you want
  )
)

// Submit all forms on click
$("#save_all").on("click", () => 
  forms.each((_, form) => 
    ajaxSubmit(form)
  )
)

这是强制性的You might not need jQuery 版本...

const ajaxSubmit = form => 
  const data = new FormData(form)

  const init = 
    method: form.method
  
  
  let url = form.action
  if (form.method.toUpperCase() === "POST") 
    init.body = form.enctype === "multipart/form-data" ? data
      : new URLSearchParams(data)
   else 
    url = url.replace(/\?.+$/, '') + `?$new URLSearchParams(data)`
  

  return fetch(url, init)


const forms = document.querySelectorAll("form.form")
forms.forEach(form => 
  form.addEventListener("submit", e => 
    e.preventDefault()
    ajaxSubmit(e.target)
  )
)

document.querySelector("#save_all").addEventListener("click", async () => 
  await Promise.all(Array.from(forms, ajaxSubmit))
)

【讨论】:

以上是关于循环表单并使用 jQuery 使用 AJAX 提交的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]

[JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]

[JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]

提交ajax表单并使用jquery重定向到另一个页面

jQuery在使用ajax验证后提交表单

jQuery AJAX 将提交的表单替换为表单(好),但不会再次提交