Вот реализация, основанная на реализации jQuery 1.12.4. Он использует getElementsByTagName, если доступно. Если нет, он использует querySelectorAll, если доступно. Если нет, он возвращается к рекурсивному обходу. jQuery 1.12.4 поддерживает более старые браузеры, такие как IE6, согласно самим .
function getElementsByTagName( node, tagName ) {
if (tagName == '*') {
tagName = undefined;
}
var merge = function( first, second ) {
var len = +second.length,
j = 0,
i = first.length;
while ( j < len ) {
first[ i++ ] = second[ j++ ];
}
// Support: IE<9
// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
if ( len !== len ) {
while ( second[ j ] !== undefined ) {
first[ i++ ] = second[ j++ ];
}
}
first.length = i;
return first;
},
nodeName = function( elem, name ) {
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
},
elems, elem,
i = 0,
context = node,
tag = tagName,
found = typeof context.getElementsByTagName !== "undefined" ?
context.getElementsByTagName( tag || "*" ) :
typeof context.querySelectorAll !== "undefined" ?
context.querySelectorAll( tag || "*" ) :
undefined;
if ( !found ) {
for ( found = [], elems = context.childNodes || context;
( elem = elems[ i ] ) != null;
i++
) {
if ( !tag || nodeName( elem, tag ) ) {
found.push( elem );
} else {
merge( found, getElementsByTagName( elem, tag ) );
}
}
}
return found;
/* return tag === undefined || tag && nodeName( context, tag ) ?
merge( [ context ], found ) :
found;*/
}
Я взял внутреннюю функцию getAll () из jQuery 1.12.4 и скопировал в две необходимые вспомогательные функции (jQuery.nodeName и jQuery.merge). Я также убедился, что вы можете вызывать его с "*" как tagName, добавив несколько строк в верхней части функции. Наконец, в конце функции я закомментировал некоторые функции, которые добавляют текущий узел к результату (если он совпадает) и просто возвращают найденные узлы.
Имейте в виду, что функция в некоторых случаях возвращает HTMLCollection, а в других случаях возвращает массив. Также имейте в виду, что когда «*» передается как тэг, вывод отличается в зависимости от браузера: Element.prototype.getElementsByTagName не возвращает TextNodes, но рекурсивный обход делает.
В качестве альтернативы вы можете использовать picoQuery . picoQuery - это реализация jQuery, где вы можете выбрать, какие методы вам нужны в онлайн-сборщике. в этом случае вам не нужны никакие методы, так как выбор является частью ядра, а сборка занимает всего 1 КБ. picoQuery написан для современных браузеров, но возвращается к jQuery 1.12.4 для старых браузеров.