function hasClass(element, cls) { return element.classList.contains(cls) } function addMatch(matchedElements, node) { if (node.nodeType !== Node.TEXT_NODE) { if (matchedElements.includes(node) == false){ matchedElements.push(node) } } } function addNextElements(elements, matchedElements) { elements.map(function(index, item){ if (matchedElements.includes(item) == false){ matchSubElements(item, matchedElements, null) } }) } function checkItemIsHeader($item) { return $item.is(':header') //h1, h2, h3, etc } function matchSubElements(element, matchedElements, header, isHeader) { var $subElements = $(element.children) if (isHeader) { matchedElements.push($subElements[0]) } else { $subElements.map(function(index, item){ var itemIsHeader = checkItemIsHeader($(item)) ? true : false matchSubElements(item, matchedElements, header, itemIsHeader) }) } matchedElements.push(element) } function matchHeader(header, matchedElements) { matchSubElements(header, matchedElements, null, true) } function matchElement(header, matchedElements, regexp){ var directSibElement = $(header).nextUntil(header.tagName)[0] var $elements = [] if (directSibElement){ $elements = $(directSibElement.children) } if (header.textContent.match(regexp)){ matchHeader(header, matchedElements) if (directSibElement) {addMatch(matchedElements, directSibElement) } addNextElements($elements, matchedElements) } else { if (!!$elements.length) { for (var i = 0; i < $elements.length; i++){ if ($elements[i].textContent.match(regexp)){ matchSubElements($elements[i], matchedElements, header) addMatch(matchedElements, directSibElement) matchHeader(header, matchedElements) } } } } } document.addEventListener("DOMContentLoaded", function() { if (!document.querySelector('#ae-search-box')) { return; } document.querySelector("#ae-search-box").addEventListener("input", function(event) { var searchTerm = this.value var headers = Array.prototype.slice.call(document.querySelector('.js-anchorific-content').querySelectorAll("h2")) var regexp = new RegExp(searchTerm, "igm") var allElements = document.querySelector('.js-anchorific-content').querySelectorAll('*') var allElementsArray = Array.prototype.slice.call(allElements) var matchedElements = [] var unmatchedElements = [] for (var i = 0; i < headers.length; i++) { if (matchedElements.includes(headers[i]) == false){ matchElement(headers[i], matchedElements, regexp) } } unmatchedElements = allElementsArray.filter(function(element, index) { return matchedElements.indexOf(element) === -1 }) unmatchedElements.map(function(item, index) { item.style.display = "none" }) matchedElements.map(function(item, index) { item.style.display = "" }) }) })