所以现在我的React应用程序中发生了一个非常不可思议的现象,我不确定如何描述它,但是这里有:
我正在使用Web Audio API和React构建一个合成器,以响应keyUp
事件触发音符的开始和keyDown
事件触发音符的结束。在大多数情况下,这是完美无缺的。但是每10-15次按键一次会在keyUp
事件之后触发另外的keyUp
事件。我有一个React组件,它处理所有事件处理并根据要处理的事件(keyDown
或lodash/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)
答案 0 :(得分:0)
它是debounce
。删除该错误后,再也看不到错误。我试图变得花哨,但不了解节流和反跳之间的区别。按照此article:
节流会强制函数在一段时间内被调用的最大次数。就像“每100毫秒最多执行一次此功能”。
和
去抖强制执行一个函数,直到经过一定时间后才再次调用该函数。就像“仅在经过100毫秒而不调用它时才执行此函数。”
我的想法是我可能想节流,并且通过反跳,我允许让函数的最后一次调用通过,因为调用之间的时间间隔足够短,以至于在释放时,反跳会让通过它不应该发生的事件。另外,由于不再需要按下和注册密钥,handleKeyDown
中内置的故障安全逻辑不再足够,因为它假定实际上已经使用了密钥。