表单
新增表单控件
- 表单控件
控件名称 含义 type:datetime 显示完整日期 type:datetime-local 显示完整日期,不含时区 type:time 显示时间,不含时区 type:date 显示日期 type:week 显示周 type:month 显示月 type:search 搜索类型,有清空文本的按钮 type:range 特定范围内的数值选择器,属性:min、max、step type:number 只能包含数字的输入框 type:color 颜色选择器 type:email email 地址类型,当格式不符合 email 格式时,提交是不会成功的,会出现提示 “只有当格式相符时,提交才会通过”,
在移动端获焦的时候会切换到英文键盘type:tel 电话类型,在移动端获焦的时候会切换到数字键盘 type:url url 类型,当格式不符合 url 格式时,提交是不会成功的,会出现提示 “只有当格式相符时,提交才会通过” - 示例代码
<form> <p> <span>datetime-local</span> <input type="datetime-local" /> </p> <p> <span>date</span> <input type="date" /> </p> <p> <span>time</span> <input type="time" /> </p> <p> <span>week</span> <input type="week" /> </p> <p> <span>number</span> <input type="number" /><!-- chrome支持,Safari,IB不支持 --> </p> <p> <span>email</span> <input type="email" /> </p> <p> <span>color</span> <input type="color" /> </p> <p> <span>range</span> <input type="range" min="1" max="100" name="range" /><!-- chrome, Safaris --> </p> <p> <span>search</span> <input type="search" name="search" /><!-- chrome支持,Safari支持一点,IE 不支持 --> </p> <p> <span>url</span> <input type="url" /> </p> <p> <span>submit</span> <input type="submit" /> </p> </form> - 效果展示
新增表单属性
-
表单属性
表单属性名称 含义 placeholder 输入框提示信息,适用于 type 为 text、search、url、tel、email、password 类型的 input autofocus 指定表单获取输入焦点 required 此项必填,不能为空 pattern 正则验证 pattern=“\d{1,5}” form 中 action 在 submit 里定义提交地址 list 和 datalist 为输入框构造一个选择列表,list 值为 datalist 标签的 id -
示例代码
<form> <p> <span>placeholder</span> <input type="url" placeholder="请输入 url" /> </p> <p> <span>autofocus</span> <input type="url" autofocus /> </p> <p> <span>pattern</span> <input type="text" pattern="\d{1,5}" /> </p> <p> <span>required</span> <input type="url" required /> </p> <p> <span>list、datalist</span> <input name="email" type="email" list="emaillist" /> <datalist id="emaillist"> <option value="test1@test.com">test1@test.com</option> <option value="test2@test.com">test2@test.com</option> </datalist> </p> <p> <span>submit</span> <input type="submit" /> </p> </form> -
效果展示
表单验证反馈
-
表单验证
表单验证 含义 valueMissing 输入值为空时返回 true typeMismatch 控件值与预期类型不匹配返回 true patternMismatch 输入值不满足 pattern 正则返回 true tooLong 超过 maxLength 最大限制返回 true rangeUnderflow 验证的 range 最小值返回 true rangeOverflow 验证的 range 最大值返回 true stepMismatch 验证 range 的当前值是否符合 min、max 及 step 的规则返回 true customError 不符合自定义验证返回 true -
示例代码
<body> <form> <p> <span>email</span> <input type="email" value="sb" /> </p> <p> <span>submit</span> <input type="submit" value="提交" /> </p> </form> <section> <p>展示 validity 对象 <strong>ValidityState</strong></p> <section id="content"></section> </section> <script type="text/javascript"> window.onload = function() { var inputEl = document.querySelector("input"); var content = document.querySelector("#content"); inputEl.addEventListener("invalid", function() { // this.validity 不可枚举,改用此方法 const validityState = { valueMissing: this.validity.valueMissing, typeMismatch: this.validity.typeMismatch, patternMismatch: this.validity.patternMismatch, tooLong: this.validity.tooLong, tooShort: this.validity.tooShort, rangeUnderflow: this.validity.rangeUnderflow, rangeOverflow: this.validity.rangeOverflow, stepMismatch: this.validity.stepMismatch, customError: this.validity.customError, valid: this.validity.valid }; content.innerHTML = Object.entries(validityState).map(([k, v]) => `<p><span>${k}:</span><span>${v}</span></p>`).flat(Infinity).join(''); if (inputEl.value === 'sb') inputEl.setCustomValidity('请不要输入敏感词!'); else inputEl.setCustomValidity(''); }) } </script> </body> -
效果展示
关闭验证
在 form 标签上加 novalidate 属性,可以禁用 h5 默认的表单验证效果
拖拽
元素拖动
HTML5 已经完全支持鼠标拖动元素,其中图片和链接默认就支持拖拽,而其他的元素需要设置属性 draggable=“true” 就可支持拖拽;其中在拖拽的过程中会默认触发一系列事件;
draggable 全局拖拽属性,规定元素是否可拖动;
- true:规定元素的可拖动的;
- false:规定元素不可拖动;
- auto:使用浏览器的默认行为;
Dom 事件
| 事件 | 应用元素 | 描述 |
|---|---|---|
| ondragstart | 当前被拖拽元素 | 用户开始拖动元素时触发 |
| ondrag | 当前被拖拽元素 | 元素正在拖动时触发(整个过程持续触发) |
| ondragend | 当前被拖拽元素 | 用户完成元素拖动后触发 |
| ondragleave | 当前被拖拽元素 | 当鼠标离开拖拽元素时调用 |
| ondragenter | 目标元素 | 当鼠标拖拽元素进入时调用 |
| ondragover | 目标元素 | 当停留在目标元素上时调用(持续触发) |
| ondrop | 目标元素 | 当在目标元素上松开鼠标时调用 |
| ondragleave | 目标元素 | 当鼠标离开目标元素时调用 |
目标元素 ondrop 不生效
问题:ondrop 事件始终不触发,原因是 ondragover 事件是 被拖拽元素 在 目标元素上 拖拽过程中由目标元素触发,ondrop 事件是 被拖拽元素 在 目标元素 上面 drop 的时候由目标元素触发;
解决:取消掉 ondragover 它的默认事件 e.preventDefault() 才可以正确触发;
案例一 拖拽到其他容器
-
示例代码
<body> <div class="continer"> <div id="box1" class="box"> <ul style="padding: 0;"> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ul> </div> <div id="box2" class="box"></div> </div> </body>let dragDom; let box1 = document.getElementById('box1'); let box2 = document.getElementById('box2'); let liList = document.getElementsByTagName('li'); Array.from(liList).forEach((el, inx) => { el.setAttribute('draggable', true); el.ondragstart = function (e) { dragDom = e.target; } }); box1.ondragover = function (e) { e.preventDefault(); } box1.ondrop = function (e) { box1.appendChild(dragDom); dragDom = null; } box2.ondragover = function (e) { e.preventDefault(); } box2.ondrop = function (e) { box2.appendChild(dragDom); dragDom = null; }.continer { display: flex; } .box { width: 300px; border: 1px solid #eee; padding-bottom: 10px; padding: 10px; margin: 10px; box-sizing: border-box; } .box li { position: relative; width: 100%; height: 30px; background: aquamarine; margin: 10px auto 0; list-style: none; text-align: center; line-height: 30px; } -
效果展示
案例二 图片拖拽上传
-
示例代码
<div id="app"> <div class="upload" draggable="true"> <div>将图片拖到此处进行上传</div> </div> <div class="images"></div> </div>const upload = document.querySelector('.upload'); const imageContainer = document.querySelector('.images'); upload.addEventListener('dragover', ondragover); upload.addEventListener('drop', ondrop); function ondragover(event) { event.preventDefault(); } function ondrop(event) { event.preventDefault(); const { files } = event.dataTransfer; Array.from(files).forEach(blob => { const url = window.URL.createObjectURL(new Blob([blob])); const img = document.createElement('img'); img.src = url; imageContainer.appendChild(img); }) }* { padding: 0; margin: 0; box-sizing: border-box; } #app { width: 100vw; height: 100vh; padding: 50px 0 0 50px; box-sizing: border-box; } .upload { width: 360px; height: 180px; border: 1px dashed #c0c4cc; border-radius: 5px; display: flex; justify-content: center; align-items: center; } .upload>div { color: #606266; font-size: 14px; } .images { width: 100%; margin-top: 10px; } .images img { width: auto; height: auto; margin-right: 20px; } -
效果展示
HTML5 简介
上一篇