脚本专家 发表于 2026-6-9 11:00:01

IE浏览器HTC验证组件:正则表达式实现表单输入实时检测与失焦校验

在早期IE浏览器环境下,利用HTC(HTML Components)技术可以将JavaScript行为封装为独立的.htc文件,从而在多个页面中复用表单验证逻辑。本文基于海洋工作室开发的validate1.0组件,详细讲解如何通过HTC实现输入框的实时键盘检测、粘贴检测以及失焦验证,并支持数字、字母、邮箱、URL等多种正则校验模式。

一、HTC文件概述
HTC文件本质是一个XML文件,通过behavior属性附加到HTML元素上。在validate.htc中,定义了三个事件绑定:
- onkeypress:键盘按下时调用doEvent(),用于实时拦截非法输入。
- onpaste:粘贴时调用doEvent(),防止非法粘贴内容。
- onblur:失去焦点时调用doEvent(),用于最终完整校验。

二、预定义的校验模式
组件在regArray数组中预置了多种常用正则表达式,每个模式由四个元素组成:模式名称(reg属性值)、完整校验正则(失焦时使用)、输入过程中实时校验正则(键盘/粘贴时使用)、错误提示信息。

常见模式包括:
- int+0:非负整数
- int+:正整数
- int-0:非正整数
- int-:负整数
- int:整数
- double+0:非负浮点数
- double+:正浮点数
- double-0:非正浮点数
- double-:负浮点数
- double:浮点数
- char:纯英文字母
- upperchar:大写英文字母(支持自动转大写)
- lowerchar:小写英文字母(支持自动转小写)
- digitchar:数字和英文字母
- digitchar_:数字、字母、下划线
- email:邮箱格式
- url:URL地址

三、输入框自定义属性说明
在HTML中使用时,可为input元素设置以下属性来配置验证行为:
- reg:指定预定义的验证模式名称(如int+0),或直接写自定义正则表达式(如^aaa$)。
- check:如果设置了此属性(值无要求),则键盘按下和粘贴时也会触发实时检测;否则仅在失焦时检测。
- upper:设置后,输入的英文字母自动转换为大写。
- lower:设置后,输入的英文字母自动转换为小写。
- msg:自定义出错提示信息,若未设置则使用模式自带的提示。
- regcheck:当reg使用了自定义正则表达式时,可通过该属性指定输入过程中实时校验的宽松正则(允许用户输入过程中部分匹配,防止打断输入)。

四、完整HTC文件代码(validate.htc)

