程序员的知识教程库

网站首页 > 教程分享 正文

javascript自学记录:表单脚本2(javascript自学记录:表单脚本2怎么解决)

henian88 2024-08-17 16:03:38 教程分享 6 ℃ 0 评论

14.2 文本框脚本

有两种文本框:

input元素,type=”text”

textarea


14.2.1 选择文本

文本对象使用select()方法来选择文本。下面代码会在文本框获得焦点时全选文本。

var textbox = document.forms[0].elements["textbox1"];
EventUtil.addHandler(textbox,"focus",function (event) {
    event = EventUtil.getEvent(event);
    var target = EventUtil.getEvent(event);
    target.select();
});

相关事件:

1、select事件

select()方法对应的是一个select事件,在选择文本框中的文本时会触发select事件。下面代码可以在文本内容被选中时显示该文本的全部内容:

var textbox = document.forms[0].elements["firstText"];
EventUtil.addHandler(textbox,"select",function (event) {
    alert(textbox.value);
});

2、获得选中的文本

如果要取得所选择的文本,可以通过selectionStart和selectionEnd来完成。

var textbox = document.forms[0].elements["firstText"];
EventUtil.addHandler(textbox,"select",function (event) {
    alert(textbox.value.substring(textbox.selectionStart,textbox.selectionEnd));
});

如果要兼容更老版本的话,可以使用下面的代码:

var textbox = document.forms[0].elements["firstText"];
EventUtil.addHandler(textbox,"select",function (event) {
    if (typeof textbox.selectionStart == "number"){
        alert(textbox.value.substring(textbox.selectionStart,textbox.selectionEnd));
    } else if (document.selection){
        alert(document.selection.createRange().text);
    }
});

3、用代码选中文本

var textbox = document.forms[0].elements["firstText"];
textbox.value = "Hello world!";
// 选中所有文本

textbox.setSelectionRange(0,textbox.value.length);
// 选中前3个字符:0,1,2
textbox.setSelectionRange(0,3);
// 选中第4到6的字符:4,5,6
textbox.setSelectionRange(4,7);
// 要看到选择的文本,需要将焦点设置到文本框

textbox.focus();

为了兼容老的浏览器,可以使用以下函数:
function selectText(textbox,startIndex,stopIndex) {
    if (textbox.setSelectionRange){
        textbox.setSelectionRange(startIndex,stopIndex);
    } else if (textbox.createTextRange){
        var range = textbox.createTextRange();
        range.collapse(true);
        range.moveStart("character",startIndex);
        range.moveEnd("character",stopIndex-startIndex);
        range.select();
    }
    textbox.focus();
}

14.2.2 过滤输入

1、屏蔽字符

屏蔽所有字符:

var textbox = document.forms[0].elements["firstText"];
EventUtil.addHandler(textbox,"keypress",function (event) {
    event = EventUtil.getEvent(event);
    EventUtil.preventDefault(event);
});

只允许输入数字:

var textbox = document.forms[0].elements["firstText"];
EventUtil.addHandler(textbox,"keypress",function (event) {
    event = EventUtil.getEvent(event);
    var charCode = EventUtil.getCharCode(event);
    if (!/\d/.test(String.fromCharCode(charCode)) && charCode > 9 && !event.ctrlKey){
        EventUtil.preventDefault(event);
    }
});

其中有新增一个getCharCode方法,并且要理解在js如何使用正则表达式。

2、操作剪贴板

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

下面代码会在将内容粘贴到文本框时检查其是否数字:

EventUtil.addHandler(textbox,"paste",function (event) {

    event = EventUtil.getEvent(event);

    var text = EventUtil.getClipboardText(event);

    if (!/^\d*$/.test(text)){

        EventUtil.preventDefault(event);

    }

});

14.2.3 自动切换焦点

示例代码是美国电话号码,分为3段,长度分别为3,3,4,在每个文本框内容数量达到maxLength时会自动将焦点切换到下一个控件:

<input type="text" name="tel1" id="txtTel1" maxlength="3">
<input type="text" name="tel2" id="txtTel2" maxlength="3">
<input type="text" name="tel3" id="txtTel3" maxlength="4">


(function () {

    function tabForward(event) {

        event = EventUtil.getEvent(event);

        var target = EventUtil.getTarget(event);



        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+1]){

                        form.elements[i+1].focus();

                    }

                    return;

                }

            }

        }

    }

    var textbox1 = document.getElementById("txtTel1");

    var textbox2 = document.getElementById("txtTel2");

    var textbox3 = document.getElementById("txtTel3");



    EventUtil.addHandler(textbox1,"keyup",tabForward);

    EventUtil.addHandler(textbox2,"keyup",tabForward);

    EventUtil.addHandler(textbox3,"keyup",tabForward);

})();

14.2.4 HTML5的约束验证API

HTML5规范带有许多约束验证API,在JS代码被禁用时也可以进行验证。

1、必填字段 required

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

submit时带有required的字段不能为空。

js代码中可以通过访问required属性来得到:

var textbox = document.forms[0].elements["textbox"]

var isUsernameRequired = textbox.required;

使用下面代码也可以判断浏览器否支持required属性:

var isRequiredSupported = ("required" in document.createElement("input"));

2、HTML5中新增的input元素的type属性

email、url

3、数值范围

input的type属性还有如下跟数值有关的属性:

number、range、datetime、datetime-local、date、month、week、time

它们大多都有min与max和step方法。

还有以下调节数据的方法:

  • input.stepUp(); //+1
  • input.stepUp(5); // +5
  • input.stepDown(); // -1
  • input.stepDown(10); // -10

4、输入模式(正则表达式)

HTML元素支持正则表达式,如下面的text中只允许输入数字:

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

在js代码中可能通过pattern属性访问到HTML中的模式:

var textbox = document.forms[0].elements["count"];

var pattern = textbox.pattern;

可以通过以下代码判断浏览器是否支持pattern:

var isPatternSupported = "pattern" in document.createElement("input");

5、在JS代码中检测表单值有效性

可以对元素使用checkValidity()方法:

var textbox = document.forms[0].elements["count"];

var result = textbox.checkValidity();

也可以对form进行检测,所有字段通过则会返回true:

if (document.forms[0].checkValidity()){

    // 表单中字段全部通过验证,继续
} else {

    // 表单未全部通过验证
}

元素的validity属性则能知道为什么字段有效或无效。

  • customError :如果设置了setCustomValidity(),则为true,否则返回false。
  • patternMismatch:如果值与指定的pattern 属性不匹配,返回true。
  • rangeOverflow:如果值比max 值大,返回true。
  • rangeUnderflow:如果值比min 值小,返回true。
  • stepMisMatch:如果min 和max 之间的步长值不合理,返回true。
  • tooLong:如果值的长度超过了maxlength 属性指定的长度,返回true。有的浏览器(如Firefox 4)
  • 会自动约束字符数量,因此这个值可能永远都返回false。
  • typeMismatch:如果值不是"mail"或"url"要求的格式,返回true。
  • valid:如果这里的其他属性都是false,返回true。checkValidity()也要求相同的值。
  • valueMissing:如果标注为required 的字段中没有值,返回true。

6、禁用验证

在input或form中都可以添加novalidate来表示不进行验证。

js中可以通过noValidate属性来得知元否是否是禁用验证,也可以通过此值来进行设置:

document.forms[0].noValidate = true;

如果一个表单中有多个提交按钮,可以一个按钮中指定formnovalidate属性。

在js代码中也可以为按钮设置该属性:

按钮.formNoValidate = true;

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表