在HTML中,文本框主要有两种表现方式:1.单行文本框<input type="text">;2.多行文本框<textarea>。虽然<input>在字面上有value值,而<textarea>却没有,但都可以通过value获取它们的值。
使用表单的value获取值是推荐的。它是HTML DOM中的属性,不建议使用标准DOM的方法,即不要使用getAttribute()获取value值。原因就是,对value属性的修改,不一定会反映在DOM中。
除了value值,还有一个属性对应的是defaultValue,可以得到原本的value值。不会因为值的改变而变化。
选择文本:
使用select()方法,可以将文本框里的文本选中,并且焦点设置到文本框中。
选中部分文本:
在使用文本框内容的时候,我们有的时候要直接选定部分文本,这个行为还没有标准。FF的解决方案是:setSelectRange()方法。该方法接受两个参数:索引和长度。
上面的写法,除了IE,其他浏览器都支持这种写法。那IE是如何做的呢?IE可以使用IE的范围操作。
W3C也有自己的范围,这里就需要做兼容:
使用select事件,可以选中文本框文本后触发:
取得选中的文本:
由于没有任何规范解决这个问题,所以需要自己使用一些手段。FF为文本框提供了两个属性:selectionStart和selectionEnd。
除了IE,其他浏览器都支持这两个属性(IE9已支持)。又是IE。。。老版本的IE老是不跟大家一起玩耍。IE提供了另一个解决方案:selection对象。属于document。这个对象保存着用户在整个文档范围内选择的文本信息,这里又需要做兼容:
注意,这里有一个大问题,就是IE在触发select事件的时候,在选择一个字符后立即触发,而其他浏览器是选择想要的字符释放鼠标键后才触发。所以,使用alert()的话,导致跨浏览器不兼容,暂无办法让所有浏览器都兼容,但可以通过不去使用alert()来解决。
过滤输入:
有的时候需要过滤输入的字符,使文本框只能输入指定的字符。有一种做法就是判断字符是否合法,这是提交后操作的。还可以在提交前限制某些字符,过滤输入。
上面的方法,条件判断只有数字才可以输入,导致常规按钮比如光标键、退格键、删除键等无法使用。部分浏览器,比如FF需要解放这些键,而非字符触发的编码均为0;在Safari3之前的浏览器,也会被阻止,而它对应的字符编码全部为8,所以最后就加上charCode > 8的判断即可。
以上这种过滤还是比较脆弱的,我们还希望能够阻止裁剪、复制、粘贴和中文字符输入操作才能真正屏蔽掉这些。
要阻止裁剪、复制和粘贴,那么我们可以使用剪切板相关事件进行处理,JS提供了6组剪切板相关的事件:
如果想要禁用裁剪、复制、粘贴,只需要阻止默认行为即可。
当我们裁剪和复制的时候,我们可以访问剪切板里的内容,但FF、Opera浏览器不支持访问剪切板。并且,不同的浏览器也有自己不同的理解。
最后一个可能会影响到输入的因素是:输入法。我们知道,中文输入法,它的原理是在输入法面板上先存储文本,按下回车就写入英文文本,按下空格就写入中文文本。
有一种解决方案是通过CSS来禁用调出输入法:
测试发现,Chrome浏览器却无法禁止输入法的调出。所以,为了解决谷歌浏览器的问题,最好还要使用正则验证已输入的文本。
自动切换焦点:
为了增加表单字段的易用性,很多字段在满足一定条件时(比如长度),就会自动切换到下一字段上继续填写。