Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получить список родительских элементов (https://javascript.ru/forum/misc/10121-poluchit-spisok-roditelskikh-ehlementov.html)

exec 20.06.2010 10:10

Получить список родительских элементов
 
Нужно написать функцию getParents, которая будет возвращать список всех родительских элементов и при надобности фильтровать их таким образом:

Element.getParents(function (a) {
	return a.className == 'myClass'; // Выбираем только элементы с классом myClass
});


Вот код функции:

Object.prototype.getParents = function (exception) {
	var tmp = [], r = (this instanceof Array ? this[0] : this).parentNode;
	while(r.parentNode) {
		tmp.push(r),
		r = r.parentNode;
	}
	if (exception) {
		var x = [];
		for (var i = 0; i < tmp.length; i++) {
			if (exception(tmp[i])) {
				x.push(tmp[i]);
			}
		}
		tmp = x;
	}
	return tmp;
};


При попытке отфильтровать возвращает пустой массив, почему?

Gvozd 20.06.2010 10:32

все работает. может у вас на элементах навешано более одного класса, и поэтому они не попадают в итоговый массив?
<html>
<head>
<script type="text/javascript">
window.onload=function(){
Object.prototype.getParents = function (exception) {
	var tmp = [], r = (this instanceof Array ? this[0] : this).parentNode;
	while(r.parentNode) {
		tmp.push(r),
		r = r.parentNode;
	}
	if (exception) {
		var x = [];
		for (var i = 0; i < tmp.length; i++) {
			if (exception(tmp[i])) {
				x.push(tmp[i]);
			}
		}
		tmp = x;
	}
	return tmp;
};
var q=document.getElementById('q').getParents(function (a) { 
    return a.tagName == 'BODY'; // Выбираем только элементы с классом myClass 
});
alert(q);
}
</script>
</head>
<body>
<div id="q" ></div>


</body>
</html>

exec 20.06.2010 10:44

Ну класс я для примера привёл. Вся проблема оказалась в том, что я прописывал tagName в нижнем регистре. Спасибо за наводку.

Gvozd 20.06.2010 11:00

значит внимательней следите за ф-цией фильтраци.
выводиде в консоль фаербага, сопутсвующие условия, и смотрите что не так


Часовой пояс GMT +3, время: 15:56.