js检测按键的跨浏览器解决方案

本文介绍了如何解决不同浏览器(如IE11以下、firefox46、chrome50)中输入框按下回车无法触发提交按钮的问题。特别关注了事件处理在不同浏览器间的差异,提出了在函数定义参数中传递事件对象的方法,以及如何通过HTML属性直接传递事件参数以确保兼容性。
摘要由CSDN通过智能技术生成

测试浏览器:IE11以下,firefox46,chrome50.


一、问题场景:

一个表单,提交按钮为input type=submit。改为button后,无法实现按下回车提交。

tips:如果只有一个input,则按下回车就会提交

如果有多个input,则input的type为submit时才能按下回车提交

如果提交按钮为button,按下回车不会提交。


二、解决

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
</head>
<body>
    <script type="text/javascript">
    function addEvent(a, b, c) {
        a.addEventListener ? a.addEventListener(b, c) : a.attachEvent && a.attachEvent("on" + b, c)
    };

    //event必须写在函数<strong>定义</strong>的<strong>参数部分</strong>(但是调用时不需要,否则firefox报错event为定义),否则firefox不能识别event.keyCode;    	
    function handler(event) {
    	//event.which必须在event.keyCode前,因为firefox下如果事件是onkeypress,按下可打印字符时event.keyCode为0        	
        var keynum = "which: " + event.which || "keyCode: " + event.keyCode;        
        alert(keynum)
    }

    addEvent(document, "keypress", handler);
    </script>
    <form>        
        <input id="xxx" type="text" />
    </form>
</html>

IE和chrome能很好的支持window.event,但是firefox不行,必须把event写在函数定义参数部分

如果

 addEvent(document, "keypress", handler);
改为
 addEvent(document, "keypress", handler(event));

则firefox会报错:event为定义。

但如果在html中传入参数,则不会报错。比如上面的代码可以改为

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
</head>
<body>
    <script type="text/javascript">
    function handler(e) {    
        var ev=window.event?window.event:e; 	
        var keynum = "which: " + ev.which  || "keyCode: " + ev.keyCode;
        alert(keynum);
    }
        
    </script>
    <form>        
        <input id="xxx" type="text" οnkeypress="return handler(event)" />
    </form>
</html>

通过元素的οnkeypress=来传送event参数就可以。

三、注意

1、onkeypress与onkeydown/onkeyup区别

返回值不同:前者返回ASCII码,后者返回按键的ascii码,无论大小写;

前者不能支持"F1", "CAPS LOCK"、"Home"等功能键,后者可以

另外,onkepress事件下,firefox不能正确识别keycode,需要用event.which替代

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值