नहीं है insertBefore()
जावास्क्रिप्ट में है, लेकिन मैं कैसे एक तत्व सम्मिलित कर सकते हैं के बाद jQuery या एक और पुस्तकालय का उपयोग किए बिना एक और तत्व?
नहीं है insertBefore()
जावास्क्रिप्ट में है, लेकिन मैं कैसे एक तत्व सम्मिलित कर सकते हैं के बाद jQuery या एक और पुस्तकालय का उपयोग किए बिना एक और तत्व?
जवाबों:
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
referenceNode
वह नोड कहां है जिसे आप newNode
बाद में रखना चाहते हैं । तो referenceNode
अपनी मूल तत्व के भीतर अंतिम संतान, यह ठीक है, क्योंकि है referenceNode.nextSibling
हो जाएगा null
और insertBefore
सूची के अंत में जोड़कर ऐसा होता है कि हैंडल।
इसलिए:
function insertAfter(newNode, referenceNode) {
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
आप निम्नलिखित स्निपेट का उपयोग कर इसे परीक्षण कर सकते हैं:
function insertAfter(referenceNode, newNode) {
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
var el = document.createElement("span");
el.innerHTML = "test";
var div = document.getElementById("foo");
insertAfter(div, el);
<div id="foo">Hello</div>
insertBefore()
पाठ नोड्स के साथ काम करता है। आप insertAfter()
अलग क्यों होना चाहते हैं ? आपको नाम के लिए insertBeforeElement()
और उसके insertAfterElement()
लिए अलग-अलग युग्म बनाने चाहिए ।
इससे पहले आवेदन करें:
element.parentNode.insertBefore(newElement, element);
इसके बाद आवेदन करें:
element.parentNode.insertBefore(newElement, element.nextSibling);
निम्नलिखित प्रोटोटाइप का निर्माण करके, आप नए बनाए गए तत्वों से सीधे इन फ़ंक्शन को कॉल कर पाएंगे।
newElement.appendBefore(element);
newElement.appendAfter(element);
.appendBefore (तत्व) प्रोटोटाइप
Element.prototype.appendBefore = function (element) {
element.parentNode.insertBefore(this, element);
},false;
.appendAfter (तत्व) प्रोटोटाइप
Element.prototype.appendAfter = function (element) {
element.parentNode.insertBefore(this, element.nextSibling);
},false;
existingElement.appendAfter(newElement);
। देखें कि इस अपडेटेड jsfiddle पर मेरा क्या मतलब है ।
insertAdjacentHTML
+ outerHTML
elementBefore.insertAdjacentHTML('afterEnd', elementAfter.outerHTML)
तेजी:
insertBefore
(ब्रेक भले ही मौजूदा नोड चर नाम 3 वर्ण लंबा है)downsides:
outerHTML
तत्व को एक स्ट्रिंग में परिवर्तित करता है। हमें इसकी आवश्यकता है क्योंकि insertAdjacentHTML
तत्वों के बजाय तार से सामग्री जोड़ता है।.insertAdjacentElement()
एक त्वरित Google खोज से इस स्क्रिप्ट का पता चलता है
// create function, it expects 2 values.
function insertAfter(newElement,targetElement) {
// target is what you want it to go after. Look for this elements parent.
var parent = targetElement.parentNode;
// if the parents lastchild is the targetElement...
if (parent.lastChild == targetElement) {
// add the newElement after the target element.
parent.appendChild(newElement);
} else {
// else the target has siblings, insert the new element between the target and it's next sibling.
parent.insertBefore(newElement, targetElement.nextSibling);
}
}
targetElement.nextSibling
वापस आ जाएगा null
। जब इसे दूसरे तर्क के रूप node.insertBefore
में कहा जाता null
है, तो यह संग्रह के अंत में नोड को जोड़ देगा। दूसरे शब्दों में, if(parent.lastchild == targetElement) {
शाखा बहुत ही शानदार है, क्योंकि parent.insertBefore(newElement, targetElement.nextSibling);
यह सभी मामलों से ठीक से निपटेगा, भले ही यह पहली बार में दिखाई दे। कई लोग पहले ही अन्य टिप्पणियों में बता चुके हैं।
यद्यपि insertBefore()
( एमडीएन देखें ) महान है और यहां अधिकांश उत्तरों से संदर्भित है। अतिरिक्त लचीलेपन के लिए, और थोड़ा अधिक स्पष्ट होने के लिए, आप उपयोग कर सकते हैं:
insertAdjacentElement()
(देख एमडीएन ) यह आपको किसी भी तत्व को संदर्भित करने देता है, और जहां आप चाहते हैं, वहां ले जाया जा सकने वाला तत्व डालें:
<!-- refElem.insertAdjacentElement('beforebegin', moveMeElem); -->
<p id="refElem">
<!-- refElem.insertAdjacentElement('afterbegin', moveMeElem); -->
... content ...
<!-- refElem.insertAdjacentElement('beforeend', moveMeElem); -->
</p>
<!-- refElem.insertAdjacentElement('afterend', moveMeElem); -->
अन्य समान उपयोग के मामलों पर विचार करने के लिए: 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
( डॉक्टर ) दूसरे नोड के बाद एक नोड सम्मिलित करता है।
दो डोम नोड्स के लिए node1
और node2
,
node1.after(node2)
के node2
बाद सम्मिलित करता है node1
।
यह विधि पुराने ब्राउज़रों में उपलब्ध नहीं है, इसलिए आमतौर पर एक पॉलीफिल की आवश्यकता होती है।
मुझे पता है कि यह सवाल प्राचीन है, लेकिन किसी भी भविष्य के उपयोगकर्ताओं के लिए, एक संशोधित प्रोटोटाइप का निर्माण होता है। यह सिर्फ एक माइक्रो पॉलीफिल है। इन्टरएक्टर के बाद यह कार्य करता है कि यह प्रोटोटाइप मौजूद नहीं है, सीधे baseElement.insertAfter(element);
तत्व प्रोटोटाइप में एक नया फ़ंक्शन जोड़ता है :
Element.prototype.insertAfter = function(new) {
this.parentNode.insertBefore(new, this.nextSibling);
}
एक बार जब आप एक पुस्तकालय में एक पॉलीफ़िल रख देते हैं, तो या अपने कोड में (या कहीं और जहां इसे संदर्भित किया जा सकता है) लिखें document.getElementById('foo').insertAfter(document.createElement('bar'));
नया संपादित करें: आप प्रस्तावों का उपयोग नहीं करेंगे। वे डिफ़ॉल्ट कोडबेस को ओवरराइट करते हैं और बहुत ही कुशल या सुरक्षित होते हैं और संगतता त्रुटियों का कारण बन सकते हैं, लेकिन यदि गैर-व्यावसायिक परियोजनाओं के लिए, यह मायने नहीं रखता है। यदि आप व्यावसायिक उपयोग के लिए एक सुरक्षित फ़ंक्शन चाहते हैं, तो बस एक डिफ़ॉल्ट फ़ंक्शन का उपयोग करें। यह सुंदर नहीं है, लेकिन यह काम करता है:
function insertAfter(el, newEl) {
el.parentNode.insertBefore(newEl, this.nextSibling);
}
// use
const el = document.body || document.querySelector("body");
// the || means "this OR that"
el.insertBefore(document.createElement("div"), el.nextSibling);
// Insert Before
insertAfter(el, document.createElement("div"));
// Insert After
चाइल्डनोड के लिए वर्तमान वेब मानक: https://developer.mozilla.org/en-US/docs/Web/API/ChildNode
इसकी वर्तमान में लिविंग स्टैंडर्ड्स में है और सेफ है।
असमर्थित ब्राउज़रों के लिए, इस Polyfill का उपयोग करें: https://github.com/seznam/JAK/blob/master/lib/polyfills/childNode.js
किसी ने उल्लेख किया कि पॉलीफ़िल प्रोटोस का उपयोग करता है, जब मैंने कहा कि वे खराब अभ्यास कर रहे थे। वे हैं, खासकर जब वे गलत तरीके से उपयोग किए जाते हैं, 2018 के लिए मेरे समाधान की तरह। हालांकि, यह कि एमडीएफ डॉक्यूमेंटेशन में पॉलीफिल है और एक तरह के इनिशियलाइज़ेशन और निष्पादन का उपयोग करता है जो अधिक सुरक्षित है। प्लस यह पुराने ब्राउज़र समर्थन के लिए है, दिन और उम्र में जहां प्रोटोटाइप ओवरराइटिंग इतनी बुरी नहीं थी।
2020 समाधान का उपयोग कैसे करें:
const el = document.querySelector(".class");
// Create New Element
const newEl = document.createElement("div");
newEl.id = "foo";
// Insert New Element BEFORE
el.before(newEl);
// Insert New Element AFTER
el.after(newEl);
// Remove Element
el.remove();
// Remove Child
newEl.remove(); // This one wasnt tested but should work
या आप बस कर सकते हैं:
referenceNode.parentNode.insertBefore( newNode, referenceNode )
referenceNode.parentNode.insertBefore( referenceNode, newNode )
InsertBefore () विधि का उपयोग किया जाता है parentNode.insertBefore()
। तो इस की नकल करने और एक विधि बनाने के लिए parentNode.insertAfter()
हम निम्नलिखित कोड लिख सकते हैं।
जावास्क्रिप्ट
Node.prototype.insertAfter = function(newNode, referenceNode) {
return referenceNode.parentNode.insertBefore(
newNode, referenceNode.nextSibling); // based on karim79's solution
};
// getting required handles
var refElem = document.getElementById("pTwo");
var parent = refElem.parentNode;
// creating <p>paragraph three</p>
var txt = document.createTextNode("paragraph three");
var paragraph = document.createElement("p");
paragraph.appendChild(txt);
// now we can call it the same way as insertBefore()
parent.insertAfter(paragraph, refElem);
एचटीएमएल
<div id="divOne">
<p id="pOne">paragraph one</p>
<p id="pTwo">paragraph two</p>
</div>
ध्यान दें, कि इस लेख में बताए अनुसार DOM का विस्तार करना आपके लिए सही समाधान नहीं हो सकता है ।
होवेवर, यह लेख 2010 में लिखा गया था और चीजें अब अलग हो सकती हैं। इसलिए अपने हिसाब से फैसला करें।
जावास्क्रिप्ट डोम सम्मिलित करें (बाद में) विधि @ jsfiddle.net
आदर्श रूप insertAfter
से सम्मिलित करने के लिए इसी तरह काम करना चाहिए । नीचे दिया गया कोड निम्नलिखित कार्य करेगा:
Node
जोड़ा जाता हैNode
, तो नया Node
जोड़ा जाता हैNode
संदर्भ के बाद नहीं है Node
, तो नया Node
जोड़ा जाता हैNode
बाद एक भाई है, तो Node
उस भाई के सामने नया डाला जाता हैNode
विस्तार Node
Node.prototype.insertAfter = function(node, referenceNode) {
if (node)
this.insertBefore(node, referenceNode && referenceNode.nextSibling);
return node;
};
एक सामान्य उदाहरण है
node.parentNode.insertAfter(newNode, node);
कोड देखें
मुझे पता है कि इस सवाल के पहले से ही कई जवाब हैं, लेकिन उनमें से कोई भी मेरी सटीक आवश्यकताओं को पूरा नहीं करता है।
मैं एक ऐसा कार्य चाहता था, जिसका सटीक विपरीत व्यवहार हो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
);
};
}
यह कोड एक छोटी सीएसएस फाइल को इनलाइन करने के आखिरी बच्चे के ठीक बाद एक लिंक आइटम डालने के लिए काम करता है
var raf, cb=function(){
//create newnode
var link=document.createElement('link');
link.rel='stylesheet';link.type='text/css';link.href='css/style.css';
//insert after the lastnode
var nodes=document.getElementsByTagName('link'); //existing nodes
var lastnode=document.getElementsByTagName('link')[nodes.length-1];
lastnode.parentNode.insertBefore(link, lastnode.nextSibling);
};
//check before insert
try {
raf=requestAnimationFrame||
mozRequestAnimationFrame||
webkitRequestAnimationFrame||
msRequestAnimationFrame;
}
catch(err){
raf=false;
}
if (raf)raf(cb); else window.addEventListener('load',cb);
आप appendChild
एक तत्व के बाद सम्मिलित करने के लिए फ़ंक्शन का उपयोग कर सकते हैं ।
संदर्भ: http://www.w3schools.com/jsref/met_node_appendchild.asp
InsertAfter के एक मजबूत कार्यान्वयन।
// source: https://github.com/jserz/domPlus/blob/master/src/insertAfter()/insertAfter.js
Node.prototype.insertAfter = Node.prototype.insertAfter || function (newNode, referenceNode) {
function isNode(node) {
return node instanceof Node;
}
if(arguments.length < 2){
throw(new TypeError("Failed to execute 'insertAfter' on 'Node': 2 arguments required, but only "+ arguments.length +" present."));
}
if(isNode(newNode)){
if(referenceNode === null || referenceNode === undefined){
return this.insertBefore(newNode, referenceNode);
}
if(isNode(referenceNode)){
return this.insertBefore(newNode, referenceNode.nextSibling);
}
throw(new TypeError("Failed to execute 'insertAfter' on 'Node': parameter 2 is not of type 'Node'."));
}
throw(new TypeError("Failed to execute 'insertAfter' on 'Node': parameter 1 is not of type 'Node'."));
};
सभी परिदृश्यों को संभालने देता है
function insertAfter(newNode, referenceNode) {
if(referenceNode && referenceNode.nextSibling && referenceNode.nextSibling.nodeName == '#text')
referenceNode = referenceNode.nextSibling;
if(!referenceNode)
document.body.appendChild(newNode);
else if(!referenceNode.nextSibling)
document.body.appendChild(newNode);
else
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
if( !Element.prototype.insertAfter ) {
Element.prototype.insertAfter = function(item, reference) {
if( reference.nextSibling )
reference.parentNode.insertBefore(item, reference.nextSibling);
else
reference.parentNode.appendChild(item);
};
}
आप वास्तव में एक विधि कह सकते हैं after()
में क्रोम, फ़ायरफ़ॉक्स और ओपेरा के नए संस्करण में । इस विधि का नकारात्मक पक्ष यह है कि इंटरनेट एक्सप्लोरर अभी तक इसका समर्थन नहीं करता है।
उदाहरण:
// You could create a simple node
var node = document.createElement('p')
// And then get the node where you want to append the created node after
var existingNode = document.getElementById('id_of_the_element')
// Finally you can append the created node to the exisitingNode
existingNode.after(node)
परीक्षण करने के लिए एक सरल HTML कोड है:
<!DOCTYPE html>
<html>
<body>
<p id='up'>Up</p>
<p id="down">Down</p>
<button id="switchBtn" onclick="switch_place()">Switch place</button>
<script>
function switch_place(){
var downElement = document.getElementById("down")
var upElement = document.getElementById("up")
downElement.after(upElement);
document.getElementById('switchBtn').innerHTML = "Switched!"
}
</script>
</body>
</html>
जैसा कि अपेक्षित था, यह डाउन तत्व के बाद ऊपर तत्व को स्थानांतरित करता है