Javascript 重写以使其不';当找不到类时,不会触发错误
我目前正在使用以下功能,当用户单击某个地方以确定是否隐藏下拉列表时(在react中)。一切正常,但当我点击主体时,它会记录以下内容 我试着重写了几次,但我找不到解决这个问题的方法Javascript 重写以使其不';当找不到类时,不会触发错误,javascript,Javascript,我目前正在使用以下功能,当用户单击某个地方以确定是否隐藏下拉列表时(在react中)。一切正常,但当我点击主体时,它会记录以下内容 我试着重写了几次,但我找不到解决这个问题的方法 Uncaught TypeError: Cannot read property 'className' of null 我使用的函数 if (!event.target.className.includes('USERBAR_notifications') && !event.target.pare
Uncaught TypeError: Cannot read property 'className' of null
我使用的函数
if (!event.target.className.includes('USERBAR_notifications') && !event.target.parentElement.className.includes('USERBAR_notifications') && !event.target.className.includes('USERBAR_user') && !event.target.parentElement.className.includes('USERBAR_user') && this.state.active !== '') {
this.setState({ active: ''});
}
在
之间添加event.target&&
(
和!event.target.className.includes('USERBAR\u notifications')
在(
和!event.target.className.includes('USERBAR\u notifications')之间添加event.target&
)
由于事件.target
和事件.target.parentElement
都可以为空/未定义,因此在尝试访问它们的任何属性之前,首先应检查它们是否为空:
if (event.target && event.target.parentElement &&
!event.target.className.includes('USERBAR_notifications') &&
!event.target.parentElement.className.includes('USERBAR_notifications') &&
!event.target.className.includes('USERBARa_user') &&
!event.target.parentElement.className.includes('USERBAR_user') &&
this.state.active !== '') {
this.setState({ active: ''});
}
由于
event.target
和event.target.parentElement
都可以为空/未定义,因此在尝试访问它们的任何属性之前,首先应检查它们是否为空:
if (event.target && event.target.parentElement &&
!event.target.className.includes('USERBAR_notifications') &&
!event.target.parentElement.className.includes('USERBAR_notifications') &&
!event.target.className.includes('USERBARa_user') &&
!event.target.parentElement.className.includes('USERBAR_user') &&
this.state.active !== '') {
this.setState({ active: ''});
}
在
中,单击侦听器事件。target
不能是未定义的
,但是如果捕获body
元素,event.target.parentElement
将是未定义的
。因此,您可以简单地检查是否捕获了body
if (event.target.tagName.toLowerCase == 'body' || !event.target.className.includes('USERBAR_notifications') && !event.target.parentElement.className.includes('USERBAR_notifications') && !event.target.className.includes('USERBAR_user') && !event.target.parentElement.className.includes('USERBAR_user') && this.state.active !== '') {
this.setState({ active: ''});
}
在中,单击侦听器事件。target
不能是未定义的
,但是如果捕获body
元素,event.target.parentElement
将是未定义的
。因此,您可以简单地检查是否捕获了body
if (event.target.tagName.toLowerCase == 'body' || !event.target.className.includes('USERBAR_notifications') && !event.target.parentElement.className.includes('USERBAR_notifications') && !event.target.className.includes('USERBAR_user') && !event.target.parentElement.className.includes('USERBAR_user') && this.state.active !== '') {
this.setState({ active: ''});
}
解决我的问题如下
if (this.state.active !== '' && !event.target.className.includes('USERBAR_notifications') && !event.target.className.includes('USERBAR_user') &&
(!event.target.parentElement || (!event.target.parentElement.className.includes('USERBAR_notifications') && !event.target.parentElement.className.includes('USERBAR_user'))))
{this.setState({ active: ''});}
解决我的问题如下
if (this.state.active !== '' && !event.target.className.includes('USERBAR_notifications') && !event.target.className.includes('USERBAR_user') &&
(!event.target.parentElement || (!event.target.parentElement.className.includes('USERBAR_notifications') && !event.target.parentElement.className.includes('USERBAR_user'))))
{this.setState({ active: ''});}
如果(event.target!=null&&event.target.parentElement!=null)将其全部包装在中,因为这可能是导致空引用的原因。如果(event.target!=null&&event.target.parentElement!=null)将其全部包装在中
,因为这可能是导致空引用的原因。因此,当我单击此处的正文时,它不会执行this.setState({active:'});
?如果是这样,我希望它在目标
或parentElement
包含类时调用它,如果不是默认的this.setState({active:'})
我不确定我是否理解您在这里的要求。请澄清,基本上是当用户单击除目标
或目标以外的任何其他对象时。对于提到的类,我需要调用this.setState({active:'})当使用您的解决方案并直接单击HTML
标记时,不会调用它,因为您首先要检查它是否有父项(而HTML
没有父项。因此只需在那里添加另一个if
)。您最初的问题是关于未定义的,在我的回答中,我解释了原因。解决了它,感谢您将我引导到正确的方向!因此,当我单击此处的正文时,它不会执行此.setState({active:'})如果是这样,我希望它在目标
或父元素
包含类时调用它,如果不是默认的this.setState({active:'})
我不确定我是否理解您在这里的要求。请澄清,基本上是当用户单击除目标
或目标以外的任何其他对象时。对于提到的类,我需要调用this.setState({active:'})当使用您的解决方案并直接单击HTML
标记时,不会调用它,因为您首先要检查它是否有父项(而HTML
没有父项。因此只需在那里添加另一个if
).您最初的问题是关于未定义的,在我的回答中,我解释了原因。解决了它,感谢您为我指明了正确的方向!