表单
表单数据
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 - string - 所需表单的“id”属性。必填。
app.form.storeFormData(formId, data)- 存储具有指定id
属性的表单的表单数据
- formId - string - 所需表单的“id”属性。必填。
- data - object - 要存储的 JSON 数据
app.form.removeFormData(formId)- 删除具有指定id
属性的表单的表单数据
- formId - string - 所需表单的“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
属性中指定的文件/URL请求方法将与表单的
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 发送表单数据的文件/URL 获取实际的 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
});