dom1n1k
@dom1n1k

Как преобразовать Element в NodeList?

Есть переменная-инстанс объекта Element, полученная (например, но не обязательно) через document.querySelector(...)
Нужно преобразовать её в NodeList из одного элемента.

Вопрос звучит просто, но я пока не нашел решения.
Тупо сконструировать пустой (или заполненный чем-то случайным) NodeList, а потом внаглую заменить 0-ой элемент на нужный не работает. Что в общем-то предсказуемо, да и некрасиво.

Вся выдача Гугла завалена баянистыми статьями про преобразование NodeList в Array.
  • Вопрос задан
  • 561 просмотр
Решения вопроса 1
@Sayonji
Задача непростая. Создать NodeList просто так нельзя, только браузер это умеет. А если ваш элемент в странице, то и вложить его в собстенный контейнер мы не можем, ибо можно что-нибудь сломать. Я бы наверное предложил такой грязный метод:
function wrap(element) {
  var parent = element.parentNode;
  var pos = Array.prototype.slice.call(parent.children).indexOf(element) + 1
  return parent.querySelectorAll(':scope > :nth-child(' + pos + ')')
}

Он полагается на наличие :scope, который есть не во всех браузерах. Альтернатива, которая меняет DOM, но зато будет работать на большем числе компьютеров:

function wrap(element) {
  var token = ('data-t' + Math.random()).replace('.', '-')
  element.setAttribute(token, 1)
  var list = element.parentNode.querySelectorAll('[' + token + ']')
  element.removeAttribute(token)
  return list
}


UPD:
Очевидно, оба метода полагаются на то, что у элемента есть родитель. Если его нет, то можно создать ему обертку и вернуть ее свойство children.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы