`

键盘按键事件的fireEvent

 
阅读更多

最近代码中有个功能需要用到手动触发键盘事件的功能,咱们的现有库对fireEvent的实现还比较单一,对键盘事件没有作支持,就自己封了一个。但键盘事件的fire在各浏览器下实现不一样,下面分别说明一下:

1. IE下没什么问题,创建事件对象、对对象的keyCode属性赋值,然后再抛出来就行了:

evtObj = document.createEventObject();
evtObj.keyCode=keyCode
el.fireEvent('on'+evtType, evtObj);

 

2. Firefox 需要通过document.createEvent创建KeyEvents对象,再通过initKeyEvent方法对事件对象初始化

evtObj = document.createEvent('KeyEvents');
evtObj.initKeyEvent( evtType, true, true, window, false, false, false, false, keyCode, 0 );

  

 3. Chrome/Safari/Opera

通过document.createEvent创建UIEvents对象,初始化后再在该对象上挂载按键值,Chrome和Opera可以先将keyCode属性delete掉后,再用Object.defineProperty方法重新为它赋值:

delete evtObj.keyCode;<br>Object.defineProperty(evtObj,"keyCode",{value:keyCode});

但是这里需要注意一点:Safari无法对对象的keyCode属性进行操作,强制覆盖里还会报错,解决方法是将键keyCode转为字符后挂在事件对象的key属性上:

evtObj.key=String.fromCharCode(keyCode);

通过这种方式绕开safari的坑后,在事件触发时的回调中再对keyCode进行一次适配即可:

var keyCode=evt.keyCode || evt.key.charCodeAt(0);

 

最后,封装好的function大概就是这样: 

function fireKeyEvent(el, evtType, keyCode){
  var evtObj;
                 
  if(document.createEvent){
    if( window.KeyEvent ) {
      evtObj = document.createEvent('KeyEvents');
      evtObj.initKeyEvent( evtType, true, true, window, false, false, false, false, keyCode, 0 );
    } else {
      evtObj = document.createEvent('UIEvents');
      evtObj.initUIEvent( evtType, true, true, window, 1 );
      delete evtObj.keyCode;
                        
      if(typeof evtObj.keyCode === "undefined"){
        Object.defineProperty(evtObj,"keyCode",{value:keyCode});
      }else{
        evtObj.key=String.fromCharCode(keyCode);
      }
    }
    el.dispatchEvent(evtObj);
                     
  }else if(document.createEventObject){
    evtObj = document.createEventObject();
    evtObj.keyCode=keyCode;
    el.fireEvent('on'+evtType, evtObj);
  }
}

 

完整事例:

<!DOCTYPE html>
<html lang="en">
    <head>
      <meta charset="utf-8" />
      <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
      <title>fireKeyEvent</title>
    </head>
    
    <body>
        <input type="text" id="txt1"/>
        <input type="button" id="btn1" value="fire"/>
        
        <script type="text/javascript">
            function $(id){
                return document.getElementById(id);
            }
            
            function addEvent(el, type, fn){
                if(document.addEventListener){
                    el.addEventListener(type, fn, true);
                }else if(document.attachEvent){
                    el.attachEvent("on"+type, fn);
                }else{
                    el["on"+type] = fn;
                }
            }
            
            
            function fireKeyEvent(el, evtType, keyCode){
                var evtObj;
                
                if(document.createEvent){
                    if( window.KeyEvent ) {
                        evtObj = document.createEvent('KeyEvents');
                        evtObj.initKeyEvent( evtType, true, true, window, false, false, false, false, keyCode, 0 );
                    } else {
                        evtObj = document.createEvent('UIEvents');
                        evtObj.initUIEvent( evtType, true, true, window, 1 );
                        delete evtObj.keyCode;
                       
                        if(typeof evtObj.keyCode === "undefined"){
                            Object.defineProperty(evtObj,"keyCode",{value:keyCode});
                        }else{
                            evtObj.key=String.fromCharCode(keyCode);
                        }
                    }

                    el.dispatchEvent(evtObj);
                    
                }else if(document.createEventObject){
                    evtObj = document.createEventObject();
                    evtObj.keyCode=keyCode
                    el.fireEvent('on'+evtType, evtObj);
               }
            }
            
            addEvent($("txt1"), "keydown" ,function(e){
                var evt=window.event || e;
                var keyCode=evt.keyCode || evt.key.charCodeAt(0);
                alert("keyCode:"+keyCode);
            })
            
            
            addEvent($("btn1"), "click", function(){
                fireKeyEvent($("txt1"), "keydown", 27);
            });
            
        </script>
    </body>
</html>

 

分享到:
评论

相关推荐

    js键盘事件全面控制_兼容FireFox和IE

    在 FireFox 和 Opera 中,可以使用 e.which 属性来获取键盘事件对象,而在 IE 中,可以使用 event.keyCode 属性来获取键盘事件对象。例如: FireFox 和 Opera: ``` function keyDown(e) { var keycode = e.which;...

    js按键事件 兼容ie 火狐狸

    JavaScript中的按键事件是网页交互的重要组成部分,允许开发者捕获用户在键盘上按下、释放或组合键的活动。在不同的浏览器中,尤其是IE和火狐(Firefox),这些事件可能存在兼容性问题。本文将深入探讨如何在...

    js获取键盘按键响应事件(兼容各浏览器)

    以下内容将详细介绍如何使用JavaScript捕获键盘按键事件,并确保代码能够在不同的浏览器环境下正常工作。 首先,我们需要了解几种基本的键盘事件监听方法。最常见的是onkeydown事件,它在用户按下键盘键时触发。...

    Unity3D获取当前键盘按键及Unity3D鼠标、键盘的基本操作

    本文将详细讲解如何在Unity3D中获取当前键盘按键以及进行基本的键盘和鼠标操作。 首先,获取当前键盘按键可以使用Unity3D的`Input`类。在给出的代码示例中,`GetCurrentKey`脚本展示了如何实现这一功能。`Input....

    js键盘事件参考学习_兼容FireFox和IE

    本文将深入探讨浏览器的键盘事件、兼容性问题以及如何在Firefox和IE中实现代码,最后进行总结。 **第一部分:浏览器的按键事件** 键盘事件包括三种类型:`keydown`、`keypress`和`keyup`。`keydown`事件在用户按下...

    js键盘事件

    ### JS键盘事件详解 在JavaScript编程中,键盘事件是非常重要的交互元素之一,它们允许开发者捕捉用户的键盘输入行为,并根据这些输入执行相应的操作。本文将详细解释JS中的键盘事件及其应用场景。 #### 一、键盘...

    javascript 按键事件(兼容各浏览器)

    在本文中,我们首先介绍了JavaScript中处理键盘按键事件的三种不同类型的事件:keydown、keypress和keyup,以及它们对应的事件句柄onkeydown、onkeypress和onkeyup。这些事件类型在处理按键时是有顺序和差异的:首先...

    javascript 按键事件(兼容各浏览器).docx

    键盘按键事件基础 - **`keydown`**:此事件在按键被按下时触发。 - **`keypress`**:此事件在按键被按下且可能产生字符时触发。对于非打印字符(如功能键),此事件可能不会触发。 - **`keyup`**:此事件在按键被...

    浅谈js键盘事件全面控制

    具体来说,对于keydown事件的初始化,在IE中使用window.event.keyCode来获取按键的索引值,而在Firefox中,则需要通过事件对象e的which属性来实现。对于按键事件的监听,我们可以定义一个keydown()函数,并将其绑定...

    QTP模拟鼠标和键盘事件整理

    - `PressKey`: 模拟键盘按键按下并释放。 - `PressNKeys`: 模拟连续按键N次。 - `DragAndDrop`: 拖拽操作。 - `SetSynchronizationTimeout`: 设置同步等待时间。 使用`Mercury.DeviceReplay`类可以更加灵活地控制...

    javascript键盘事件[定义].pdf

    在初始化键盘事件监听时,IE 使用 `document.onkeydown = keyDown`,而 Firefox 和 Opera 需要通过事件参数(通常称为 `e`)来访问按键信息,如 `e.which`。 在 Firefox 和 Opera 中,可以使用 `e.which` 获取按键...

    键盘上各键的数字码表示

    2. **Mozilla Keypcodes**:Mozilla Firefox浏览器使用自己的keycodes系统来识别键盘事件。例如,字母键的keycode与ASCII码相同,但某些特殊键如Shift、Control、Alt等有不同的值。 3. **Internet Explorer (IE) ...

    JavaScript onkeydown事件入门实例(键盘某个按键被按下)

    用户按下一个键盘按键时会触发 onkeydown 事件。与 onkeypress 事件不同的是,onkeydown 事件是响应任意键按下的处理(包括功能键),onkeypress 事件只响应字符键按下后的处理。 提示 Internet Explorer/Chrome ...

    JavaScript 监听textarea中按键事件

    此外,随着Web标准的演进,W3C标准化了键盘事件的处理方式,提出了新的事件属性如key和code,这些属性提供了更为一致和标准化的方式来处理键盘事件,甚至能够区分相似键码但不同含义的按键,比如区别字母和符号的键...

    JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)

    用户按下或按住一个键盘按键时会触发 onkeypress 事件。 注意:onkeypress 事件与 onkeydown 事件有些细微差别,onkeypress 事件不做相应功能键按下的处理。具体可将下面的示例更改为 onkeydown 事件后,可输入 !@#$...

    js虚拟、模拟键盘

    例如,使用`event.preventDefault()`阻止实际的键盘输入,然后通过`event.target.value += 'a'`来模拟按下'a'键的效果。 6. **兼容性**:考虑到不同浏览器对某些API的支持程度,开发虚拟键盘时需进行跨浏览器测试,...

    javascript实现软键盘输入,兼容多种浏览器,测试通过

    3. **事件处理**:当用户点击软键盘上的按键时,需要模拟真实键盘的输入行为。这可以通过触发`input`或`keydown`事件实现,例如`event.target.value = event.target.value + 'a'`,将字符'a'添加到输入框。 4. **...

    JavaScript获取键盘按键的键码(参照表)

    在JavaScript编程中,有时我们需要监听用户的键盘输入,这时就涉及到获取键盘按键的键码。键码(keyCode)是JavaScript事件对象的一个属性,它用于表示用户按下或释放键盘上的特定键时所对应的数值。这个数值可以...

Global site tag (gtag.js) - Google Analytics