注册 登录

清河洛

表单文本框处理和过滤输入

qingheluo2016-12-16清河洛259
一.文本框脚本:在HTML中,有两种方式来表现文本框:一种是单行文本框<input type="text">,一种是多行文本框<textarea>。虽然<input>在字面上有value值,而<textarea>却没有,但都可以通过value获取他们的值。使用表单的value是最推荐使用的,它是HTML DOM中的属性,不建议使用标准DOM的方法。也就是说不要使用getAttribute()获取value值,因为对value属性的修改,不一定会反映在DOM中。除了value值,还有一个属性对应的是defaultValue,可以得到原本的va...

一.文本框脚本:在HTML中,有两种方式来表现文本框:一种是单行文本框<input type="text">,一种是多行文本框<textarea>。虽然<input>在字面上有value值,而<textarea>却没有,但都可以通过value获取他们的值。

使用表单的value是最推荐使用的,它是HTML DOM中的属性,不建议使用标准DOM的方法。也就是说不要使用getAttribute()获取value值,因为对value属性的修改,不一定会反映在DOM中。

除了value值,还有一个属性对应的是defaultValue,可以得到原本的value值,不会因为值的改变而变化。

选择文本:使用select()方法,可以将文本框里的文本选中,并且将焦点设置到文本框中。

选择部分文本:在使用文本框内容的时候,我们有时要直接选定部分文本,这个行为还没有标准。Firefox的解决方案是:setSelectionRange()方法。这个方法接受两个参数:索引和长度。

textField.setSelectionRange(0, textField.value.length); //选择全部
textField.focus(); //焦点移入

除了IE,其他浏览器都支持这种写法(IE9+支持),那么IE想要选择部分文本,可以使用IE的范围操作。

var range = textField.createTextRange(); //创建一个文本范围对象
range.collapse(true); //将指针移到起点
range.moveStart('character', 0); //移动起点,character表示逐字移动
range.moveEnd('character', 1); //移动终点,同上
range.select(); //焦点选定

使用select事件,可以选中文本框文本后触发。

addEvent(textField, 'select', function () {
    alert(this.value); //IE事件需要传递this才可以这么写
});

取得选择的文本:如果我们想要取得选择的那个文本,就必须使用一些手段。目前位置,没有任何规范解决这个问题。Firefox为文本框提供了两个属性:selectionStart和selectionEnd。

addEvent(textField, 'select', function () {
    alert(this.value.substring(this.selectionStart, this.selectionEnd));
});

除了IE,其他浏览器均支持这两个属性(IE9+已支持)。IE不支持,而提供了另一个方案:selection对象,属于document。这个对象保存着用户在整个文档范围内选择的文本信息。我们需要做浏览器兼容。

function getSelectText(text) {
    if (typeof text.selectionStart == 'number') { //非IE
        return text.value.substring(text.selectionStart, text.selectionEnd);
    } else if (document.selection) { //IE
        return document.selection.createRange().text; //获取IE选择的文本
    }
}

有一个最大的问题,就是IE在触发select事件的时候,在选择一个字符后立即触发,而其他浏览器是选择想要的字符释放鼠标键后才触发。所以,如果使用alert()的话,导致跨浏览器的不兼容。我们没有办法让浏览器行为保持统一,但可以通过不去使用alert()来解决。

addEvent(textField, 'select', function () {document.getElementById('box').innerHTML = getSelectText(this);});

二、过滤输入:为了使文本框输入指定的字符,我们必须对输入的字符进行验证。有一种做法是判断字符是否合法,这是提交后操作的。那么我们还可以在提交前限制某些字符,还过滤输入。

我们还希望能够阻止裁剪、复制、粘贴和中文字符输入操作才能真正屏蔽。

如果要阻止裁剪、复制和粘贴,那么我们可以在剪贴板相关的事件上进行处理,JavaScript提供了六组剪贴板相关的事件:

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

由于剪贴板没有标准,导致不同的浏览器有不同的解释。Safari、Chrome和Firefox中,凡是before前缀的事件,都需要在特定条件下触发。而IE则会在操作时之前触发带before前缀的事件。

如果我们想要禁用裁剪、复制、粘贴,那么只要阻止默认行为即可。

最后一个问题影响到可能会影响输入的因素就是:输入法。我们知道,中文输入法,它的原理是在输入法面板上先存储文本,按下回车就写入英文文本,按下空格就写入中文文本。

有一种解决方案是通过CSS来禁止调出输入法:

style="ime-mode:disabled" //CSS直接编写
areaField.style.imeMode = 'disabled'; //或在JS里设置也可以

但Chrome浏览器却无法禁止输入法调出。所以,为了解决谷歌浏览器的问题,最好还要使用正则验证已输入的文本(可以验证在键盘按键(keyup事件)弹起时的输入)。



网址导航