Javascript 重写以使其不';当找不到类时,不会触发错误

Javascript 重写以使其不';当找不到类时,不会触发错误,javascript,Javascript,我目前正在使用以下功能,当用户单击某个地方以确定是否隐藏下拉列表时(在react中)。一切正常,但当我点击主体时,它会记录以下内容 我试着重写了几次,但我找不到解决这个问题的方法 Uncaught TypeError: Cannot read property 'className' of null 我使用的函数 if (!event.target.className.includes('USERBAR_notifications') && !event.target.pare

我目前正在使用以下功能,当用户单击某个地方以确定是否隐藏下拉列表时(在react中)。一切正常,但当我点击主体时,它会记录以下内容

我试着重写了几次,但我找不到解决这个问题的方法

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
).您最初的问题是关于
未定义的
,在我的回答中,我解释了原因。解决了它,感谢您为我指明了正确的方向!