Удалить элементы из коллекции HTML на основе другой коллекции HTML

Я пытаюсь создать 3 коллекции HTML, содержащие все мои ссылки на странице, поэтому я могу прикрепить 3 отдельные функции к каждой категории ссылок. Моя первая коллекция HTML - это "ссылки на заголовки", вторая - "ссылки в нижнем колонтитуле", а третья - "все остальные ссылки". Мне нужно также прикрепить функции отслеживания ссылок и другие элементы.

Создать первые две коллекции довольно просто, поскольку я могу это сделать document.getElementById('header'); и document.getElementById ('нижний колонтитул'); а затем this.getElementsByTagName('a'); Однако получить третью коллекцию "всех других ссылок" немного сложнее. Не существует чистого div, который содержит только "середину" страницы, и есть ссылки вне заголовка и нижнего колонтитула, которые также трудно выделить. Я хотел бы сделать что-то вроде allLinks = document.linnks, а затем отфильтровать все ссылки, уже присутствующие в первой и второй коллекциях HTML.

Есть ли способ сделать это? В идеале я хотел бы избежать загрузки большего количества библиотек, и чистый JS будет приветствоваться

Спасибо!

1 ответ

Решение

Вы можете превратить списки узлов в массивы, а затем использовать filter() вытащить ссылки, которые уже есть в одном из других списков:

var hdr = document.getElementById('header');
var hlinks = arrayOf(hdr.getElementsByTagName('a'));

var ftr = document.getElementById('footer');
var flinks = arrayOf(ftr.getElementsByTagName('a'));

var others = arrayOf(document.getElementsByTagName('a')).
filter(
  function(element) {
    return (hlinks.indexOf(element) < 0) && (flinks.indexOf(element) < 0);
  }
);

function arrayOf(nodelist)
{
  var result = [];
  for ( var i = 0; i < nodelist.length; ++i )
    result.push(nodelist.item(i));

  return result;
}

Пример: http://codepen.io/paulroub/pen/ikebh

Если вам нужно поддерживать старые браузеры, в которых отсутствует Array.prototype.filter()включите код с этой страницы MDN, чтобы реализовать его при необходимости.

Другие вопросы по тегам