关于输入汉字时keypress事件无法触发

wszl 2007-03-29 09:17:43
我的目的是在input的输入框里面,每输入一个字符(包括汉字等unicode字符),自动计算输入值的长度,一个unicode字符算2个字符长,ascii的算一个,不能使输入的总长度大于input的maxlength属性。现在判断unicode和字符的长度我都解决了,但是就是触发keypress的时候出了问题,打开输入法输入汉字或其它unicode字符的时候,keypress不被触发,只有关闭输入法才能正常触发。似乎是输入法拦截了keypress事件,然后通过其它机制改变input的内容,这样就跳过了我的处理函数。用onchange可以解决,但是我想最好还是在keypress这类实时的事件来处理。
多谢了
...全文
1013 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenyun22 2007-04-05
  • 打赏
  • 举报
回复
学习!
wszl 2007-04-05
  • 打赏
  • 举报
回复
ttyp(@http://www.cnblogs.com/ttyp/)
f解决了我的问题!呵呵,程序员有时候挺笨的,脑子都不会拐弯

ttyp 2007-04-04
  • 打赏
  • 举报
回复
目前只有用propertychange来代替了

<input type=text onpropertychange="change(this)">
<SCRIPT LANGUAGE="JavaScript">
<!--
var f = true;
function change(o){
if(event.propertyName == "value"&&f){
f = false;
o.value = "s";
alert(o.value);
f = true;
}
}
爱着有你 2007-04-04
  • 打赏
  • 举报
回复
支持一下
proglovercn 2007-04-03
  • 打赏
  • 举报
回复
学习……
wszl 2007-04-03
  • 打赏
  • 举报
回复
高手们献身啊
wszl 2007-04-02
  • 打赏
  • 举报
回复
楼上的回帖不看帖。我不是说了吗,用keyup事件在输入的时候截取,但是在某些中文输入法打开的时候,keyup事件无法触发,被输入法截取了。
wszl 2007-04-02
  • 打赏
  • 举报
回复
再没办法了吗?
viaivi 2007-04-01
  • 打赏
  • 举报
回复
搞这么麻烦,接收数据的时候直接截取
wszl 2007-04-01
  • 打赏
  • 举报
回复
顶起来
wszl 2007-03-31
  • 打赏
  • 举报
回复
用propertychange似乎陷入死循环,因为在onpropertychange事件里需要更改控件的value,这样就反复不停的执行了。
没用过propertychange,是不是我用的方式不对?有什么要注意的?
jiaxueq 2007-03-31
  • 打赏
  • 举报
回复
用propertychange判断吧。
wszl 2007-03-31
  • 打赏
  • 举报
回复
问题比较复杂了。发现用不同的输入法,竟然出现不同的结果,我在单位用微软拼音2003,紫光拼音,keyup事件似乎被输入法给屏蔽了,用智能ABC就可以。但是在家里用紫光,就可以正常触发keyup事件,都是中文XP系统,真是怪异啊。有没有高人来解释一下?
wszl 2007-03-30
  • 打赏
  • 举报
回复
一楼二楼说的不错,我刚开始没搞对。keyup的确起作用。
4楼说的禁用输入法是不可取的,如果客户就是要输入中文,那就不行了。但是用鼠标右键粘贴的确是个问题,需要同时处理onpaste事件了
lizhongbin 2007-03-30
  • 打赏
  • 举报
回复
mark。。。
adverse 2007-03-30
  • 打赏
  • 举报
回复
但是如果只用keyup,当用户粘贴、拖拽的时候可能就会出现问题,所以,觉得最好keyup,onchange,一起用。
he_8134 2007-03-30
  • 打赏
  • 举报
回复
=.=没看清楚楼主的要求,以为是要禁用中文呢~~`
he_8134 2007-03-29
  • 打赏
  • 举报
回复
不如禁用输入法~~~<input type="text" style="ime-mode:disabled" />

=.=不过如果用户 鼠标右键->粘贴 呢~~~
wszl 2007-03-29
  • 打赏
  • 举报
回复
没用,我试了。
hbjmdx008 2007-03-29
  • 打赏
  • 举报
回复
同意楼上.
加载更多回复(1)
JS中的常用对象[转载]web 技术 2010-06-05 15:00:30 阅读3 评论0 字号:大中小 订阅 [removed] Window For JavaScript 熟练window对象的open、close、alert、confirm、prompt、setTimeout、clearTimeout、setInterval、clearInterval、moveBy、resizeBy、scrollBy方法的使用 掌握window对象的moveTo、resizeTo、scrollTo、print方法的使用 熟练掌握window对象的status、location、name、self、opener属性的使用  Window对象是客户端javascript最高层对象之一,只要打开浏览器窗口,不管该窗口中是否有打开的网页,当遇到BODY、FRAMESET或FRAME元素,都会自动建立window对象的实例。另外,该对象的实例也可由window.open()方法创建。由于window对象是其它大部分对象的共同祖先,在调用window对象的方法和属性,可以省略window对象的引用。例如:window.[removed]()可以简写成: [removed]()。  在窗口中觖发本窗口对象的任何方法和属性可以省去窗口的实例名称。例如给当前的myWin窗口设置status属性,可以只用status而不用myWin.status。但是,在事件处理中调用location属性、close()方法或open()方法必须使用实例名称。 6-2-1 window对象的方法 window对象有以下方法: open close alert confirm prompt setTimeout clearTimeout setInterval clearInterval moveBy moveTo resizeBy resizeTo scrollBy scrollTo find back forward home stop print blur focus captureEvent enableExternalCapture disableExternalCapture handleEvent releaseEvent routeEvent scroll   1. open方法   语法格式: window.open(URL,窗口名称,窗口风格)   功能:打开一个新的窗口,并在窗口中装载指定URL地址的网页。   说明: open方法用于打开一个新的浏览器窗口,并在新窗口中装入一个指定的URL地址 ; open方法在打开一个新的浏览器窗口,还可以指定窗口的名称(第二个参数); open方法在打开一个新的浏览器窗口,还可以指定窗口的风格(第三个参数), 窗口风格有以下选项,这些选项可以多选,如果多选,各选项之间用逗号分隔: toolbar:指定窗口是否有标准工具栏。当该选项的值为1或yes,表示有标准 工具栏,当该选项的值为0或no,表示没有标准工具栏; location:指定窗口是否有地址工具栏,选项的值及含义与toolbar相同; directories:指定窗口是否有链接工具栏,选项的值及含义与toolbar相同; status:指定窗口是否有状态栏,选项的值及含义与toolbar相同; menubar:指定窗口是否有菜单,选项的值及含义与toolbar相同; scrollbar:指定当前窗口文档大于窗口是否有滚动条,选项的值及含义与 toolbar相同; resizable:指定窗口是否可改变大小,选项的值及含义与toolbar相同; width:以像素为单位指定窗口的宽度,已被innerWidth取代; height:以像素为单位指定窗口的高度,已被innerHeight取代; outerWidth:以像素为单位指定窗口的外部宽度; outerHeight:以像素为单位指定窗口的外部高度; left:以像素为单位指定窗口距屏幕左边的位置; top:以像素为单位指定窗口距屏幕顶端的位置; alwaysLowered:指定窗口隐藏在所有窗口之后,选项的值及含义与toolbar相同 ; alwaysRaised:指定窗口浮在所有窗口之上,选项的值及含义与toolbar相同; dependent:指定打开的窗口为当前窗口的一个子窗口,并随着父窗口的关闭而 关闭,选项的值及含义与toolbar相同; hotke
[正则表达式]文本框输入内容控制 ….. 默认分类 2009-02-13 10:10 阅读26 评论0 字号: 大大 中中 小小整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$"。只能输入n位的数字:"^\d{n}$"。只能输入至少n位的数字:"^\d{n,}$"。只能输入m~n位的数字:。"^\d{m,n}$"只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。只能输入非零的正整数:"^\+?[1-9][0-9]*$"。只能输入非零的负整数:"^\-[1-9][]0-9"*$。只能输入长度为3的字符:"^.{3}$"。只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。只能输入由数字、26个英文字母或者下划线组成的字符串:"^\w+$"。验证用户密码:"^[a-zA-Z]\w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。验证是否含有^%&',;=?$\"等字符:"[^%&',;=?$\x22]+"。只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"验证Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。验证InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。验证电话号码:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。验证身份证号(15位或18位数字):"^\d{15}|\d{18}$"。验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。匹配中文字符的正则表达式: [\u4e00-\u9fa5] 匹配双字节字符(包括汉字在内):[^\x00-\xff] 应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)String.prototype.len=function(){return this.replace(/[^\x00-\xff]/g,"aa").length;} 匹配空行的正则表达式:\n[\s| ]*\r 匹配html标签的正则表达式:<(.*)>(.*)<\/(.*)>|<(.*)\/> 匹配首尾空格的正则表达式:(^\s*)|(\s*$) 应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现,如下: String.prototype.trim = function(){return this.replace(/(^\s*)|(\s*$)/g, "");} 利用正则表达式分解和转换IP地址: 下面是利用正则表达式匹配IP地址,并将IP地址转换成对应数值的Javascript程序: function IP2V(ip){re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正则表达式if(re.test(ip)){return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1}else{throw new Error("Not a valid IP address!")}} 不过上面的程序如果不用正则表达式,而直接用split函数来分解可能更简单,程序如下: var ip="10.100.20.168"ip=ip.split(".")alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1)) 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 利用正则表达式限制网页表单里的文本框输入内容: 用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))" 用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))" 用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" 用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" <script language="javascript">if (document.layers)//触发键盘事件document.captureEvents(Event.KEYPRESS) function xz(thsv,nob){if(nob=="2"){window.clipboardData.setData("text","")alert("避免非法字符输入,请勿复制字符");return false;}if (event.keyCode!=8 && event.keyCode!=16 && event.keyCode!=37 && event.keyCode!=38 && event.keyCode!=39 && event.keyCode!=40){thsvv=thsv.value;//输入的值thsvs=thsvv.substring(thsvv.length-1);//输入的最后一个字符//thsvss=thsvv.substring(0,thsvv.length-1);//去掉最后一个错误字符if (!thsvs.replace(/[^\u4E00-\u9FA5\w]/g,'') || event.keyCode==189){//正则除去符号和下划线 keythsv.value='请勿输入非法符号 ['+thsvs+']';alert('请勿输入非法符号 ['+thsvs+']');thsv.value="";return false;}}} 允许数字字母和汉字 <script language="javascript">

87,903

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