Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 04.11.2015, 09:31
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

1. не понимаю, в чем проблема
element.querySelectorAll('> *')

upd: ok, такой вариант не работает)
тогда http://stackoverflow.com/a/21126966/5215084
или как-то так
function getChildrenByTagName(root, tagName = '*') {
    let originRootId = root.id;
    let tempRootId = '___' + Date.now();
    root.id = tempRootId;
    let children = document.querySelectorAll(`#${tempRootId} > ${tagName}`);
    root.id = originRootId;
    return children;
}

2. я бы не стал "патчить" прототипы встроенных объектов
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 04.11.2015 в 10:01.
Ответить с цитированием
  #3 (permalink)  
Старый 04.11.2015, 10:02
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

nerv_,
а # в строке 5 ненужно?
Ответить с цитированием
  #4 (permalink)  
Старый 04.11.2015, 10:04
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

рони, уже добавил) Я проснулся недавно Это в рамках погрешности)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #5 (permalink)  
Старый 04.11.2015, 10:06
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

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

Сообщение от nerv_
2. я бы не стал "патчить" прототипы встроенных объектов
Почему? Из-за проблем в старых ишаках? Так на них давно пора забить. Или вся проблема в том, чтобы в будущих версиях API могут быть использованы точно такие же названия методов, что и свои?

Лично я накатал небольшую либу под себя, несколько новых методов в прототипы Element и NodeList встроил, например: prependChild, appendChildAt, wrapElement. Пока всё устраивает, косяков нигде нет. Или есть какие-то другие подводные камни?
Ответить с цитированием
  #7 (permalink)  
Старый 06.11.2015, 13:23
Аспирант
Посмотреть профиль Найти все сообщения от loljs
 
Регистрация: 06.11.2015
Сообщений: 68

А for in не подходит чтоли?
Ответить с цитированием
  #8 (permalink)  
Старый 06.11.2015, 13:39
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

loljs, причём тут for..in?
Ответить с цитированием
  #9 (permalink)  
Старый 06.11.2015, 13:41
Аспирант
Посмотреть профиль Найти все сообщения от loljs
 
Регистрация: 06.11.2015
Сообщений: 68

А, прошу прощения, я че-то не въехал, я подумал про ключи. Ты про потомков в DOM говоришь. Все понял. Вообще, это фейковые объекты, они не патчатся нормально, ЕМНИП.

Последний раз редактировалось loljs, 06.11.2015 в 13:47.
Ответить с цитированием
  #10 (permalink)  
Старый 06.11.2015, 14:13
Аспирант
Посмотреть профиль Найти все сообщения от loljs
 
Регистрация: 06.11.2015
Сообщений: 68

Только я че то не въезжаю, зачем ты эти все рандомы и прочее там городишь? Почему так нельзя?
Element.prototype.getChilds = function(tagName) {
   return this.querySelectorAll(tagName)
}
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
initComponent: Как получить данные родителя и как получить store для вызова load()? Пролетарий ExtJS 76 04.07.2015 09:22
jquery получить родителя и обратится к элементу внутри по class _Eldar_ Общие вопросы Javascript 6 05.04.2015 19:32
Получить все точки отрезка прямой? Gozar Оффтопик 84 29.12.2014 16:18
Получить координаты курсора в текстовом поле в пикселях prike Events/DOM/Window 4 23.05.2013 04:35
.hide() для всех потомков и их потомков sholkyman jQuery 1 15.06.2011 12:45