Вот рекурсивный подход (демо enter link description here)
function searchButtonByText(element, text) {
var match;
if(element['title'] && element['title'] === text) {
return element;
} else {
for(var i = 0; i < element.children.length; i++) {
match = searchButtonByText(element.children[i], text);
if(match) {
break;
}
}
return match;
}
}
Со следующим HTML:
<ul id='Group'>
<li><button title='One'>One</button></li>
<li><button title='Two'>Two</button></li>
<li>
<ul>
<li><button title='A'>A</button></li>
<li><button title='B'>B</button></li>
<li><button title='C'>C</button></li>
</ul>
</li>
<li><button title='Three'>Three</button></li>
</ul>
Тогда вы можете вызвать его так:
console.log(searchButtonByText(document.getElementById('Group'), 'Two'));
Он начинается любой произвольный узел, а затем просматривает каждый дочерний элемент до тех пор, пока не найдет совпадение (независимо от того, повторно). Или вы можете обобщить это еще дальше и сделать тест на обратный вызов, как это (demo):
function searchByFunction(element, matcher) {
var match;
if (matcher(element)) {
return element;
} else {
for (var i = 0; i < element.children.length; i++) {
match = searchByFunction(element.children[i], matcher);
if (match) {
break;
}
}
return match;
}
}
Тогда вам просто нужно передать функцию, которая возвращает истинное или ложное значение, основанное на какой-либо логики для Вас Завещание, как это :
console.log(searchByFunction(document.getElementById('Group'), function(element) {
return element['title'] && element['title'] === 'C';
}));
Наконец обратиться требование работы с множеством элементов (которые каждый из них может иметь детей) здесь является осуществимым решением (demo):
function searchByFunction(element, matcher) {
var match,
i;
if(element.length) {
for (i = 0; i < element.length; i++) {
match = searchByFunction(element[i], matcher);
if (match) {
break;
}
}
} else {
if (matcher(element)) {
return element;
} else {
if(element.children) {
for (i = 0; i < element.children.length; i++) {
match = searchByFunction(element.children[i], matcher);
if (match) {
break;
}
}
}
}
}
return match;
};
Наряду с вспомогательной функцией, чтобы генерировать соответствующие функции:
function buildTitleMatcher(title) {
return function(element) {
return element['title'] && element['title'] === title;
};
};
Вы можете использовать его с одним элементом, как это:
console.log(searchByFunction(document.getElementById('Group'), buildTitleMatcher('C')));
Или с массивом элементов, как это:
console.log(searchByFunction(document.getElementsByTagName('li'), buildTitleMatcher('B')));
'if (child.tite == text) {' возможно название ??? –
@ JordiCastilla действительно хорошая добыча! –
Если 'tite' был в этом случае, то как консоль регистрировала' true'? – Lepanto