Javascript TypeError:只能在Safari上的节点实例上调用Node.addEventListener

Javascript 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实现不同

我的React组件中有一段代码,它禁用了“enter”键

它可以在Chrome/Firefox上正常工作,但不能在Safari上正常工作。在Safari上,我得到:-

TypeError:只能在节点实例上调用Node.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似乎没有将
窗口
视为
节点