@SergeiB

Как определить, является ли элемент экземпляром объекта HTMLCollection?

Есть функция для преобразования коллекции в массив:
function selectAll(selector) {
  return Array.prototype.slice.call(document.querySelectorAll(selector));
}

Я хочу, чтобы в качестве аргумента она могла принимать как обычный css-селектор в виде строки (напр., ".my-element"), так и объект (напр., document.querySelectorAll(".my-element")).
В связи с этим возникает вопрос, как правильно прописать необходимые условия. Приемлем ли такой вариант?
function selectAll(element) {
  if (typeof element === 'string') {
    return Array.prototype.slice.call(document.querySelectorAll(element));
  } else if (element instanceof HTMLCollection) { // <--
    return Array.prototype.slice.call(element);
  } else {
    console.log('An invalid argument');
  }
}
  • Вопрос задан
  • 195 просмотров
Решения вопроса 1
potapchino
@potapchino
function selectAll(e) {
  if (typeof e === 'string') {
    e = document.querySelectorAll(e)
  } else if (!(e instanceof NodeList)) {
    return console.log('An invalid argument')
  }
  
  return Array.prototype.slice.call(e)
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@LemonFox
stateless mind
function isNodeList(nodes) {
    var stringRepr = Object.prototype.toString.call(nodes);

    return typeof nodes === 'object' &&
        /^\[object (HTMLCollection|NodeList|Object)\]$/.test(stringRepr) &&
        (typeof nodes.length === 'number') &&
        (nodes.length === 0 || (typeof nodes[0] === "object" && nodes[0].nodeType > 0));
}
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
querySelectorAll возвращает не HTMLCollection а NodeList.

function selectAll(arg1) {
  let result;
  if (typeof arg1 === 'string') {
    result = document.querySelectorAll(arg1)
  } else {
    result = Array.from(arg1)
  }
  return result
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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