Существует ли какая-либо конкретная c причина, которая подразумевает создание рекурсивной функции , кроме поддержки более старых браузеров, таких как IE6 и 7?
Если нет , вы можете просто использовать document.body.querySelectorAll('*')
для выбора каждого узла элемента в DOM, игнорируя те, которые находятся вне элемента body. Примером может быть:
window.addEventListener('load', function () {
var highlightButton = document.getElementById("highlight");
function search () {
document.body.querySelectorAll('*').forEach(function (el) {
var spanEl = document.createElement('span');
spanEl.innerHTML = el.tagName;
spanEl.className = 'hoverNode';
el.appendChild(spanEl);
});
}
highlightButton.addEventListener('click', search);
});
Если да , то вариант будет:
window.addEventListener('load', function () {
var highlightButton = document.getElementById("highlight");
// traverse downwards from rootEl while excluding Comment elements on IE6 7 & 8
function traverseDOMFrom (rootEl, iterator) {
if (!rootEl || rootEl.nodeType !== 1 || typeof iterator !== 'function') {
return;
}
if (rootEl.children && rootEl.children.length > 0) {
Array.prototype.slice.call(rootEl.children).forEach(function (el) {
traverseDOMFrom(el, iterator);
});
}
iterator(rootEl);
}
function search () {
traverseDOMFrom(document.body, function (el) {
var spanEl = document.createElement('span');
spanEl.innerHTML = el.tagName;
spanEl.className = 'hoverNode';
el.appendChild(spanEl);
});
}
highlightButton.addEventListener('click', search);
});
Обратите внимание, что в обоих случаях полифил для Array.prototype.forEach()
и для EventTarget.addEventListener()
понадобятся, если вы хотите поддерживать эти функции в IE6, 7 и 8! В противном случае вы также можете достичь тех же результатов, перебирая вместо этого массив элемента с пользовательским для l oop, так как для этого .addEventListener
можно использовать простой обработчик события .onload , если нет необходимости поддерживать несколько прослушивателей.