2016-12-20 10 views
1

ユーザーがクリックしてドロップダウンを非表示にするかどうかを判断するときに、現在以下の機能を使用しています。すべて正常に動作しますが、本文をクリックすると次のように記録されます。クラスが見つからないときにエラーをトリガーしないように書き換えます。

私は数回書き直そうとしましたが、この問題を解決する方法が見つかりません。私は

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: ''}); 
     } 
+2

としての私の問題を解決しまし確認することができます'それは恐らくnull refを引き起こしているからです。 – Mackan

答えて

1

は、以下の

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: ''});} 
0

を使用

Uncaught TypeError: Cannot read property 'className' of null 

機能は(!event.target.className.includes('USERBAR_notifications')event.target &&を追加します。

3

event.targetevent.target.parentElementの両方が未定義/ nullにすることができますので、あなたはそれらのプロパティのいずれかのアクセスしようとする前に、まずあなたは彼らがnullでないかどうかを確認するために、それらの両方をチェックする必要があります:clickリスナーで

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: ''}); 
} 
+0

ここで本文をクリックすると 'this.setState({active: ''});'は実行されません。 'target'または' parentElement'のどちらかにクラスが含まれている場合には、this.setState({active: ''});にデフォルトでない場合は、それを呼び出すようにします。 – NealVDV

+0

私は何を理解しているのか分かりませんあなたはここで尋ねています。明確にしてください – Dekel

+0

申し訳ありませんが、基本的にユーザが 'target'または' target.parentElement'以外のものをクリックすると、 'this.setState({active: ''});'を呼び出す必要があります。あなたのソリューションを使用し、 'HTML'タグを直接クリックすると、親が最初にあるかどうかをチェックしているので(' HTML'にはありません。 – NealVDV

0

event.targetundefinedにはなりませんが、body要素をキャッチすると、event.target.parentElementundefinedになります。だから、単に `場合(event.target!= nullの&& event.target.parentElement!= null)の中でそれをすべてラップ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: ''}); 
} 
関連する問題