Что-то не так с добавлением HTML-элемента как прямого потомка document.documentElement? - PullRequest
0 голосов
/ 05 января 2019

Я пишу расширение chrome, часть функциональности которого требует от меня скрывать каждый элемент html время от времени, за исключением одного div, который я создал. (Я скрываю все и добавляю div к текущему веб-сайту в javascript). Так как установка document.body.style.display = "none" не позволит увидеть ни одного из дочерних элементов тела, мне нужно добавить дочернего элемента, которого я хочу быть увиденным где-то еще. (Я также пытался использовать style.visibility, но по какой-то причине он не скрывал определенные элементы / фоны HTML на определенных страницах.) Мое исправление заключается в добавлении div в document.documentElement, за пределами document.body. Это исправление на самом деле работает отлично, но кажется странным. Что-то не так с добавлением нового дочернего элемента? Я делаю что-то неправильно?

РЕДАКТИРОВАТЬ: В нескольких ответах использовались дочерние элементы document.body, поэтому я подумал, что должен отметить, что мой код должен выполняться в document_start, и хотя я ожидаю загрузки document.body перед выполнением, я не могу ждать для всех своих детей, чтобы загрузить. Следовательно, я не могу использовать / хранить дочерние элементы document.body. Кроме того, я благодарен за все ответы, предлагающие альтернативные решения, они весьма полезны. Но из любопытства кто-нибудь знает, если что-то не так с тем, что я сейчас делаю? Почему это работает, если так?

Ответы [ 4 ]

0 голосов
/ 06 января 2019

Прекрасно добавлять элементы или текстовые узлы непосредственно к document.documentElement.
DOM - это не HTML, у него есть своя спецификация, которая - будучи объектной моделью - естественно вполне допустима:

  1. document.documentElement является элементом [ spec ]:

    Элементом документа является элемент , родительским элементом которого является этот документ, если он существует, и ноль в противном случае.

  2. Элементам разрешено иметь этих детей [ spec ]:

    Ноль или более узлов, каждый из которых - это Элемент, Текст, Обработка, Инструкция или Комментарий.

0 голосов
/ 05 января 2019

Спецификация W3C Структура HTML-документа гласит, что она состоит из элементов <head> и <body>, а <body> содержит контент, предназначенный для визуализации. Ничего не сказано об элементах вне этих двух элементов.

Если кажется, что это работает, возможно, это просто случайность реализации - например, многие реализации прощают такие вещи, как искаженный HTML.

0 голосов
/ 05 января 2019

Создайте новый DIV, чтобы держать детей тела, и скройте это.

var saveDiv = document.createElement("DIV");
saveDiv.id = "saveDiv";
saveDiv.style.display = "none";
Array.from(document.body.children).forEach(el => saveDiv.appendChild(el));
document.body.appendChild(saveDiv);
0 голосов
/ 05 января 2019

Потенциальное решение:

const body = document.querySelector('body');
body.innerHTML = `<div class="my-div"></div><div class="content">${body.innerHTML}</div>`;

Теперь у вас есть все содержимое тела рядом с вашим div, оба из которых вы можете скрыть / показать. Как указано ниже, я полностью разнесен, что это уничтожит ваших слушателей. Если вы хотите сохранить слушателей, попробуйте следующее:

const body = document.querySelector('body');
const fragment = document.createDocumentFragment();
const hideBody = () => {
  for (let el of [...body.children]) (fragment.append(el))
}
const showBody = () => {
  for (let el of [...fragment.children]) (body.append(el))
}

Прикрепите соответствующий к вашему событию. Это сохранит всех ваших слушателей. Если вам нужна какая-либо функциональность, DocumentFragment имеет методы querySelector() и querySelectorAll().

Другим методом является модальный метод, где у вас просто есть div, который покрывает всю страницу. Посмотрите, например, модальные Bootstrap . Если вы инициализируете его с помощью data-backdrop="static" и data-keyboard="false", оно не исчезнет, ​​если щелкнуть снаружи или нажать esc . Элемент может быть выбран с помощью document.querySelector('.modal-backdrop'). Установите непрозрачность на 1, а фон - на белый или на любой другой эстетический вид.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...