【问题标题】:Javascript - Uncaught TypeError: Cannot read property 'classList' of nullJavascript - 未捕获的类型错误:无法读取 null 的属性“classList”
【发布时间】:2017-02-23 11:28:35
【问题描述】:

如何检查我点击的元素是否有类列表?

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

当我单击的元素没有附加类时,我的代码在此行出错。

这完全有道理。

但是,如果 nextElementSibling 具有类 form__select-dropdown,我只想运行以下代码:

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

所以我需要在执行条件以避免错误之前检查 target.nextElementSibling.classList 是否存在,但我不确定如何执行此操作?

【问题讨论】:

  • 先检查元素是否存在先...if (target.nextElementSibling)
  • 你也可以发布你的 html 和 js 处理程序。
  • 所有元素都有classList。检查元素是否为非空。
  • 是的,它确实返回 null

标签: javascript


【解决方案1】:

您的问题是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')
    }

【讨论】:

  • 嗯,这不仅避免了undefined,还避免了null0NaN、0-length ucs-2 字符串和false,它的回复更正确,如nullHTMLElement#nextElementSibling 的默认值。但无论如何......也许问题是一个事件正在触发一个元素的孩子
  • 我知道。有时简洁优先于具体。根据规范,许多 DOM 属性和方法只能返回 null(虚假)或 DOM 节点(真实),因此检查永远不会产生误报。不过,我可能应该更彻底地解释我的逻辑。
猜你喜欢
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 2020-03-25
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多