React KeyDown事件有时会在KeyUp上触发

时间:2019-02-17 20:25:08

标签: javascript reactjs events web-audio keyevent

所以现在我的React应用程序中发生了一个非常不可思议的现象,我不确定如何描述它,但是这里有:

我正在使用Web Audio API和React构建一个合成器,以响应keyUp事件触发音符的开始和keyDown事件触发音符的结束。在大多数情况下,这是完美无缺的。但是每10-15次按键一次会在keyUp事件之后触发另外的keyUp事件。我有一个React组件,它处理所有事件处理并根据要处理的事件(keyDownlodash/debounce)触发Redux操作。此外,我使用keyDown方法来抑制用户按住键时的其他lodash/debounce事件。

我不习惯使用keyDown函数,我只需要抑制一些额外的import React, { Component } from 'react' import debounce from 'lodash/debounce' import { REGISTERED_KEYS } from '../constants/keyboard-constants' export default class ComputerKeyboard extends Component { constructor (props) { super(props) this.handleKeyDown = this.handleKeyDown.bind(this) this.handleKeyUp = this.handleKeyUp.bind(this) } handleKeyDown (e) { return debounce((event = e) => { if (this.props.currentKeys.indexOf(event.keyCode) < 0 && REGISTERED_KEYS.includes(event.keyCode)) { this.props.keyDown(event.keyCode) this.props.updateGateStartTime({ value: this.props.audioContext.currentTime }) } }, 2)() } handleKeyUp (e) { const isLastKey = this.props.currentKeys.includes(e.keyCode) && this.props.currentKeys.length === 1 if (isLastKey && this.props.gateStartTime) { this.props.updateGateStartTime({ value: null }) } if (this.props.currentKeys.includes(e.keyCode) && REGISTERED_KEYS.includes(e.keyCode)) { this.props.keyUp(e.keyCode) } } componentDidMount () { document.addEventListener('keydown', this.handleKeyDown) document.addEventListener('keyup', this.handleKeyUp) } componentWillUnmount () { document.removeEventListener('keydown', this.handleKeyDown) document.removeEventListener('keyup', this.handleKeyUp) } render () { return null } } 事件。我很可能没有正确使用它,或者有一个更简单的解决方案。我只需要答案。

我的组件如下:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys


browser = webdriver.PhantomJS(service_log_path=os.path.devnull)
browser.get('https://twitter.com/earthpix/media')  # This page is just an example.
scroll = browser.find_element_by_tag_name('html')
scroll.send_keys(Keys.END)
html = scroll.page_source

print (html)

1 个答案:

答案 0 :(得分:0)

它是debounce。删除该错误后,再也看不到错误。我试图变得花哨,但不了解节流和反跳之间的区别。按照此article

  

节流会强制函数在一段时间内被调用的最大次数。就像“每100毫秒最多执行一次此功能”。

  

去抖强制执行一个函数,直到经过一定时间后才再次调用该函数。就像“仅在经过100毫秒而不调用它时才执行此函数。”

我的想法是我可能想节流,并且通过反跳,我允许让函数的最后一次调用通过,因为调用之间的时间间隔足够短,以至于在释放时,反跳会让通过它不应该发生的事件。另外,由于不再需要按下和注册密钥,handleKeyDown中内置的故障安全逻辑不再足够,因为它假定实际上已经使用了密钥。