Javascript TypeError:只能在Safari上的节点实例上调用Node.addEventListener
我的React组件中有一段代码,它禁用了“enter”键 它可以在Chrome/Firefox上正常工作,但不能在Safari上正常工作。在Safari上,我得到:- TypeError:只能在节点实例上调用Node.addEventListenerJavascript TypeError:只能在Safari上的节点实例上调用Node.addEventListener,javascript,reactjs,safari,Javascript,Reactjs,Safari,我的React组件中有一段代码,它禁用了“enter”键 它可以在Chrome/Firefox上正常工作,但不能在Safari上正常工作。在Safari上,我得到:- TypeError:只能在节点实例上调用Node.addEventListener 我只有这样做才能让它(在所有方面)发挥作用:- addEvent.call(node, 'keypress', _disableEnter, false); 只是想知道为什么Chrome&Safari上的addEventListener实现不同
我只有这样做才能让它(在所有方面)发挥作用:-
addEvent.call(node, 'keypress', _disableEnter, false);
只是想知道为什么Chrome&Safari上的
addEventListener
实现不同。它看起来像是节点。Chrome上的addEventListener将直观地将这个绑定到定义它的节点实例。这可能与我们有以下内容的原因相同:
var log = console.log;
log('foo') // TypeError
相反,我们必须:
var log = console.log.bind(console); // bind console.log function to it's proper context
log('foo') // 'foo'
就你而言,打电话
addEvent('keypress', _disableEnter, false);
使上下文成为窗口对象(隐式)
通常,当您打算将函数传递给其他人时,总是希望首先将函数绑定到所属对象。每个浏览器的浏览器实现都不同,因此这是确保其一致工作的最佳方法
在console中,我认为.log引用了console对象本身上的其他实例方法。因此,在Safari中,节点.addEventListener
函数的实现方式可能只需要在节点
上定义其他函数,它们可能还会抛出更具描述性的错误消息
因此,你应该:
const addEvent = node.addEventListener || node.attachEvent;
const boundAddEvent = addEvent.bind(node);
// use boundAddEvent however you like anywhere, or .call like you did
这可能与我们有以下情况的原因相同:
var log = console.log;
log('foo') // TypeError
相反,我们必须:
var log = console.log.bind(console); // bind console.log function to it's proper context
log('foo') // 'foo'
就你而言,打电话
addEvent('keypress', _disableEnter, false);
使上下文成为窗口对象(隐式)
通常,当您打算将函数传递给其他人时,总是希望首先将函数绑定到所属对象。每个浏览器的浏览器实现都不同,因此这是确保其一致工作的最佳方法
在console中,我认为.log引用了console对象本身上的其他实例方法。因此,在Safari中,节点.addEventListener
函数的实现方式可能只需要在节点
上定义其他函数,它们可能还会抛出更具描述性的错误消息
因此,你应该:
const addEvent = node.addEventListener || node.attachEvent;
const boundAddEvent = addEvent.bind(node);
// use boundAddEvent however you like anywhere, or .call like you did
啊,我明白了。所以它实际上调用了window.addEventListener
,我认为它的行为是一样的:pSo现在的问题是为什么Safari对待window
与chrome不同p看来Safari并没有把窗口
当作节点
啊,我明白了。所以它实际上调用了window.addEventListener
,我认为它的行为是一样的:pSo现在的问题是为什么Safari对待window
与chrome不同p因此,Safari似乎没有将窗口
视为节点