Показать сообщение отдельно
  #1 (permalink)  
Старый 04.11.2015, 03:51
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Получить прямых потомков в NodeList
Пытаюсь написать метод, с помощью которого можно будет получить прямых потомков по имени тэга.
Всех потомков найти не проблема, а проблема как раз таки в NodeList - в JavaScript нельзя создавать свой NodeList/HTMLCollection.

Пока вот до чего додумался:

Element.prototype.getChilds = function(tagName) {
	var childs = this.children,
		nodeList = null;
	if(!tagName || tagName == '*') {
		nodeList = childs;
	}
	else {
		var l = childs.length;
		if(l) {
			var i, tempID = 't' + Math.floor(Math.random() * 9E10).toString(32);
			for(i = 0; i < l; i++) {
				if(childs[i].tagName == tagName.toUpperCase()) {
					childs[i].setAttribute(tempID, '');
				}
			}
			nodeList = document.querySelectorAll('[' + tempID + ']');
			if(nodeList) {
				nodeList.each(Element.prototype.removeAttribute.bind(nodeList, tempID));
				/*nodeList.each(function() {
					this.removeAttribute(tempID);
				});*/
			}
		}
	}
}


В принципе, всё работает как нужно. Но может у кого-нибудь есть идеи более элегантного решения задачи? А то мало ли, вдруг что-то упустил.

Для тех, кто не понял: мне нужно получить NodeList/HTMLCollection элементов, а не массив.

_________________

Пока писал пост, придумал такое решение
Element.prototype.getChilds = function(tagName) {
	var childs = this.children, nodeList,
		tempID = 't' + Math.floor(Math.random() * 9E10).toString(32);
	this.setAttribute(tempID, '');
	nodeList = this.parentNode.querySelectorAll('[' + tempID + '] > ' + (tagName || '*'));
	this.removeAttribute(tempID);
	return nodeList;
}

Последний раз редактировалось ruslan_mart, 04.11.2015 в 04:04.
Ответить с цитированием