数据
基于数据驱动的表单交互vs基于元素行为的表单交互
基于数据驱动的表单交互更容易上手,也使得这种处理方式目前成为主流。但是,基于行为驱动的表单交互对用户更加友好,尤其是在机器识别和无障碍访问方面非常出色
我们需要去了解表单体系的各种行为,但并不意味着我们要舍弃数据驱动的开发,而是要想办法将表单行为和数据驱动结合,让当下的技术更加成熟与强大。
用户体验、语义
提交
按回车键触发表单提交的内置行为需要有一个前置条件: 表单元素内(多个input元素时)需要有提交按钮,注意,是提交按钮。
在现代浏览器下,未设置type属性的<button>元素会被认为是提交按钮
如果要从诸多元素中找一个和<a>元素的行为最相似的常见HTML元素,那一定是<form>元素了,
因为两者都能触发页面的跳转,也都支持使用target属性设置是否打开新窗口,甚至都支持使用rel属性设置与链接相关的安全策略。
提交事件
目前Web开发中的POST请求一定都是走fetch或者XMLHttpRequest这种无刷新的开发方式
只要是涉及输入类型的数据交互的,不要犹豫,一定使用<form>元素和submit事件。
在实际开发中,涉及表单的往往是POST请求,此时可以通过给<form>元素绑定submit事件并阻止默认的行为来模拟Ajax请求功能
new FormData(form, submitter), An HTML <form> element
multipart/form-data 可以同时处理文本数据和文件数据,使得在一个请求中可以上传多个文件以及其他表单数据。
Content-Type
- “multipart/form-data”: 适用于需要上传文件的场景,如文件上传、图片上传、文档上传等。 也可以同时传输文本数据和文件数据,方便用户在上传文件的同时提供相关的描述信息。
- “application/x-www-form-urlencoded”: 适用于简单的表单提交,如登录、注册、搜索等场景。 数据量较小,不需要上传文件的情况下使用较为方便。
- “application/json”: 适用于前后端分离的应用,以及需要传输复杂结构化数据的场景。 在现代的 RESTful API 中广泛使用,方便与不同的客户端(如移动应用、桌面应用等)进行数据交互。
URLSearchParams使用
new URLSearchParams(new FormData(form))
// Pass in a string literal
const params2 = new URLSearchParams("foo=1&bar=2");
const params2a = new URLSearchParams("?foo=1&bar=2");
// Pass in a sequence of pairs
const params3 = new URLSearchParams([
["foo", "1"],
["bar", "2"],
]);
// Pass in a record
const params4 = new URLSearchParams({ foo: "1", bar: "2" });
表单提交原生api: form.submit() vs form.requestSubmit() vs form.dispatchEvent(new Event('submit'))
submitter属性
formdata事件, 可实现在表单提交之前插入自定义数据
reset事件 reset重置虽然改变了输入框的值,但是并不能触发输入框的change事件。
让reset事件和change事件相关联。实现的原理: 在reset事件被触发的一瞬间,输入框的值还是旧值,因此,只需要在下一个渲染周期判断输入框的值是否发生了变化,来决定是否触发输入框元素的change事件。
<form>元素并没有disabled属性禁用整个表单,需要借助于<fieldset>元素
button按钮
要使用具有点击行为的元素,哪怕是只有小图标效果的按钮,也建议使用<button>元素,因为它支持无障碍访问,同时行为与样式都控制方便
- popovertarget属性
- form属性
- formaction属性
- formmethod属性
- formnovalidate属性
- formtarget属性
其他
showPicker()方法, 用于显示日期选择器、颜色选择器、select元素等
<textarea>元素无法根据内容的多少进行高度自适应, 一种css解决方案:
/* <p class="read-write-plaintext-only" data-placeholder="请输入"></p> */
.read-write-plaintext-only {
width: 200px;
min-height: 20px;
font-size: 14px;
border: 1px solid #999;
padding: 5px; /* 不加看不到光标 */
word-break: break-all; /* 设置断行行为 */
-webkit-user-modify: read-write-plaintext-only;
}
/* 模拟placeholder */
.read-write-plaintext-only::before {
display: none;
content: attr(data-placeholder);
color: #ccc;
}
.read-write-plaintext-only:empty::before {
display: block;
}
技术的流行往往取决于一些不起眼的点,而表单控件元素中的单选按钮、复选框,就因为增强的样式自定义能力,已经成为所有控件元素中交互能力最强的存在。
[type=radio] {
-webkit-appearance: none;
appearance: none;
all: initial;
}
inset 为简写属性,对应于 top、right、bottom 和 left 属性
webkitdirectory file文件夹上传
showOpenFilePicker 文件选择器API
<datalist>元素是给<input>元素提供便捷输入选项的,从功能上而言,非常实用,可以大大地增强用户体验
<input list="aaa">
<datalist id="aaa"></datalist>
元素有一个巨大的缺陷导致其在业界并不怎么为人所知,那就是自动填充的列表样式是无法自定义的,只能跟着系统样式走, 而正式的对外产品,尤其是面向客户的产品,显然是无法容忍这样粗糙的样式效果的。
参考
- HTML并不简单