js 表单脚本

《JavaScript高级程序设计》读书笔记

表单基础

<form>  元素。HTMLFormElement 类型表示。

属性和方法:

  • acceptCharset:服务器可以接收的字符集,等价于 HTML 的 accept-charset 属性。
  • action:请求的 URL,等价于 HTML 的 action 属性。
  • elements:表单中所有控件的 HTMLCollection。
  • enctype:请求的编码类型,等价于 HTML 的 enctype 属性。
  • length:表单中控件的数量。
  • method: HTTP 请求的方法类型,通常是"get"或"post",等价于 HTML 的 method 属性。
  • name:表单的名字,等价于 HTML 的 name 属性。
  • reset():把表单字段重置为各自的默认值。
  • submit():提交表单。
  • target:用于发送请求和接收响应的窗口的名字,等价于 HTML 的 target 属性。

引用的3种方式:

let form = document.getElementById("form1");
let firstForm = document.forms[0];    // 获取页面第一个表单
let myForm = document.forms["form2"];    // 取得名字为 “form2” 的表单

提交表单

使用type 属性为“submit” 的<input> 、<button> 或图片。这种方式提交表单会在向服务器发送请求之间触发submit 事件。

let form = document.getElementById('myForm');

form.addEventListener("submit", (event) => {
    // 阻止表单提交
    event.preventDefault();
    // 验证结果
});

// js方式提交表单
form.submit();

重置表单

type 属性为“reset

表单字段

所有表单元素都是表单element 属性中包含的一个值,按出现次序保存。如果多个表单控件使用了同一个name,使用name获取元素,则会返回NodeList。

let form = document.getElementById("form1");
let field1 = form.elements[0];
let field2 = form.elements["textbox1"];
let fieldCount = form.elements.length;

1. 表单字段的公共属性

  • disabled:布尔值,表示表单字段是否禁用
  • form:指针,指向表单字段所属的表单。只读
  • name:字符串,字段名字
  • readOnly:布尔值,是否只读
  • tabIndex:数值,表示这个字段在按Tab键时的切换顺序
  • type:字符串,字段类型。
  • value:要提交给服务器的字段值。

这里面除了form属性之外,都可以动态修改。

2. 表单字段的公共方法

  • focus() 设置焦点,如果给设置了hidden 的input 元素使用会出错。设置autofocus属性,浏览器会自动为其设置焦点
  • blur() 移出焦点

3. 表单字段的公共事件

  • blur:在字段失去焦点时触发
  • change:在input 和 textarea 元素的value 发生变化且失去焦点时触发,或者在select元素选中向发生变化时触发
  • focus:在字段获得焦点时触发

文本框编程

两种文本框方法:input 和textarea。

input :size 属性指定文本框的宽度,value 属性指定文本框的初始值,maxLength 属性指定文本框允许的最多字符数。

textarea:rows 属性指定文本框的高度,cols 属性指定以字符数计量的文本框宽度。与input 不同的是,初始值要包含在这个标签之间,不能指定最大允许的字符数

选择文本

select 方法 用于全部选中文本框中的文字。target.select()

1. select 事件

当选中文本框中的文本时,会触发。

2. 取得选中文本

分别表示文本选中的起点和终点

  • selectionStart
  • selectionEnd

3. 部分选中文本

element.setSelectionRange(selectionStart, selectionEnd [, selectionDirection])

参数:开始位置,结束位置,选择方向的字符串(forward、backward、none)

输入过滤

1. 屏蔽字符

例如:只允许输入数字

textbox.addEventListener("keypress", event => {
    if(!/\d/.test(String.fromCharCode(event.charCode)) && event.charCode > 9 && !event.ctrlKey) {
        event.preventDefault();
    }
});

2. 处理剪贴板

相关事件:

  • beforecopy:复制操作发生前触发
  • copy:复制操作发生时触发
  • beforecut:剪切操作发生前触发
  • cut:剪切操作发生时触发
  • beforepaste:粘贴操作发生前触发
  • paste:粘贴操作发生时触发

event对象上有clipboardData 对象来获取剪贴板数据,该对象上有3个方法:getData(数据格式text/URL)、setData(text/URL,要放到剪贴板的文本)和clearData()。

let textbox = document.getElementById('top-nav-search-input');
textbox.addEventListener("paste", event=> {
    let text = event.clipboardData.getData("text");
    console.log(text);
});

3. 自动切换

  // <form>
  //   <input type="text" name="tel1" id="tel1" maxlength="3">
  //   <input type="text" name="tel2" id="tel2" maxlength="4">
  //   <input type="text" name="tel3" id="tel3" maxlength="3">
  // </form>
function tabForward(event) {
  let target = event.target;
  if(target.value.length === target.maxLength) {
    let form = target.form;
    for(let i=0,len = form.elements.length;i<len;i++){
      if(form.elements[i] == target){
        if(form.elements[i + 1]){
          form.elements[i+1].focus();
        }
        return;
      }
    }
  }
}
let inputIdx = ['tel1','tel2','tel3'];
for(let id of inputIdx){
  let textbox = document.getElementById(id);
  textbox.addEventListener("keyup", tabForward)
}

HTML5 约束验证API

1. 必填字段 required

