表單
表單資料
Framework7 提供了一些非常有用的方法,這讓處理表單變得盡可能簡單
表單資料應用程式方法
使用以下應用程式方法,我們可以輕鬆地將所有表單欄位值轉換為資料物件,並從資料物件填寫表單
app.form.convertToData(form)- 將表單欄位值轉換為資料物件
- form - HTMLElement 或 string(帶有 CSS 選擇器)的表單,應轉換為資料物件。必填。
app.form.fillFromData(form, data)- 根據資料物件填寫表單
- form - HTMLElement 或 string(帶有 CSS 選擇器)的表單,應轉換為資料物件。必填。
- data - object,包含資料。必填。
請注意,每個輸入都應具有
name
屬性,否則其值不會顯示在資料物件中核取方塊和「多重」選取將顯示為陣列
表單資料事件
表單資料 API 會在表單元素和應用程式執行個體上觸發下列 DOM 事件
DOM 事件
事件 | 目標 | 說明 |
---|---|---|
form:todata | 表單元素<form> | 呼叫 app.form.convertToData 時,事件將在表單上觸發 |
form:fromdata | 表單元素<form> | 呼叫 app.form.fillFromData 時,事件將在表單上觸發 |
應用程式事件
表單資料 API 也會在應用程式執行個體上發出事件
事件 | 目標 | 引數 | 說明 |
---|---|---|---|
formToData | app | (form, data) | 事件將在 app.form.convertToData 呼叫時觸發 |
formFromData | app | (form, data) | 事件將在 app.form.fillFromData 呼叫時觸發 |
表單資料範例
<template>
<div class="page">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="title">Form To Data</div>
</div>
</div>
<div class="page-content">
<form class="list list-strong-ios list-dividers-ios list-outline-ios" id="my-form">
<ul>
<li>
<div class="item-content item-input">
<div class="item-inner">
<div class="item-title item-label">Name</div>
<div class="item-input-wrap">
<input type="text" name="name" placeholder="Your name" />
</div>
</div>
</div>
</li>
<li>
<div class="item-content item-input">
<div class="item-inner">
<div class="item-title item-label">E-mail</div>
<div class="item-input-wrap">
<input type="email" name="email" placeholder="E-mail" />
</div>
</div>
</div>
</li>
<li>
<div class="item-content item-input">
<div class="item-inner">
<div class="item-title item-label">Gender</div>
<div class="item-input-wrap">
<select name="gender">
<option value="male" selected="selected">Male</option>
<option value="female">Female</option>
</select>
</div>
</div>
</div>
</li>
<li>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Toggle</div>
<div class="item-after">
<label class="toggle toggle-init">
<input type="checkbox" name="toggle" value="yes" /><i class="toggle-icon"></i>
</label>
</div>
</div>
</div>
</li>
</ul>
</form>
<div class="block block-strong grid grid-cols-2 grid-gap">
<a class="button button-fill convert-form-to-data" href="#">Get Data</a>
<a class="button button-fill fill-form-from-data" href="#">Fill Form</a>
</div>
</div>
</div>
</template>
<script>
export default (props, { $, $on, $f7 }) => {
$on('pageInit', () => {
$('.convert-form-to-data').on('click', function () {
var formData = $f7.form.convertToData('#my-form');
alert(JSON.stringify(formData));
});
$('.fill-form-from-data').on('click', function () {
var formData = {
'name': 'John',
'email': '[email protected]',
'gender': 'female',
'toggle': ['yes'],
}
$f7.form.fillFromData('#my-form', formData);
});
});
return $render;
}
</script>
表單儲存
透過表單儲存,可以輕鬆地自動儲存和解析表單資料,特別是在 Ajax 載入的頁面上。最有趣的是,當您再次載入此頁面時,Framework7 會解析此資料並自動填寫所有表單欄位!
要為特定表單啟用表單儲存,您只需要
- 將
form-store-data
類別新增至表單 - 新增
id
屬性至表單。如果表單沒有id
屬性,將無法運作 - 確保所有輸入欄位都有
name
屬性,否則將會被忽略
啟用表單儲存功能,方法是加入 form-store-data
類別,然後表單資料將在每次表單輸入變更時儲存至 localStorage
。
若要忽略儲存的輸入欄位,可以將 no-store-data
或 ignore-store-data
類別新增至所需的輸入元素。
否則,可以使用下列應用程式方法來儲存/取得/移除儲存的表單資料
表單儲存應用程式方法
app.form.getFormData(formId)- 取得具有指定 id
屬性的表單的表單資料
- formId - 字串 - 所需表單的「id」屬性。必要。
app.form.storeFormData(formId, data)- 儲存具有指定 id
屬性的表單的表單資料
- formId - 字串 - 所需表單的「id」屬性。必要。
- data - 物件 - 要儲存的 JSON 資料
app.form.removeFormData(formId)- 移除具有指定 id
屬性的表單的表單資料
- formId - 字串 - 所需表單的「id」屬性。必要。
表單儲存事件
表單儲存 API 會在表單元素和應用程式執行個體上觸發下列 DOM 事件
DOM 事件
事件 | 目標 | 說明 |
---|---|---|
form:storedata | 表單元素<form> | 事件會在表單資料儲存後立即觸發 |
應用程式事件
表單儲存 API 也會在應用程式執行個體上發出事件
事件 | 目標 | 引數 | 說明 |
---|---|---|---|
formStoreData | app | (form, data) | 事件會在表單資料儲存後立即觸發 |
表單儲存範例
<div class="page">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="title">Form Storage</div>
</div>
</div>
<div class="page-content">
<div class="block">Just fill up the form below and then go to any other page, or try to close this site, and
when you will back here form fields will keep your data.</div>
<form class="list list-strong-ios list-dividers-ios list-outline-ios form-store-data" id="my-form">
<ul>
<li>
<div class="item-content item-input">
<div class="item-inner">
<div class="item-title item-label">Name</div>
<div class="item-input-wrap">
<input type="text" name="name" placeholder="Your name" />
</div>
</div>
</div>
</li>
<li>
<div class="item-content item-input">
<div class="item-inner">
<div class="item-title item-label">E-mail</div>
<div class="item-input-wrap">
<input type="email" name="email" placeholder="E-mail" />
</div>
</div>
</div>
</li>
<li>
<div class="item-content item-input">
<div class="item-inner">
<div class="item-title item-label">Ignore form storage</div>
<div class="item-input-wrap">
<input class="no-store-data" type="text" name="text" placeholder="This value won't be stored" />
</div>
</div>
</div>
</li>
<li>
<div class="item-content item-input">
<div class="item-inner">
<div class="item-title item-label">Gender</div>
<div class="item-input-wrap">
<select name="gender">
<option value="male" selected="selected">Male</option>
<option value="female">Female</option>
</select>
</div>
</div>
</div>
</li>
<li>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Switch</div>
<div class="item-after">
<label class="toggle">
<input type="checkbox" name="switch" value="yes" /><i class="toggle-icon"></i>
</label>
</div>
</div>
</div>
</li>
</ul>
</form>
</div>
</div>
Ajax 表單提交
Framework7 允許使用 Ajax 自動傳送表單資料。
有兩種方法可以做到
- 使用者提交表單時(當使用者按一下「提交」按鈕時)或程式化觸發表單上的「提交」事件時
- 使用者變更任何表單欄位時或程式化觸發表單(或表單欄位)上的「變更」事件時
在提交時傳送表單資料
若要啟用 Ajax 表單並在提交時自動傳送資料,我們只需要將 form-ajax-submit
類別新增至表單
<form action="send-here.html" method="GET" class="form-ajax-submit">
...
</form>
當使用者提交此表單時,它會自動使用 Ajax 傳送,並遵循下列規則
表單資料會傳送至表單
action
屬性中指定的文件/網址要求方法會與表單
method
屬性中指定的方法相同內容類型會與表單
enctype
屬性中指定的方法相同。預設(如果未指定)為application/x-www-form-urlencoded
在輸入變更時傳送表單資料
我們大多數時候不會在應用程式中使用「提交」按鈕,因此在這種情況下,我們需要在使用者變更任何表單欄位時提交表單資料。在這種情況下,我們需要使用 form-ajax-submit-onchange
類別
<form action="send-here.html" method="GET" class="form-ajax-submit-onchange">
...
</form>
當使用者變更任何表單欄位時,表單資料會自動使用 Ajax 傳送,並遵循與前述情況相同的規則。
Ajax 表單提交事件
有時我們需要從我們使用 Ajax 傳送表單資料的檔案/網址取得實際的 XHR 回應。我們可以使用特殊事件來執行此動作
Dom 事件
事件 | 目標 | 說明 |
---|---|---|
formajax:success | 表單元素<form class="form-ajax-submit"> | 在 Ajax 要求成功後觸發事件 |
formajax:complete | 表單元素<form class="form-ajax-submit"> | 在 Ajax 要求完成後觸發事件 |
formajax:beforesend | 表單元素<form class="form-ajax-submit"> | 在 Ajax 要求開始前觸發事件 |
formajax:error | 表單元素<form class="form-ajax-submit"> | 在 Ajax 要求錯誤時觸發事件 |
var app = new Framework7();
var $$ = Dom7;
$$('form.form-ajax-submit').on('formajax:success', function (e) {
var xhr = e.detail.xhr; // actual XHR object
var data = e.detail.data; // Ajax response from action file
// do something with response data
});
應用程式事件
事件 | 目標 | 引數 | 說明 |
---|---|---|---|
formAjaxSuccess | app | (formEl, data, xhr) | 在 Ajax 要求成功後觸發事件 |
formAjaxComplete | app | (formEl, data, xhr) | 在 Ajax 要求完成後觸發事件 |
formAjaxBeforeSend | app | (formEl, data, xhr) | 在 Ajax 要求開始前觸發事件 |
formAjaxError | app | (formEl, data, xhr) | 在 Ajax 要求錯誤時觸發事件 |
var app = new Framework7();
app.on('formAjaxSuccess', function (formEl, data, xhr) {
// do something with response data
});