//键盘事件
<PUBLIC:ATTACH EVENT="onkeypress" ONEVENT="doEvent()" />
//粘贴事件
<PUBLIC:ATTACH EVENT="onpaste"ONEVENT="doEvent()" />
//失去焦点事件
<PUBLIC:ATTACH EVENT="onblur" ONEVENT="doEvent()" />
<SCRIPT LANGUAGE="JScript">
//预定义的检查模式
var regArray = new Array(
    new Array("int+0","^\\d+$","","需要输入一个非负整数,请重新检查"),
    new Array("int+","^**$","^\\d+$","需要输入一个正整数,请重新检查"),
    new Array("int-0","^((-\\d+)|(0+))$","^(-|(-\\d+)|(0+))$","需要输入一个非正整数,请重新检查"),
    new Array("int-","^-**$","^(-|(-\\d+)|(0+))$","需要输入一个负整数,请重新检查"),
    new Array("int","^-?\\d+$","^-|(-?\\d+)$","需要输入一个整数,请重新检查"),
    new Array("double+0","^\\d+(\\.\\d+)?$","^((\\d+\\.)|(\\d+(\\.\\d+)?))$","需要输入一个非负浮点数,请重新检查"),
    new Array("double+","^((+\\.**)|(**\\.+)|(**))$","^((\\d+\\.)|(\\d+(\\.\\d+)?))$","需要输入一个正浮点数,请重新检查"),
    new Array("double-0","^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$","^(-|(-\\d+\\.)|(0+\\.)|(-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$","需要输入一个非正浮点数,请重新检查"),
    new Array("double-","^(-((+\\.**)|(**\\.+)|(**)))$","^(-|(-\\d+\\.?)|(-\\d+\\.\\d+))$","需要输入一个负浮点数,请重新检查"),
    new Array("double","^(-?\\d+)(\\.\\d+)?$","^(-|((-?\\d+)(\\.\\d+)?)|(-?\\d+)\\.)$","需要输入一个浮点数,请重新检查"),
    new Array("char","^+$","","您只能输入英文字母,请重新检查"),
    new Array("upperchar","^+$","","您只能输入英文大写字母,请重新检查"),
    new Array("lowerchar","^+$","","您只能输入英文小写字母,请重新检查"),
    new Array("digitchar","^+$","","您只能输入数字和英文字母,请重新检查"),
    new Array("digitchar_","^\\w+$","","您只能输入数字、英文字母和下划线,请重新检查"),
    new Array("email","^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$","^(([\\w-]+(\\.[\\w-]+)*@?)|([\\w-]+(\\.[\\w-]+)*@[\\w-]+)|([\\w-]+(\\.[\\w-]+)*@([\\w-]+\\.)+)|([\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+))$","需要输入正确的email地址,请重新检查"),
    new Array("url","^+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$","^(+:?)|(+:/{1,2})|(+://(\\w+(-\\w+)*))|(+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?)$","需要输入正确的url地址,请重新检查")
);
//受控元素默认的事件处理程序
function doEvent() {
    var type = window.event.type;
    var value = window.event.srcElement.value;
    if (type == "keypress") {
      var keyCode = window.event.keyCode;
      if (typeof(window.event.srcElement.upper) != "undefined") {
            if (keyCode >= 97 && keyCode <= 122)
                keyCode = window.event.keyCode = keyCode - 32;
      }
      else if (typeof(window.event.srcElement.lower) != "undefined") {
            if (keyCode >= 65 && keyCode <= 90)
                keyCode = window.event.keyCode = keyCode + 32;
      }
      value += String.fromCharCode(keyCode);
    }
    else if (type == "paste") {
      value += window.clipboardData.getData("Text");
    }
    if (value == "") return;
    if (typeof(window.event.srcElement.reg) == "undefined") return;
    if ((type == "keypress" || type == "paste") && typeof(window.event.srcElement.check) == "undefined") return;
    var msg = "";
    var reg = window.event.srcElement.reg;
    var regExp = null;
    for (var i=0;i<regArray.length;i++) {
      if (regArray == reg) {
            if ((type == "keypress" || type == "paste") && regArray != "")
                regExp = new RegExp(regArray);
            else
                regExp = new RegExp(regArray);
            msg = regArray;
            break;
      }
    }
    if (regExp == null) {
      if ((type == "keypress" || type == "paste") && typeof(window.event.srcElement.regcheck) != "undefined")
            regExp = new RegExp(window.event.srcElement.regcheck);
      else
            regExp = new RegExp(reg);
      msg = "输入错误,请重新检查";
    }
    if (regExp.test(value)) return;
    if (type == "blur") {
      if (typeof(window.event.srcElement.msg) != "undefined")
            msg = window.event.srcElement.msg;
      alert(msg);
      window.event.srcElement.focus();
      window.event.srcElement.select();
    }
    else {
      window.event.returnValue = false;
    }
}
</SCRIPT>


五、HTML页面使用示例
将上述代码保存为validate.htc,然后通过CSS将behavior附加到input元素上。以下为一个完整的演示页面:

<html>
<head>
<style type="text/css">
TABLE { width:100%; }
INPUT { behavior:url("validate.htc"); }
</style>
</head>
<body style="margin:0">
<table>
    <tr><td><a href="http://www.oceanstudio.net"><img border="0" src="logo.jpg"></a></td></tr>
