查看: 247|回复: 1

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

[复制链接]
发表于 5 天前 | 显示全部楼层 |阅读模式
在早期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)
  1. //键盘事件
  2. <PUBLIC:ATTACH EVENT="onkeypress" ONEVENT="doEvent()" />
  3. //粘贴事件
  4. <PUBLIC:ATTACH EVENT="onpaste"  ONEVENT="doEvent()" />
  5. //失去焦点事件
  6. <PUBLIC:ATTACH EVENT="onblur" ONEVENT="doEvent()" />
  7. <SCRIPT LANGUAGE="JScript">
  8. //预定义的检查模式
  9. var regArray = new Array(
  10.     new Array("int+0","^\\d+$","","需要输入一个非负整数,请重新检查"),
  11.     new Array("int+","^[0-9]*[1-9][0-9]*$","^\\d+$","需要输入一个正整数,请重新检查"),
  12.     new Array("int-0","^((-\\d+)|(0+))$","^(-|(-\\d+)|(0+))$","需要输入一个非正整数,请重新检查"),
  13.     new Array("int-","^-[0-9]*[1-9][0-9]*$","^(-|(-\\d+)|(0+))$","需要输入一个负整数,请重新检查"),
  14.     new Array("int","^-?\\d+$","^-|(-?\\d+)$","需要输入一个整数,请重新检查"),
  15.     new Array("double+0","^\\d+(\\.\\d+)?$","^((\\d+\\.)|(\\d+(\\.\\d+)?))$","需要输入一个非负浮点数,请重新检查"),
  16.     new Array("double+","^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$","^((\\d+\\.)|(\\d+(\\.\\d+)?))$","需要输入一个正浮点数,请重新检查"),
  17.     new Array("double-0","^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$","^(-|(-\\d+\\.)|(0+\\.)|(-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$","需要输入一个非正浮点数,请重新检查"),
  18.     new Array("double-","^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$","^(-|(-\\d+\\.?)|(-\\d+\\.\\d+))$","需要输入一个负浮点数,请重新检查"),
  19.     new Array("double","^(-?\\d+)(\\.\\d+)?$","^(-|((-?\\d+)(\\.\\d+)?)|(-?\\d+)\\.)$","需要输入一个浮点数,请重新检查"),
  20.     new Array("char","^[A-Za-z]+$","","您只能输入英文字母,请重新检查"),
  21.     new Array("upperchar","^[A-Z]+$","","您只能输入英文大写字母,请重新检查"),
  22.     new Array("lowerchar","^[a-z]+$","","您只能输入英文小写字母,请重新检查"),
  23.     new Array("digitchar","^[A-Za-z0-9]+$","","您只能输入数字和英文字母,请重新检查"),
  24.     new Array("digitchar_","^\\w+$","","您只能输入数字、英文字母和下划线,请重新检查"),
  25.     new Array("email","^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$","^(([\\w-]+(\\.[\\w-]+)*@?)|([\\w-]+(\\.[\\w-]+)*@[\\w-]+)|([\\w-]+(\\.[\\w-]+)*@([\\w-]+\\.)+)|([\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+))$","需要输入正确的email地址,请重新检查"),
  26.     new Array("url","^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$","^([a-zA-z]+:?)|([a-zA-z]+:/{1,2})|([a-zA-z]+://(\\w+(-\\w+)*))|([a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?)$","需要输入正确的url地址,请重新检查")
  27. );
  28. //受控元素默认的事件处理程序
  29. function doEvent() {
  30.     var type = window.event.type;
  31.     var value = window.event.srcElement.value;
  32.     if (type == "keypress") {
  33.         var keyCode = window.event.keyCode;
  34.         if (typeof(window.event.srcElement.upper) != "undefined") {
  35.             if (keyCode >= 97 && keyCode <= 122)
  36.                 keyCode = window.event.keyCode = keyCode - 32;
  37.         }
  38.         else if (typeof(window.event.srcElement.lower) != "undefined") {
  39.             if (keyCode >= 65 && keyCode <= 90)
  40.                 keyCode = window.event.keyCode = keyCode + 32;
  41.         }
  42.         value += String.fromCharCode(keyCode);
  43.     }
  44.     else if (type == "paste") {
  45.         value += window.clipboardData.getData("Text");
  46.     }
  47.     if (value == "") return;
  48.     if (typeof(window.event.srcElement.reg) == "undefined") return;
  49.     if ((type == "keypress" || type == "paste") && typeof(window.event.srcElement.check) == "undefined") return;
  50.     var msg = "";
  51.     var reg = window.event.srcElement.reg;
  52.     var regExp = null;
  53.     for (var i=0;i<regArray.length;i++) {
  54.         if (regArray[i][0] == reg) {
  55.             if ((type == "keypress" || type == "paste") && regArray[i][2] != "")
  56.                 regExp = new RegExp(regArray[i][2]);
  57.             else
  58.                 regExp = new RegExp(regArray[i][1]);
  59.             msg = regArray[i][3];
  60.             break;
  61.         }
  62.     }
  63.     if (regExp == null) {
  64.         if ((type == "keypress" || type == "paste") && typeof(window.event.srcElement.regcheck) != "undefined")
  65.             regExp = new RegExp(window.event.srcElement.regcheck);
  66.         else
  67.             regExp = new RegExp(reg);
  68.         msg = "输入错误,请重新检查";
  69.     }
  70.     if (regExp.test(value)) return;
  71.     if (type == "blur") {
  72.         if (typeof(window.event.srcElement.msg) != "undefined")
  73.             msg = window.event.srcElement.msg;
  74.         alert(msg);
  75.         window.event.srcElement.focus();
  76.         window.event.srcElement.select();
  77.     }
  78.     else {
  79.         window.event.returnValue = false;
  80.     }
  81. }
  82. </SCRIPT>
