2019 年 7 月 3 日

表单:事件和方法提交

当表单提交时,submit 事件触发,通常用于在将表单发送到服务器之前对其进行验证,或中止提交并在 JavaScript 中对其进行处理。

方法 form.submit() 允许从 JavaScript 发起表单发送。我们可以使用它来动态创建并向服务器发送我们自己的表单。

让我们看看它们的更多详细信息。

事件:提交

有两种主要方法可以提交表单

  1. 第一种 - 单击 <input type="submit"><input type="image">
  2. 第二种 - 在输入字段中按 Enter

这两种操作都会导致表单上的 submit 事件。处理程序可以检查数据,如果存在错误,则显示它们并调用 event.preventDefault(),然后表单将不会发送到服务器。

在下面的表单中

  1. 进入文本字段并按 Enter
  2. 单击 <input type="submit">

由于 return false,这两个操作都显示 alert,并且表单不会发送到任何地方

<form onsubmit="alert('submit!');return false">
  First: Enter in the input field <input type="text" value="text"><br>
  Second: Click "submit": <input type="submit" value="Submit">
</form>
submitclick 之间的关系

当在输入字段上使用 Enter 发送表单时,click 事件会在 <input type="submit"> 上触发。

这相当有趣,因为根本没有单击。

以下是演示

<form onsubmit="return false">
 <input type="text" size="30" value="Focus here and press enter">
 <input type="submit" value="Submit" onclick="alert('click')">
</form>

方法:submit

若要手动向服务器提交表单,我们可以调用 form.submit()

然后不会生成 submit 事件。假设如果程序员调用 form.submit(),则脚本已经完成了所有相关处理。

有时会使用它来手动创建和发送表单,如下所示

let form = document.createElement('form');
form.action = 'https://google.com/search';
form.method = 'GET';

form.innerHTML = '<input name="q" value="test">';

// the form must be in the document to submit it
document.body.append(form);

form.submit();

任务

重要性:5

创建一个函数 showPrompt(html, callback),该函数显示一个表单,其中包含消息 html、一个输入字段和按钮 OK/CANCEL

  • 用户应在文本字段中输入内容并按 Enter 或 OK 按钮,然后使用他们输入的值调用 callback(value)
  • 否则,如果用户按 Esc 或 CANCEL,则调用 callback(null)

在这两种情况下,都会结束输入过程并移除表单。

要求

  • 表单应位于窗口的中央。
  • 表单为模态。换句话说,在用户关闭表单之前,无法与页面的其他部分进行交互。
  • 当显示表单时,应将焦点放在用户 <input> 内。
  • Tab/Shift+Tab 应在表单字段之间移动焦点,不允许它离开其他页面元素。

使用示例

showPrompt("Enter something<br>...smart :)", function(value) {
  alert(value);
});

iframe 中的演示

P.S. 源文档具有固定定位的表单的 HTML/CSS,但使其成为模态取决于你。

为任务打开沙箱。

可以使用半透明 <div id="cover-div"> 来实现模态窗口,该窗口覆盖整个窗口,如下所示

#cover-div {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 9000;
  width: 100%;
  height: 100%;
  background-color: gray;
  opacity: 0.3;
}

由于 <div> 覆盖了所有内容,因此它会获得所有点击,而不是其下方的页面。

我们还可以通过设置 body.style.overflowY='hidden' 来防止页面滚动。

表单不应位于 <div> 中,而应位于其旁边,因为我们不希望它具有 opacity

在沙盒中打开解决方案。

教程地图

评论

在评论前阅读此内容…
  • 如果您有改进建议 - 请提交 GitHub 问题或提交拉取请求,而不是评论。
  • 如果您无法理解文章中的某些内容 - 请详细说明。
  • 要插入几行代码,请使用 <code> 标记,对于多行 - 将它们包装在 <pre> 标记中,对于 10 行以上 - 使用沙盒 (plnkrjsbincodepen…)