开发者问题收集

未捕获的类型错误:无法读取未定义的属性“parentElement”

2019-06-20
9015

我发现很多已回答的问题与我的问题类似,但所有这些问题中的元素实际上都是“未定义的”。就我而言,它存在。

我的代码按预期工作。基本上,它将事件侦听器添加到所有作为锚点的模式关闭按钮。关闭函数是找到最外层的模式 div 并为其赋予“隐藏”类,将其显示设置为无。

它正确关闭了模式,但在模式关闭后,该错误出现。

const bookBTN =             document.getElementById('bookBTN');
const apptModalStart =      document.getElementById('appt-start');
const apptModalEnd =        document.getElementById('appt-end');
const apptStartContent =    apptModalStart.querySelector('.appt-content');
const apptEndContent =      apptModalEnd.querySelector('.appt-content');
const modalCloseBTNs =      document.querySelectorAll('.modal-dismiss');

for(let i = 0; i < modalCloseBTNs.length; i++) {
    modalCloseBTNs[i].addEventListener('click', function(e) {
        closeAppointmentWindow(modalCloseBTNs[i]);
    })
}

const closeAppointmentWindow = (btn) => {
    let parent = getClosestParentByClass(btn, "appt-modal");  // Line 52
    parent.classList.add('faded');
    if(parent === apptModalStart) showBTN(bookBTN);
    setTimeout(function() {
        parent.classList.add('hidden');
    }, 300);
}

const getClosestParentByClass = (e, parentClass) => {
    let parent = e.parentElement;  // Line 61
    if(e.parentElement.classList.contains(parentClass)) return parent;
    else return getClosestParentByClass(parent, parentClass);
}

appointments.js:61 Uncaught TypeError: Cannot read property 'parentElement' of undefined

at getClosestParentByClass (appointments.js:61)

at closeAppointmentWindow (appointments.js:52)

at HTMLDivElement. (appointments.js:30)

请告诉我为什么会出现该错误。

编辑:我已经在循环中拥有 console.log(modalCloseBTNs)、console.log(modalCloseBTNs[i]),在每个函数中分别拥有 console.log(e) 和 console.log(btn),并且它们都已定义。除了 btn 和 e,它们每个显示 2 个版本,一个是在函数完成后立即定义的,第二个版本(这暗示它运行了 2 次???由于某种原因)未定义。

1个回答

您将在链中遇到没有父元素的元素,您假设它始终会有一个

const getClosestParentByClass = (e, parentClass) => {
  let parent = e.parentElement;  // Line 61
  if(!parent) return null;
  else if(e.parentElement.classList.contains(parentClass)) return parent;
  else return getClosestParentByClass(parent, parentClass);
}

最后,您将重新发明 closest()

const elem = btn.closest(".appt-modal")
epascarello
2019-06-20