复制代码

五、HTML页面使用示例
将上述代码保存为validate.htc,然后通过CSS将behavior附加到input元素上。以下为一个完整的演示页面:
  1. <html>
  2. <head>
  3. <style type="text/css">
  4. TABLE { width:100%; }
  5. INPUT { behavior:url("validate.htc"); }
  6. </style>
  7. </head>
  8. <body style="margin:0">
  9. <table>
  10.     <tr><td><a href="http://www.oceanstudio.net"><img border="0" src="logo.jpg"></a></td></tr>
  11. </table>
  12. <br>
  13. <table style="margin-left:20px">
  14.     <tr>
  15.         <td>验证规则</td>
  16.         <td>实时检测</td>
  17.         <td>失去焦点时检测</td>
  18.     </tr>
  19.     <tr>
  20.         <td>非负整数</td>
  21.         <td><input type="text" value="" reg="int+0" check></td>
  22.         <td><input type="text" value="" reg="int+0"></td>
  23.     </tr>
  24.     <tr>
  25.         <td>正整数</td>
  26.         <td><input type="text" value="" reg="int+" check></td>
  27.         <td><input type="text" value="" reg="int+"></td>
  28.     </tr>
  29.     <tr>
  30.         <td>非正整数</td>
  31.         <td><input type="text" value="" reg="int-0" check></td>
  32.         <td><input type="text" value="" reg="int-0"></td>
  33.     </tr>
  34.     <tr>
  35.         <td>负整数</td>
  36.         <td><input type="text" value="" reg="int-" check></td>
  37.         <td><input type="text" value="" reg="int-"></td>
  38.     </tr>
  39.     <tr>
  40.         <td>整数</td>
  41.         <td><input type="text" value="" reg="int" check></td>
  42.         <td><input type="text" value="" reg="int"></td>
  43.     </tr>
  44.     <tr>
  45.         <td>非负浮点数</td>
  46.         <td><input type="text" value="" reg="double+0" check></td>
  47.         <td><input type="text" value="" reg="double+0"></td>
  48.     </tr>
  49.     <tr>
  50.         <td>正浮点数</td>
  51.         <td><input type="text" value="" reg="double+" check></td>
  52.         <td><input type="text" value="" reg="double+"></td>
  53.     </tr>
  54.     <tr>
  55.         <td>非正浮点数</td>
  56.         <td><input type="text" value="" reg="double-0" check></td>
  57.         <td><input type="text" value="" reg="double-0"></td>
  58.     </tr>
  59.     <tr>
  60.         <td>负浮点数</td>
  61.         <td><input type="text" value="" reg="double-" check></td>
  62.         <td><input type="text" value="" reg="double-"></td>
  63.     </tr>
  64.     <tr>
  65.         <td>浮点数</td>
  66.         <td><input type="text" value="" reg="double" check></td>
  67.         <td><input type="text" value="" reg="double"></td>
  68.     </tr>
  69.     <tr>
  70.         <td>英文字母</td>
  71.         <td><input type="text" value="" reg="char" check></td>
  72.         <td><input type="text" value="" reg="char"></td>
  73.     </tr>
  74.     <tr>
  75.         <td>大写字母(自动转换)</td>
  76.         <td><input type="text" value="" reg="upperchar" check upper></td>
  77.         <td><input type="text" value="" reg="upperchar" upper></td>
  78.     </tr>
  79.     <tr>
  80.         <td>小写字母(自动转换)</td>
  81.         <td><input type="text" value="" reg="lowerchar" check lower></td>
  82.         <td><input type="text" value="" reg="lowerchar" lower></td>
  83.     </tr>
  84.     <tr>
  85.         <td>数字和字母</td>
  86.         <td><input type="text" value="" reg="digitchar" check></td>
  87.         <td><input type="text" value="" reg="digitchar"></td>
  88.     </tr>
  89.     <tr>
  90.         <td>数字字母下划线</td>
  91.         <td><input type="text" value="" reg="digitchar_" check></td>
  92.         <td><input type="text" value="" reg="digitchar_"></td>
  93.     </tr>
  94.     <tr>
  95.         <td>email地址</td>
  96.         <td><input type="text" value="" reg="email" check></td>
  97.         <td><input type="text" value="" reg="email"></td>
  98.     </tr>
  99.     <tr>
  100.         <td>url</td>
  101.         <td><input type="text" value="" reg="url" check></td>
  102.         <td><input type="text" value="" reg="url"></td>
  103.     </tr>
  104.     <tr>
  105.         <td>自定义规则(只能输入aaa)</td>
  106.         <td><input type="text" value="" reg="^aaa$" regcheck="^a{1,3}$" msg="只能输入aaa" check></td>
  107.         <td><input type="text" value="" reg="^aaa$" regcheck="^a{1,3}$" msg="只能输入aaa"></td>
  108.     </tr>
  109. </table>
  110. </body>
  111. </html>
复制代码

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

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

使用道具 举报

发表于 5 天前 | 显示全部楼层

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

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-14 04:15 , Processed in 0.025882 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部