我发现了很多与我的问题相似的已回答问题,但所有这些问题实际上都是“未定义的”。就我而言,它存在。
我的代码按预期工作。基本上,它将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次?出于某种原因?)。
答案 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")