#javascript #dom
#javascript #dom
Вопрос:
Я читаю все элементы списка (необработанный HTML) с веб-страницы, сортирую их и теперь хочу повторно перечислить их в новом порядке. Я обнаружил, что атрибут outerHTML, по-видимому, не может быть установлен после использования createElement, и я думаю, что это недокументированное ограничение. В итоге я получаю пустые элементы списка (поэтому в настоящее время я использую innerHTML и удаляю встроенные li и /li). Ниже приведен простой неудачный пример. Мысли?
const myList = document.querySelector("#ulist"); // the ID of an unordered list
let newHTML = document.createElement("li"); // have to start with something …
// newHTML.innerHTML = "This is the contents of the LI..."; // THIS WORKS!
newHTML.outerHTML = "<li>This is a new LI</li>"; // THIS DOES NOTHING!
myList.appendChild(newHTML);
<ul id="ulist">
</ul>
Комментарии:
1. developer.mozilla.org/en-US/docs/Web/API/Element/outerHTML «Если элемент не имеет родительского элемента, установка его свойства outerHTML не изменит его или его потомков. Многие браузеры также выдают исключение. »
2. Вы должны установить родительский
newHTML
элемент элемента, прежде чем сможете установить егоouterHTML
.3. В этом случае имеет смысл установить innerHTML существующего элемента. В конце концов, если вы его создаете, используйте его. В противном случае вы делаете это без причины.
4. Таплер, спасибо; но чтобы уточнить, у меня уже есть полный список элементов HTML, который включает класс, поэтому было бы проще использовать его как есть. Тако, с объяснением вашего и Таплера, я думаю, это просто не сработает для меня, потому что у меня нет ничего, кроме элементов списка, и мне не нужен родитель. Если вы можете придумать, как я могу «исправить» это, пожалуйста, приведите пример; в противном случае, спасибо в любом случае!
5. @FredB — это не имеет смысла. Вы добавляете li к его родительскому элементу в последней строке вашего js-кода. Просто переместите его в перед назначением outerHTML. Но на самом деле думаю, что вам все равно лучше использовать
insertAdjacentHTML
onmyList
.
Ответ №1:
Как указал @Alohci в комментариях; вместо этого используйте insertAdjacentHTML(). Смежный означает близкий, близкий к, предшествующий или следующий. А с помощью insertAdjacentHTML() вы указываете, куда вы хотите вставить HTML-код по отношению к существующему контенту.
Пример использования:
const myList = document.querySelector("#ulist");
myList.insertAdjacentHTML("beforeend", "<li>This is a new LI</li>");
<ul id="ulist"></ul>
Полезная визуализация значений положения из MDN:
<!-- beforebegin -->
<p>
<!-- afterbegin -->
foo
<!-- beforeend -->
</p>
<!-- afterend -->