2017-02-23 208 views
0

Как проверить, имеет ли элемент, на который я нажимаю, список классов?Javascript - Uncaught TypeError: Не удается прочитать свойство 'classList' из null

let dropdown = target.nextElementSibling.classList.contains('form__select-dropdown') 

Мой код является ошибкой в ​​этой строке, когда элемент, на который я нажимаю, не имеет класса, прикрепленного к нему.

Это имеет смысл.

Однако я только хочу код ниже, чтобы работать, если nextElementSibling имеет класс form__select-выпадающее меню:

 if (!selectTag && dropdown) { 
      target.querySelector('.form__select-dropdown').classList.remove('active') 
     } else { 
      target.nextElementSibling.classList.toggle('active') 
     } 

Так что мне нужно проверить, если target.nextElementSibling.classList существует, прежде чем я делаю свое состояние, чтобы избежать ошибка, но я не уверен, как это сделать?

+1

Первый чек, если элемент существует первый ... 'если (target.nextElementSibling)' – evolutionxbox

+0

вы можете также разместить свой HTML и JS обработчик слишком. –

+0

Все элементы имеют 'classList'. проверьте, не содержит ли элемент. –

ответ

2

Ваша проблема заключается в том, что target не всегда имеет nextElementSibling; вы должны проверить, есть ли это null, прежде чем продолжить.

let next = target.nextElementSibling 
let dropdown = next && next.classList.contains('form__select-dropdown') 

А в коде:

if (!selectTag && dropdown) { 
     target.querySelector('.form__select-dropdown').classList.remove('active') 
    } else { 
     next && next.classList.toggle('active') 
    } 
+0

Ну, это не только избегает 'undefined', но также' null', '0',' NaN', 0-length ucs-2 и 'false', который отвечает более корректно, так как' null' является значением по умолчанию для 'HTMLElement # nextElementSibling'. Но в любом случае ... может быть, проблема в том, что событие стреляет в детей одного элемента. – Hydro

+0

Я знаю. Иногда терпение имеет преимущество перед спецификой. Многие свойства и методы DOM по спецификации могут возвращать только «null» (фальшивый) или узел DOM (правдивый), поэтому проверка никогда не создает ложных срабатываний. Я, вероятно, должен был объяснить мою логику более тщательно. – gyre