mirror of
https://ghproxy.net/https://github.com/elementor/one-click-accessibility.git
synced 2026-07-21 12:16:59 +08:00
52 lines
1.3 KiB
JavaScript
52 lines
1.3 KiB
JavaScript
export const getElementContext = (currentEl) => {
|
|
const headingSelector = 'h1, h2, h3, h4, h5, h6';
|
|
const context = {
|
|
previousSiblings: [],
|
|
parentElements: [],
|
|
sectionHeadings: [],
|
|
};
|
|
|
|
// Find headings among previous sibling elements
|
|
let sibling = currentEl.previousElementSibling;
|
|
while (sibling) {
|
|
if (sibling.matches(headingSelector)) {
|
|
context.previousSiblings.push({
|
|
outerHTML: sibling.outerHTML,
|
|
outerText: sibling.outerText,
|
|
});
|
|
}
|
|
sibling = sibling.previousElementSibling;
|
|
}
|
|
|
|
// Traverse up the DOM tree to find headings in ancestor elements
|
|
let ancestor = currentEl;
|
|
while (ancestor) {
|
|
// Check if this ancestor element itself is a heading
|
|
if (ancestor.matches(headingSelector)) {
|
|
context.parentElements.push({
|
|
outerHTML: ancestor.outerHTML,
|
|
outerText: ancestor.outerText,
|
|
});
|
|
}
|
|
|
|
// Find section headers that are direct children of this ancestor
|
|
const scopedHeadingSelector = headingSelector
|
|
.split(',')
|
|
.map((sel) => `:scope > ${sel.trim()}`)
|
|
.join(', ');
|
|
const sectionHeaders = ancestor.querySelectorAll(scopedHeadingSelector);
|
|
|
|
sectionHeaders?.forEach((sectionHeader) => {
|
|
if (sectionHeader) {
|
|
context.sectionHeadings.push({
|
|
outerHTML: sectionHeader.outerHTML,
|
|
outerText: sectionHeader.outerText,
|
|
});
|
|
}
|
|
});
|
|
|
|
ancestor = ancestor.parentElement;
|
|
}
|
|
|
|
return context;
|
|
};
|