Есть insertBefore()
в JavaScript, но как я могу вставить элемент после другого элемента без использования jQuery или другой библиотеки?
javascript
dom
insert
append
Ха Ли
источник
источник
Ответы:
Где
referenceNode
находится узел, который вы хотите разместитьnewNode
после. ЕслиreferenceNode
это последний дочерний элемент в его родительском элементе, это нормально, потому чтоreferenceNode.nextSibling
будетnull
иinsertBefore
обрабатывать этот случай, добавляя в конец списка.Так:
Вы можете проверить это, используя следующий фрагмент:
источник
insertBefore()
работает с текстовыми узлами. Почему ты хочешьinsertAfter()
быть другим? Вы должны создать отдельную пару названных функцийinsertBeforeElement()
иinsertAfterElement()
для этого.Простой JavaScript будет следующим:
Добавить до:
Добавить после:
Но, бросить некоторые прототипы там для удобства использования
Создав следующие прототипы, вы сможете вызывать эти функции непосредственно из вновь созданных элементов.
newElement.appendBefore(element);
newElement.appendAfter(element);
.appendBefore (element) Prototype
.appendAfter (element) Прототип
И, чтобы увидеть все в действии, запустите следующий фрагмент кода
Показать фрагмент кода
Запустите его на JSFiddle
источник
existingElement.appendAfter(newElement);
. Посмотрите, что я имею в виду в этом обновленном jsfiddle .insertAdjacentHTML
+outerHTML
расквитаться:
insertBefore
(безубыточность, если имя переменной существующего узла составляет 3 символа)Недостатки:
outerHTML
преобразует элемент в строку. Нам это нужно, потому чтоinsertAdjacentHTML
добавляет контент из строк, а не элементов.источник
.insertAdjacentElement()
Быстрый поиск в Google показывает этот скрипт
источник
targetElement.nextSibling
вернетсяnull
. Когдаnode.insertBefore
вызывается соnull
вторым аргументом, он добавляет узел в конец коллекции. Другими словами,if(parent.lastchild == targetElement) {
ветвление является излишним, потому чтоparent.insertBefore(newElement, targetElement.nextSibling);
будет правильно обрабатывать все случаи, даже если поначалу может показаться иначе. Многие уже отмечали это в других комментариях.Хотя
insertBefore()
(см. MDN ) это здорово и на него ссылаются большинство ответов здесь. Для дополнительной гибкости и, чтобы быть немного более явным, вы можете использовать:insertAdjacentElement()
(см. MDN ) Это позволяет вам ссылаться на любой элемент и вставлять перемещаемый элемент именно туда, куда вы хотите:Другие варианты для аналогичных случаев использования:
insertAdjacentHTML()
иinsertAdjacentText()
Ссылки:
https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentElement https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML https: // developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentText
источник
Метод
node.after
( doc ) вставляет узел после другого узла.Для двух узлов DOM
node1
иnode2
,node1.after(node2)
вставкиnode2
послеnode1
.Этот метод недоступен в старых браузерах, поэтому обычно требуется полифилл.
источник
Решение 2018 года (плохая практика, переход к 2020 году)
Я знаю, что этот вопрос является древним, но для любых будущих пользователей, вот модифицированный прототип, это просто микро-заполнение для функции .insertAfter, которой не существует. Этот прототип напрямую добавляет новую функцию
baseElement.insertAfter(element);
в прототип Element:После того, как вы поместили полифил в библиотеку, гист, или просто в свой код (или в любое другое место, где на него можно ссылаться), просто напишите
document.getElementById('foo').insertAfter(document.createElement('bar'));
Решение 2019 года (уродливо, перейти к 2020 году)
Новое редактирование: вы не должны использовать прототипы. Они перезаписывают кодовую базу по умолчанию и не очень эффективны или безопасны и могут вызвать ошибки совместимости, но если это некоммерческие проекты, это не имеет значения. если вы хотите безопасную функцию для коммерческого использования, просто используйте функцию по умолчанию. это не красиво, но это работает:
Решение 2020
Текущие веб-стандарты для ChildNode: https://developer.mozilla.org/en-US/docs/Web/API/ChildNode
В настоящее время в стандартах жизни и является безопасным.
Для неподдерживаемых браузеров используйте этот Polyfill: https://github.com/seznam/JAK/blob/master/lib/polyfills/childNode.js
Кто-то упомянул, что Polyfill использует Protos, когда я сказал, что это плохая практика. Они, особенно когда они используются неправильно, как мое решение для 2018. Тем не менее, этот polyfill находится в Документации MDN и использует своего рода инициализацию и выполнение, которые более безопасны. Кроме того, это для поддержки старых браузеров, в те времена, когда Prototype Overwriting была не так уж и плоха.
Как использовать решение 2020:
источник
Или вы можете просто сделать:
источник
источник
Метод insertBefore () используется как
parentNode.insertBefore()
. Чтобы имитировать это и создать метод,parentNode.insertAfter()
мы можем написать следующий код.JavaScript
HTML
Обратите внимание, что расширение DOM может оказаться не лучшим решением для вас, как указано в этой статье .
Однако эта статья была написана в 2010 году, и сейчас все может быть иначе. Так что решайте сами.
JavaScript DOM метод insertAfter () @ jsfiddle.net
источник
В идеале
insertAfter
должно работать аналогично insertBefore . Код ниже будет выполнять следующее:Node
добавляется новоеNode
,Node
добавляется новоеNode
после ссылки нетNode
,Node
добавляется новыйNode
имеет родного брата после, то новыйNode
вставляется перед этим родным братомNode
простирающийся
Node
Один общий пример
См код работает
Показать фрагмент кода
источник
Я знаю, что на этот вопрос уже слишком много ответов, но ни один из них не отвечал моим точным требованиям.
Я хотел, чтобы функция имела совершенно противоположное поведение
parentNode.insertBefore
- то есть она должна принимать нольreferenceNode
(а принятый ответ - нет), и кудаinsertBefore
бы вставлять в конце дочерние элементы, этот должен вставлять в начале , так как в противном случае не было никакой возможности вставить в начальное местоположение с этой функцией вообще; та же самая причинаinsertBefore
вставляет в конце.Поскольку для нуля
referenceNode
требуется, чтобы вы нашли родителя, нам нужно знать, что родитель -insertBefore
это методparentNode
, поэтому он имеет доступ к родителю таким образом; наша функция этого не делает, поэтому нам нужно передать родителя в качестве параметра.Результирующая функция выглядит так:
Или (если вам нужно, я не рекомендую это) вы, конечно, можете улучшить
Node
прототип:источник
Этот код работает для вставки элемента ссылки сразу после последнего существующего дочернего элемента для встраивания небольшого файла CSS
источник
Вы можете использовать
appendChild
функцию для вставки после элемента.Ссылка: http://www.w3schools.com/jsref/met_node_appendchild.asp
источник
надежная реализация insertAfter.
};
источник
Давайте разберемся со всеми сценариями
источник
источник
На самом деле вы можете вызвать метод
after()
в более новых версиях Chrome, Firefox и Opera. Недостатком этого метода является то, что Internet Explorer пока не поддерживает его.Пример:
Простой HTML-код для тестирования:
Как и ожидалось, он перемещает элемент вверх после элемента вниз
источник