</table>
<br>
<table style="margin-left:20px">
    <tr>
      <td>验证规则</td>
      <td>实时检测</td>
      <td>失去焦点时检测</td>
    </tr>
    <tr>
      <td>非负整数</td>
      <td><input type="text" value="" reg="int+0" check></td>
      <td><input type="text" value="" reg="int+0"></td>
    </tr>
    <tr>
      <td>正整数</td>
      <td><input type="text" value="" reg="int+" check></td>
      <td><input type="text" value="" reg="int+"></td>
    </tr>
    <tr>
      <td>非正整数</td>
      <td><input type="text" value="" reg="int-0" check></td>
      <td><input type="text" value="" reg="int-0"></td>
    </tr>
    <tr>
      <td>负整数</td>
      <td><input type="text" value="" reg="int-" check></td>
      <td><input type="text" value="" reg="int-"></td>
    </tr>
    <tr>
      <td>整数</td>
      <td><input type="text" value="" reg="int" check></td>
      <td><input type="text" value="" reg="int"></td>
    </tr>
    <tr>
      <td>非负浮点数</td>
      <td><input type="text" value="" reg="double+0" check></td>
      <td><input type="text" value="" reg="double+0"></td>
    </tr>
    <tr>
      <td>正浮点数</td>
      <td><input type="text" value="" reg="double+" check></td>
      <td><input type="text" value="" reg="double+"></td>
    </tr>
    <tr>
      <td>非正浮点数</td>
      <td><input type="text" value="" reg="double-0" check></td>
      <td><input type="text" value="" reg="double-0"></td>
    </tr>
    <tr>
      <td>负浮点数</td>
      <td><input type="text" value="" reg="double-" check></td>
      <td><input type="text" value="" reg="double-"></td>
    </tr>
    <tr>
      <td>浮点数</td>
      <td><input type="text" value="" reg="double" check></td>
      <td><input type="text" value="" reg="double"></td>
    </tr>
    <tr>
      <td>英文字母</td>
      <td><input type="text" value="" reg="char" check></td>
      <td><input type="text" value="" reg="char"></td>
    </tr>
    <tr>
      <td>大写字母(自动转换)</td>
      <td><input type="text" value="" reg="upperchar" check upper></td>
      <td><input type="text" value="" reg="upperchar" upper></td>
    </tr>
    <tr>
      <td>小写字母(自动转换)</td>
      <td><input type="text" value="" reg="lowerchar" check lower></td>
      <td><input type="text" value="" reg="lowerchar" lower></td>
    </tr>
    <tr>
      <td>数字和字母</td>
      <td><input type="text" value="" reg="digitchar" check></td>
      <td><input type="text" value="" reg="digitchar"></td>
    </tr>
    <tr>
      <td>数字字母下划线</td>
      <td><input type="text" value="" reg="digitchar_" check></td>
      <td><input type="text" value="" reg="digitchar_"></td>
    </tr>
    <tr>
      <td>email地址</td>
      <td><input type="text" value="" reg="email" check></td>
      <td><input type="text" value="" reg="email"></td>
    </tr>
    <tr>
      <td>url</td>
      <td><input type="text" value="" reg="url" check></td>
      <td><input type="text" value="" reg="url"></td>
    </tr>
    <tr>
      <td>自定义规则(只能输入aaa)</td>
      <td><input type="text" value="" reg="^aaa$" regcheck="^a{1,3}$" msg="只能输入aaa" check></td>
      <td><input type="text" value="" reg="^aaa$" regcheck="^a{1,3}$" msg="只能输入aaa"></td>
    </tr>
</table>
</body>
</html>


六、注意事项
该组件依赖IE特有的behavior机制及window.event对象,仅适用于旧版IE浏览器。在开发时,若需要兼容现代浏览器,请考虑改用JavaScript通用验证方案。但理解HTC的实现方式对于维护遗留系统或学习早期前端技术仍有参考价值。

版权声明:本HTC组件代码归海洋工作室所有,可免费用于非商业目的,如需商业使用请联系原作者。

热心网友4 发表于 2026-6-9 11:10:00

Re: IE浏览器HTC验证组件:正则表达式实现表单输入实时检测与失焦校验

写得非常详细,对HTC组件的封装思路和正则表达式应用都讲得很透彻。这种将验证逻辑独立成.htc文件复用的方式在早期IE开发中确实很实用,尤其是实时检测和失焦校验的区分处理,以及自定义属性支持简化了前端调用。感谢分享!

热心网友3 发表于 2026-6-22 20:50:02

Re: IE浏览器HTC验证组件:正则表达式实现表单输入实时检测与失焦校验

这个帖子真是满满的怀旧感!当年IE时代的HTC组件确实解决了不少表单验证的问题,封装成.htc文件后复用性很高。楼主对每个正则模式的拆解很细致,尤其是区分了实时校验和失焦校验的正则,这样既能防止输入过程中被频繁打断,又能在最后做完整验证,设计思路很实用。另外支持自定义正则和自动大小写转换也很贴心,对老项目维护来说简直是教科书级别的参考。感谢分享!

热心网友3 发表于 2026-6-22 21:00:04

Re: IE浏览器HTC验证组件:正则表达式实现表单输入实时检测与失焦校验

感谢楼主的详细分享!HTC 技术在早期 IE 环境下确实是一种很实用的封装方式,能把验证逻辑抽离成独立组件,复用性很强。您对 regArray 中不同校验模式的分类也考虑得很细致,特别是区分了实时校验和失焦完整校验,能避免在输入过程中因部分匹配而干扰用户操作。另外,像 upper/lower 自动转换、自定义正则 reg 和 regcheck 等属性的设计也很贴心,提升了灵活性。想请教一下,组件中的错误提示目前是通过 alert 弹窗还是其他方式显示?像远程脚本、服务端协作这类场景是否也能通过 HTC 来扩展?再次感谢您分享这段经典的实现思路!
页: [1]
查看完整版本: IE浏览器HTC验证组件:正则表达式实现表单输入实时检测与失焦校验