После нескольких попыток жесткого кодирования рекурсивного метода getElementsByClassName, я остановился со следующим:Запрограммированное getElementsByClassName Рекурсивного (element.className против element.classList.contains)
var getElementsByClassName = function(className) {
var result = [];
function inspect(element) {
var children = element.children;
for(var i = 0; i < children.length; i++) {
if(children[i].classList.contains(className)) {
result.push(children[i]);
}
if(children[i].hasChildNodes) {
inspect(children[i]);
}
}
}
inspect(document);
return result;
};
Однако я не могу понять, почему это решение не работает, учитывая имя класса возвращает значение, которое мы можем испытать против:
var getElementsByClassName = function(className) {
var result = [];
function inspect(element) {
if (element.className === className) result.push(element);
var children = element.children;
for(var i = 0; i < children.length; i++) {
inspect(children[i]);
}
}
inspect(document);
return result;
};
Спасибо за помощь, заранее, и если у вас есть какие-либо другие предложения по улучшению моего кода, пожалуйста, дайте мне знать.
Что не работает? Что происходит вместо этого? Это как раз о 'classname' vs' classlist', или вы спрашиваете о разных структурах кода? – Bergi
FYI, '.hasChildNodes' не вызывается в инструкции' if'. Вместо этого вы оцениваете сама функция, которая всегда будет «истина», если она определена. –
Ваше второе решение отлично подходит для меня. Вероятно, было бы неплохо проверить, что «дети» действительно существуют. И, конечно, сравнение 'className' не будет выполнено, если есть несколько классов. –