javascript - 如何自动检测 DOM 中的元素以填充 const 数组?
问题描述
我已经编写了一个几乎可以独立运行的脚本,但问题是如果我向页面添加另一个模式,我需要进入我的脚本添加一个条目以使其被它识别。我想知道是否有办法让脚本自动检测页面上模态的数量,并在我的 const 中自动为它们分配适当的值,然后按照脚本的指示在它们上运行函数。这是我的代码。
// Staff Modal Element Arrays
const modalClose = document.querySelectorAll('.modal-close');
const modalButton = document.querySelectorAll('.staff-modal-button p')
const modalMain = document.querySelectorAll('.staff-modal')
// Staff Modal Combined Definition Array
const staffModal = {one: {button: modalButton[0], modal: modalMain[0] , close: modalClose[0]},
two: {button: modalButton[1], modal: modalMain[1], close: modalClose[1]},
three: {button: modalButton[2], modal: modalMain[2], close: modalClose[2]},
four: {button: modalButton[3], modal: modalMain[3], close: modalClose[3]},
five: {button: modalButton[4], modal: modalMain[4], close: modalClose[4]},
six: {button: modalButton[5], modal: modalMain[5], close: modalClose[5]},
seven: {button: modalButton[6], modal: modalMain[6], close: modalClose[6]}}
// Function to Define Modal Actions
function modalFunction(staffNumber) {
const modalOpen = staffNumber.button;
const modal = staffNumber.modal;
const modalExit = staffNumber.close;
modalOpen.addEventListener('click', function() {
modal.style.display='flex';
})
modalExit.addEventListener('click', function() {
modal.style.display='none';
})
modal.addEventListener('click', function(e) {
if (e.target == modal) {
modal.style.display='none'
}
})
}
// Calling Functions for Each Staff Modal in Array
for (i in staffModal) {
modalFunction(staffModal[i]);
}
解决方案
您已经使用 选择了所有模式document.querySelectorAll('.staff-modal')
。无需手动编写staffModal
对象,只需遍历您选择的所有内容:
for (let i = 0; i < modalMain.length; i++) {
modalFunction({button: modalButton[i], modal: modalMain[i] , close: modalClose[i]});
}
此外,我不会从所有模态中选择所有元素并假设它们的顺序相同。我不确定是否真的存在一些奇怪的情况,但最好只选择父模式和随后的子模式。像这样:
const modalMain = document.querySelectorAll('.staff-modal');
function modalFunction(modal) {
const modalOpen = modal.querySelector('.staff-modal-button p');
const modalExit = modal.querySelector('.modal-close');
modalOpen.addEventListener('click', function() {
modal.style.display='flex';
})
modalExit.addEventListener('click', function() {
modal.style.display='none';
})
modal.addEventListener('click', function(e) {
if (e.target == modal) {
modal.style.display='none'
}
})
}
for (let i = 0; i < modalMain.length; i++) {
modalFunction(modalMain[i]);
}