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">

兩個動作都會顯示 alert,而且表單不會傳送至任何地方,因為有 return false

<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、一個輸入欄位和按鈕 確定/取消

  • 使用者應該在文字欄位中輸入一些內容,然後按下 Enter 或確定按鈕,然後使用輸入的值呼叫 callback(value)
  • 否則,如果使用者按下 Esc 或取消,則會呼叫 callback(null)

在兩種情況下,都會結束輸入程序並移除表單。

需求

  • 表單應該在視窗中央。
  • 表單是模式的。換句話說,在使用者關閉表單之前,無法與頁面的其他部分進行互動。
  • 當顯示表單時,焦點應該在使用者的 <input> 內部。
  • 按鍵 Tab/Shift+Tab 應該在表單欄位之間移動焦點,不允許焦點移至其他頁面元素。

使用範例

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

在 iframe 中的範例

附註:原始文件有固定定位的表單 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 問題或發起 pull request,而不是留言。
  • 如果你看不懂文章中的某個部分,請詳細說明。
  • 要插入幾行程式碼,請使用 <code> 標籤,要插入多行程式碼,請用 <pre> 標籤包起來,要插入超過 10 行程式碼,請使用沙盒 (plnkrjsbincodepen…)