The ChildNode.after()
method inserts a set of Node
or DOMString
objects in the children list of this ChildNode
's parent, just after this ChildNode
. DOMString
objects are inserted as equivalent Text
nodes.
Syntax
[Throws, Unscopable] void ChildNode.after((Node or DOMString)... nodes);
Parameters
Exceptions
HierarchyRequestError
: Node cannot be inserted at the specified point in the hierarchy.
Examples
Inserting an element
var parent = document.createElement("div"); var child = document.createElement("p"); parent.appendChild(child); var span = document.createElement("span"); child.after(span); console.log(parent.outerHTML); // "<div><p></p><span></span></div>"
Inserting text
var parent = document.createElement("div"); var child = document.createElement("p"); parent.appendChild(child); child.after("Text"); console.log(parent.outerHTML); // "<div><p></p>Text</div>"
Inserting an element and text
var parent = document.createElement("div"); var child = document.createElement("p"); parent.appendChild(child); var span = document.createElement("span"); child.after(span, "Text"); console.log(parent.outerHTML); // "<div><p></p><span></span>Text</div>"
ChildNode.after()
is unscopable
The after()
method is not scoped into the with
statement. See Symbol.unscopables
for more information.
with(node) { after("foo"); } // ReferenceError: after is not defined
Polyfill
You can polyfill the after()
method in Internet Explorer 9 and higher with the following code:
// from: https://github.com/jserz/js_piece/blob/master/DOM/ChildNode/after()/after().md (function (arr) { arr.forEach(function (item) { if (item.hasOwnProperty('after')) { return; } Object.defineProperty(item, 'after', { configurable: true, enumerable: true, writable: true, value: function after() { var argArr = Array.prototype.slice.call(arguments), docFrag = document.createDocumentFragment(); argArr.forEach(function (argItem) { var isNode = argItem instanceof Node; docFrag.appendChild(isNode ? argItem : document.createTextNode(String(argItem))); }); this.parentNode.insertBefore(docFrag, this.nextSibling); } }); }); })([Element.prototype, CharacterData.prototype, DocumentType.prototype]);
Another polyfill
// from: https://github.com/FabioVergani/js-Polyfill_Element.prototype.after/blob/master/after.js (function(x){ var o=x.prototype,p='after'; if(!o[p]){ o[p]=function(){ var e, m=arguments, l=m.length, i=0, t=this, p=t.parentNode, n=Node, s=String, d=document; if(p!==null){ while(i<l){ e=m[i]; if(e instanceof n){ t=t.nextSibling; if(t!==null){ p.insertBefore(e,t); }else{ p.appendChild(e); }; }else{ p.appendChild(d.createTextNode(s(e))); }; ++i; }; }; }; }; })(Element); /* minified: (function(x){ var o=x.prototype; o.after||(o.after=function(){var e,m=arguments,l=m.length,i=0,t=this,p=t.parentNode,n=Node,s=String,d=document;if(p!==null){while(i<l){((e=m[i]) instanceof n)?(((t=t.nextSibling )!==null)?p.insertBefore(e,t):p.appendChild(e)):p.appendChild(d.createTextNode(s(e)));++i;}}}); }(Element)); */
Specification
Specification | Status | Comment |
---|---|---|
DOM The definition of 'ChildNode.after()' in that specification. |
Living Standard | Initial definition. |
Browser compatibility
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
Desktop | Mobile | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
after | Chrome Full support 54 | Edge Full support 17 | Firefox Full support 49 | IE No support No | Opera Full support 39 | Safari Full support 10 | WebView Android Full support 54 | Chrome Android Full support 54 | Firefox Android Full support 49 | Opera Android Full support 41 | Safari iOS Full support 10 | Samsung Internet Android Full support 6.0 |
Legend
- Full support
- Full support
- No support
- No support
- Experimental. Expect behavior to change in the future.
- Experimental. Expect behavior to change in the future.