未捕获的TypeError:无法读取未定义的属性“ parentElement”

时间:2019-06-20 16:59:52

标签: javascript dom

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

我的代码按预期工作。基本上,它将eventListener添加到所有锚定模式关闭按钮。关闭功能是找到最外部的模式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未捕获的TypeError:无法读取属性   未定义的“ parentElement”

     

在getClosestParentByClass(appointments.js:61)

     

在closeAppointmentWindow(appointments.js:52)

     

在HTMLDivElement。 (appointments.js:30)

请给我一些见解,为什么它会给我这个错误。

编辑:我已经在循环中分别创建了console.log(modalCloseBTNs),console.log(modalCloseBTNs [i]),每个函数中的console.log(e)和console.log(btn),并且它们均已定义。除了btn和e之外,它们分别显示2个版本,其中一个定义为第二个,该函数在函数完成后立即显示第二个版本(这表明它运行2次?出于某种原因?)。

1 个答案:

答案 0 :(得分:0)

您将在没有父级的情况下碰到链中的某个元素,您假设它总是会有一个

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")