表单自动切换焦点

有时候会遇到和上面类似的表单字段。我们可以给每个字段限制输入长度,当达到输入长度时自动切换焦点,以增强表单的易用性

<form id="myForm">
    <input type="text" name="tel1" id="txt1" maxlength="3">-
    <input type="text" name="tel2" id="txt2" maxlength="3">-
    <input type="text" name="tel3" id="txt3" maxlength="4">
    <br>
    <input type="submit" value="Submit">
</form>

(function () {
	function tabForward(e) {
		e = e || window.event;
		var target = e.target || e.srcElement;

		if (target.value.length === target.maxLength) {
			var form = target.form;

			for (var i = 0, len = form.elements.length; i < len; i++) {
				if (form.elements[i] === target) {
					if (form.elements[i++]) {
						form.elements[i++].focus();
					}
					break;
				}
			}
		}
	}

	var textbox1 = document.getElementById("txt1");
	var textbox2 = document.getElementById("txt2");
	var textbox3 = document.getElementById("txt3");

	textbox1.addEventListener("keyup", tabForward, false);
	textbox2.addEventListener("keyup", tabForward, false);
	textbox3.addEventListener("keyup", tabForward, false);

})();

代码其实很简单,判断输入字符串长度是否和事件目标的maxLength属性长度相等,若相等,且表单还有下一个字段,则自动切换到下一个焦点。

简单说下两个属性:

target.form  form属性指向当前字段所属表单的指针,它是只读的

form.elements  elements属性是表单中所有表单元素(字段)的集合。这个elements集合是一个有序列表,其中包含着表单中的所有字段,例如<input>、<textarea>、<button>和<fieldset>。每个表单字段在elements集合中的顺序,与他们出现在标记中的顺序相同,可以按照位置和name特性来访问它们。例如:

	var form = document.getElementById("myForm");
	var textbox1 = form.elements[0];
	var textbox2 = form.elements["tel2"];

最后,我们再来看看上面的代码,发现它还存在一些问题,比如这段代码

	var textbox1 = document.getElementById("txt1");
	var textbox2 = document.getElementById("txt2");
	var textbox3 = document.getElementById("txt3");

	textbox1.addEventListener("keyup", tabForward, false);
	textbox2.addEventListener("keyup", tabForward, false);
	textbox3.addEventListener("keyup", tabForward, false);

发现没有,我们给每个字段添加了相同的事件处理程序。如果在复杂的web应用程序中,对每个元素都采用这种方式,那么结果就会有数不清的代码用于添加事件处理程序。此时,可以利用 事件委托来解决这个问题

其他代码不变,将上面六行代码换为下面的两行会得到相同的结果,是不是感觉好多了呢

	var form = document.getElementById("myForm");
	form.addEventListener("keyup", tabForward, false);

那什么又是 事件委托呢,简单说下原理,详细内容这里不解释

事件委托利用了事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。比如,这里的keyup事件,只需给form元素指定一个onkeyup事件处理程序,而不必给每个字段添加事件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值