在<form>中嵌套<button>会导致意外行为

时间:2019-08-20 15:38:22

标签: php html ajax zurb-foundation submit

我正在为我的网站使用ZURB Foundation 6.4(ZURB模板)。 我想测试一下我新实现的后端,并尝试收集一些输入,并通过jquery AJAX将其发送到我的php后端。

与此同时,我设法做到了,但是遇到了一个非常奇怪的问题。 我使用了以下构建块: https://foundation.zurb.com/building-blocks/blocks/floated-label-wrapper.html

我做了一些修改,但仅涉及id和占位符之类的东西,没有任何功能。 最后,我将此标记用作我生成的其中一个视图的一部分:

<form class="callout text-center">
  <h2>Become A Member</h2>
  <div class="floated-label-wrapper">
    <label for="full-name">Forename</label>
    <input type="text" id="forenameInput" name="forename input" placeholder="forename">
  </div>
  <div class="floated-label-wrapper">
    <label for="email">Surname</label>
    <input type="text" id="surnameInput" name="surname input" placeholder="surname">
  </div>
  <div class="floated-label-wrapper">
    <label for="pass">Email</label>
    <input type="email" id="emailInput" name="email input" placeholder="email">
  </div>
<button class="button expanded" id="submitUserDataButton">Sign up</button>
</form>

最后的按钮曾经是类型为commit的输入,我将其更改为按钮,因为它更适合我的需求。 但是,只要将按钮/输入嵌套在表单元素中,输入和按钮的行为就始终相同:

单击它后,该站点将重新加载,被调用的函数将执行到它击中我的ajax为止。 现在为了完整起见,我将在此处发布AJAX(它被intp包装/由另一个函数调用,但这在这里无关紧要):

function sendUserDataToBackend(userDataInputCollection){
  console.log("sendUserDataToBackend was entered")
  return  $.post("http://localhost:8099/test2.php"

    }).then((response) => {
      console.log(response)
    })
}

它进入了功能并且console.log发生了,然后……什么也没有。 AJAX本身从未执行过。 我真的不知道为什么会这样,我只是想出了如何规避它的方法。 我只是将按钮放在form元素之外,一切正常。

现在,为什么呢? 为什么将按钮嵌套在form元素内会引起此类麻烦,例如导致页面重新加载,甚至阻止AJAX调用发生? 我的意思是,表单是用于接收输入并将其发送到后端的,不是吗?还是以某种方式“变老”而应避免使用它们? 这些元素如何起作用,它们的“副作用”是什么?

编辑: 这是请求的处理程序代码

处理程序的逻辑从文件A导出

export async function executeRegistration(){
  let userDataInputCollection = getUserDataInput()
  userDataInputCollection = JSON.stringify(userDataInputCollection)
  console.log(userDataInputCollection)
  await sendUserDataToBackend(userDataInputCollection)
}

function getUserDataInput(){

  let userDataForename = $('#forenameInput').val()
  let userDataSurname = $('#surnameInput').val()
  let userDataMail = $('#emailInput').val()

  let userDataInputCollection = {
    forename : userDataForename,
    surname : userDataSurname,
    email : userDataMail
  }

  return userDataInputCollection
}

function sendUserDataToBackend(userDataInputCollection){
  console.log("sendUserDataToBackend was entered")
  return  $.post("http://localhost:8099/test2.php", {
      userDataInputCollection : userDataInputCollection
    }).then((response) => {
      console.log(response)
    })
}

并导入到文件B,该文件通过jquery附加在这里:

import * as registrationJS from "./lib/registrationLogic.js"

$('#submitUserDataButton').on('click', function(){
  registrationJS.executeRegistration()
})

1 个答案:

答案 0 :(得分:2)

单击提交按钮将提交表单。 这就是提交按钮的目的!

浏览器将离开该页面(并加载新页面)。在旧页面中运行的JavaScript将被取消(因为JS在该页面中运行,导致该页面退出程序)。

如果要使用Ajax代替常规表单提交,则需要阻止常规表单提交。

请注意,最佳实践也是绑定到表单的Submit事件,而不是按钮的click事件。这样可以更好地捕获不使用按钮触发的表单提交。

替换:

$('#submitUserDataButton').on('click', function(){
  registrationJS.executeRegistration()
})

使用:

$('form').on("submit", function (event) {
    event.preventDefault();
    registrationJS.executeRegistration();
});