Получить прямых потомков в 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;
}
|
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_,
а # в строке 5 ненужно? |
рони, уже добавил) Я проснулся недавно :D Это в рамках погрешности)
|
nerv_,
ок! :) |
Цитата:
Лично я накатал небольшую либу под себя, несколько новых методов в прототипы Element и NodeList встроил, например: prependChild, appendChildAt, wrapElement. Пока всё устраивает, косяков нигде нет. :) Или есть какие-то другие подводные камни? |
А for in не подходит чтоли?
|
loljs, причём тут for..in?
|
А, прошу прощения, я че-то не въехал, я подумал про ключи. Ты про потомков в DOM говоришь. Все понял. Вообще, это фейковые объекты, они не патчатся нормально, ЕМНИП.
|
Только я че то не въезжаю, зачем ты эти все рандомы и прочее там городишь? Почему так нельзя?
Element.prototype.getChilds = function(tagName) {
return this.querySelectorAll(tagName)
}
|
| Часовой пояс GMT +3, время: 23:43. |