<input type="text" name="tel1" id="tel1" maxlength="3" required>

2. 更多输入类型

  • number
  • range
  • datetime
  • datetime-local
  • date
  • month
  • week
  • time
  • url
  • email
<input type="url" />
<input type="email" />

3. 数值范围

<input type="number" min="0" max="100" step="5">

两个方法:stepUp() 和 stepDown(),接受一个加上或减去的数值

4. 输入模式

pattern 属性,用于指定一个正则表达式

<input type="text" pattern="\d+" name="count">

5. 检测有效性

checkValidity() 方法检测表单中任意给定字段是否有效,返回布尔值。可以调用在单个字段元素中或整个表单。

validity 属性会告诉我们字段为什么有效或无效。这个属性是一个对象,包含一系列返回布尔值的属性。

  • customError:如果设置了 setCustomValidity()就返回 true,否则返回 false。
  • patternMismatch:如果字段值不匹配指定的 pattern 属性则返回 true。
  • rangeOverflow:如果字段值大于 max 的值则返回 true。
  • rangeUnderflow:如果字段值小于 min 的值则返回 true。
  • stepMisMatch:如果字段值与 min、 max 和 step 的值不相符则返回 true。
  • tooLong:如果字段值的长度超过了 maxlength 属性指定的值则返回 true。
  • typeMismatch:如果字段值不是"email"或"url"要求的格式则返回 true。
  • valid:如果其他所有属性的值都为 false 则返回 true。与 checkValidity()的条件一致。
  • valueMissing:如果字段是必填的但没有值则返回 true。
if (input.validity && !input.validity.valid){
    if (input.validity.valueMissing){
        console.log("Please specify a value.")
    } else if (input.validity.typeMismatch){
        console.log("Please enter an email address.");
    } else {
        console.log("Value is invalid.");
    }
}

6. 禁用验证

通过指定 novalidate 属性可以禁止对表单进行任何验证:

<form method="post" action="/signup" novalidate>

</form>

如果一个表单中有多个提交按钮,那么可以给特定的提交按钮添加 formnovalidate 属性,指定通过该按钮无须验证即可提交表单

选择框编程

使用select 和option 元素创建。属性和方法:

  • add(newOption, relOption):在relOption 之前向控件中添加新的option
  • multipel:布尔值,表示是否允许多选
  • options:控件中所有option 元素的HTMLCollection
  • remove(index):移除给定位置的选项
  • selectedIndex:选中项基于0的索引值,如果没有选中项则为-1。对于允许多选的,始终为第一个选项索引
  • size:选择框中可见的行数

option 元素属性:

  • index:索引
  • label:选项标签
  • selected:布尔值,是否选中
  • text:选项的文本
  • value:选项的值

选项处理

selectedIndex 属性获得选中选项。如果是多选,只返回第一个索引

添加选项

// dom方法
let newOption = document.createElement("option");
newOption.appendChild(document.createTextNode("Option text"));
newOption.setAttribute("value", "Option text");
selectbox.appendChild(newOption);

// Option 构造函数 、 add() 方法
let newOption2 = new Option("Option text", "option value");
selectbox.add(newOption2, undefined);

移除选项

// 1
selectbox.removeChild(selectbox.options[0]);

// 2
selectbox.remove(0);

移除和重排选项

通过DOM 方法可以直接将某个选项从第一个选项框移动到第二个选项框。使用appendChild(),如果是以后的元素,则该元素会先从其父元素中移除,然后再插入指定位置。

如果要移动到特定位置,可以使用inertBefore()

富文本编辑

在空白HTML中嵌入iframe,设置属性designMode

<iframe name="richedit" style="width:100px;height:100px;"></iframe>

window.addEventListener("load", ()=>{
  frames["richedit"].document.designMode = "on"
})

使用contenteditable

可以给任何元素指定 contenteditable 属性,该元素即可编辑,类似textarea元素。可能的值:true、false、inherit(继承父元素的设置)

富文本选择

getSelection() 方法可以获得富文本编辑器的选区。返回表示当前选中文本的Selection 对象,每个对象都拥有以下属性:

  • anchorNode:选区开始的节点
  • anchorOffset:在anchorNode 中,从开头到选区开始跳过的字符数
  • focusNode:选区结束的节点
  • focusOffset:focusNode中包含在选区内的字符数
  • isCollapsed:布尔值,表示选区起点和终点是否在同一个地方
  • rangeCount:选区中包含的DOM 范围数量

方法:

  • addRange(range):把给定的DOM范围添加到选区
  • collapse(node, offset):将选取折叠到给定节点中给定的文本偏移处
  • collapseToEnd():将选区折叠到终点
  • collapseToStart():将选区折叠刀起点
  • containsNode(node):确定给定节点是否包含在选区中
  • deleteFromDocument():从文档中删除选区文本。
  • extend(node, offset):通过将focusNode和 focusOffset 移动到指定值来扩展选区。
  • getRangeAt(index):返回选区中指定索引处的DOM 范围
  • removeAllRanges():从选区中移除所有DOM 范围
  • removeRange(range):从选区中移除指定的DOM范围
  • selectAllChildren(node):清除选区并选择给定节点的所有子节点
  • toString():返回选区中的文本内容
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞天巨兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值