Я знаю, что на этот вопрос уже слишком много ответов, но ни один из них не отвечал моим точным требованиям.
Я хотел, чтобы функция имела абсолютно противоположное поведение parentNode.insertBefore
- то есть она должна принимать ноль referenceNode
(а принятый ответ - нет) и где insertBefore
будет вставлять в конец дочерних элементов, которые необходимо вставить в начало , так как в противном случае не было бы никакого способа вставить в начальное местоположение с этой функцией в все; по той же причине insertBefore
вставляет в конце.
Поскольку нулевое referenceNode
требует от вас найти родителя, нам нужно знать родителя - insertBefore
- это метод parentNode
, поэтому он имеет доступ к родителю таким образом; наша функция этого не делает, поэтому нам нужно передать родителя в качестве параметра.
Результирующая функция выглядит так:
function insertAfter(parentNode, newNode, referenceNode) {
parentNode.insertBefore(
newNode,
referenceNode ? referenceNode.nextSibling : parentNode.firstChild
);
}
Или (если вам нужно, я не рекомендую это) вы, конечно, можете улучшить прототип Node
:
if (! Node.prototype.insertAfter) {
Node.prototype.insertAfter = function(newNode, referenceNode) {
this.insertBefore(
newNode,
referenceNode ? referenceNode.nextSibling : this.firstChild
);
};
}