【问题标题】:how to define keyCode or which or key or code properties for keyboard event如何为键盘事件定义 keyCode 或 which 或 key 或 code 属性
【发布时间】:2016-11-28 23:08:15
【问题描述】:

根据我的要求,我们需要为热键编写测试规范(比如 shift+1+L -- 上传文件)。在我的方法中,我写了如下内容

    public static SHIFTKEY      : number = 16;
    this.keys = {};

    document.addEventListener('keydown', (event: KeyboardEvent) => {
    var code = event.which ? event.which : event.keyCode;
    if (code === KeyCodeConst.SHIFTKEY || (this.keys[KeyCodeConst.SHIFTKEY] && trackedKeys[code])) {
    if (!this.keys[code]) {
    this.keys[code] = true;
    this.keysCount++;
    }
    if (this.keysCount === 3) {
        alert('call the method which is required');
    }
    }
    if (!trackedKeys[code]) {
    this.keysCount = 0;
    }
    });

现在在我的规范文件中,我正在尝试为此编写一个测试用例,如下所示

      describe('Add Event Listener', () => {
           beforeEach(() => {
               viewModel = new viewModel();
               spyOn(window, 'addEventListener').and.callThrough();
           });
           it('check the combination of keys are called', () => {
               keyPress(16);
               keyPress(49);
               keyPress(76);
               expect(viewModel.keys[KeyCodeConst.SHIFTKEY]).toBeTruthy();          
           });
           function keyPress(keyCodeVal) {
               var keyboardEvent = document.createEvent('KeyboardEvent');
               try {
                   Object.defineProperty(keyboardEvent, 'keyCode', {'value': keyCodeVal});
               } catch (err){
                   console.log(err);
               }
               keyboardEvent.initKeyboardEvent('keydown',true,false,window,'',0,'',false,'');
               document.body.dispatchEvent(keyboardEvent);
           }
       });

在运行构建时,我收到如下错误,它给出如下构建错误

    Attempting to change value of a readonly property.
    at defineProperty (--some url--)
    at keyPress (--some url--)

除了 keyCode 或 which 之外,有没有一种方法可以将按下的键值发送给方法。根据 MDN 指南,我观察到这些是只读属性。我尝试使用密钥,但它不起作用。

【问题讨论】:

    标签: javascript typescript jasmine phantomjs node-modules


    【解决方案1】:

    要在不实际触发 keydown 事件的情况下测试您的方法,您可以将按下按键的逻辑从您的函数中分离出来,并在您的测试中将您想要测试的按键代码提供给它。

    要实际测试keydown 事件,请尝试使用此函数将keydown 事件分派到keyCode 值(调整为phantom-js):

        function triggerKeyDown(element, value) {
            var e = document.createEvent('KeyboardEvent');
            e.initEvent('keydown', true, false);
            Object.defineProperty(e, 'keyCode', {'value': value});
            element.dispatchEvent(e);
        }
    

    【讨论】:

    • 谢谢。为了测试keydown事件,我需要在每个类似这样的东西之前创建一个元素--$('body').append("");这不符合我的目的
    • “Window”类型上不存在“KeyboardEvent”属性。--我收到此错误。我检查了它不存在的库。
    • 我明白了,MDN 说构造函数并非在所有浏览器中都可用。也许你对the input event有更多的运气
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 2012-01-09
    • 2016-01-25
    • 1970-01-01
    相关资源
    最近更新 更多