जावास्क्रिप्ट में केवल मूल तत्व और उसके बाल तत्वों को कैसे हटाया जाए?


88

हम कहते हैं:

<div>
  pre text
  <div class="remove-just-this">
    <p>child foo</p>
    <p>child bar</p>
    nested text
  </div>
  post text
</div>

इसके लिए:

<div>
  pre text
  <p>child foo</p>
  <p>child bar</p>
  nested text
  post text
</div>

मैं Mootools, jQuery और यहां तक ​​कि (कच्चे) जावास्क्रिप्ट का उपयोग कर पता लगा रहा हूँ, लेकिन यह कैसे करना है विचार नहीं मिल सका।

जवाबों:


138

JQuery का उपयोग करके आप यह कर सकते हैं:

var cnt = $(".remove-just-this").contents();
$(".remove-just-this").replaceWith(cnt);

दस्तावेज़ के त्वरित लिंक:


काश मुझे एहसास हुआ (जब तक .. पाया गया ) यह 3 घंटे पहले ... सरल और सुरुचिपूर्ण - भयानक!
तथागत

3
'cnt' का क्या महत्व है?
स्टीवन लू

1
'cnt' एक परिवर्तनशील नाम है जो "सामग्री" रखता है
जॉर्ज एंडरसन

1
मुझे यकीन नहीं है कि क्यों, लेकिन सामग्री () का उपयोग करते समय यह मेरे लिए काम नहीं करता था। हालांकि, जब मैंने सामग्री के स्थान पर html () का उपयोग किया, तो यह एक आकर्षण की तरह काम करता था!
लंबोइलेक्ट्रिक

सिर्फ 1 पंक्ति संस्करण:$('.remove-just-this').replaceWith(function() { return $(this).html(); });
तौफीक नूर रहमानंद

36

लाइब्रेरी-इंडिपेंडेंट मेथड को अपने से पहले निकाले जाने वाले तत्व के सभी चाइल्ड नोड्स को सम्मिलित करना है (जो आपको उनकी पुरानी स्थिति से हटाता है), इससे पहले कि आप इसे हटा दें:

while (nodeToBeRemoved.firstChild)
{
    nodeToBeRemoved.parentNode.insertBefore(nodeToBeRemoved.firstChild,
                                            nodeToBeRemoved);
}

nodeToBeRemoved.parentNode.removeChild(nodeToBeRemoved);

यह सभी चाइल्ड नोड्स को सही क्रम में सही जगह पर ले जाएगा।


3
आधुनिक जेएस इस का समर्थन करता है:node.replaceWith(...node.childNodes);
गिबोल्ट

34

आपको DOM के साथ ऐसा करना सुनिश्चित करना चाहिए, नहीं innerHTML(और यदि jk द्वारा प्रदान किए गए jQuery समाधान का उपयोग कर रहे हैं, तो सुनिश्चित करें कि यह innerHTMLईवेंट नोड्स को आंतरिक रूप से उपयोग करने के बजाय ) स्थानांतरित करता है, ताकि ईवेंट हैंडलर जैसी चीज़ों को संरक्षित किया जा सके।

मेरा उत्तर इंसिन की तरह है, लेकिन बड़ी संरचनाओं के लिए बेहतर प्रदर्शन करेगा (प्रत्येक नोड को अलग-अलग जोड़कर रिड्रावे पर कर लगाया जा सकता है जहां सीएसएस को प्रत्येक के लिए फिर से लागू किया जाना है appendChild; एक के साथ DocumentFragment, यह केवल एक बार होता है जब तक कि यह तब तक दिखाई नहीं देता है जब तक कि यह दिखाई नहीं देता है; बच्चों को सभी जोड़ा जाता है और इसे दस्तावेज़ में जोड़ा जाता है)।

var fragment = document.createDocumentFragment();
while(element.firstChild) {
    fragment.appendChild(element.firstChild);
}
element.parentNode.replaceChild(fragment, element);

धन्यवाद; छोटा और सीधा।
ब्रूनोइस


22

अधिक सुंदर तरीका है

$('.remove-just-this').contents().unwrap();

2
सबसे बढ़िया उत्तर। धन्यवाद।
user706420

7

आधुनिक JS का उपयोग करें!

const node = document.getElementsByClassName('.remove-just-this')[0];
node.replaceWith(...node.childNodes); // or node.children, if you don't want textNodes

oldNode.replaceWith(newNode) वैध है ES5

...array प्रसार ऑपरेटर है, प्रत्येक सरणी तत्व को एक पैरामीटर के रूप में पारित करता है


2

जो भी पुस्तकालय आप का उपयोग कर रहे हैं उसे डोम से बाहरी div को हटाने से पहले आंतरिक div को क्लोन करना होगा। फिर आपको क्लोन किए गए आंतरिक div को DOM में उस स्थान पर जोड़ना होगा जहां बाहरी div था। तो कदम हैं:

  1. एक चर में बाहरी div के माता-पिता के लिए एक संदर्भ सहेजें
  2. इनर डिव को दूसरे वेरिएबल में कॉपी करें। यह त्वरित और गंदे तरीके से बचाया जा सकता हैinnerHTML आंतरिक div को एक चर में या आप नोड के साथ आंतरिक पेड़ की नकल कर सकते हैं।
  3. removeChildतर्क के रूप में बाहरी div के साथ बाहरी div के माता-पिता को कॉल करें ।
  4. बाहरी स्थिति में माता-पिता की कॉपी की हुई आंतरिक सामग्री को सही स्थिति में डालें।

कुछ पुस्तकालय आपके लिए इसमें से कुछ या सभी करेंगे लेकिन उपरोक्त जैसा कुछ हो रहा है।


2

और, चूंकि आपने मूटूलों में भी कोशिश की है, इसलिए मूटूलों में इसका समाधान है।

var children = $('remove-just-this').getChildren();
children.replaces($('remove-just-this');

ध्यान दें कि यह पूरी तरह से अप्रयुक्त है, लेकिन मैंने पहले भी म्यूटूल के साथ काम किया है और इसे काम करना चाहिए।

http://mootools.net/docs/Element/Element#Element:getChildren

http://mootools.net/docs/Element/Element#Element:replaces


1

अपनी सामग्री से div को प्रतिस्थापित करें:

const wrapper = document.querySelector('.remove-just-this');
wrapper.outerHTML = wrapper.innerHTML;
<div>
  pre text
  <div class="remove-just-this">
    <p>child foo</p>
    <p>child bar</p>
    nested text
  </div>
  post text
</div>


0

यदि आप पजामा में भी यही काम करना चाहते हैं, तो यहां बताया गया है कि यह कैसे किया जाता है। यह बहुत अच्छा काम करता है (आप पलक को धन्यवाद देता है)। मैं एक उचित समृद्ध पाठ संपादक बनाने में सक्षम रहा हूं जो ठीक से बिना गड़बड़ किए शैलियों को करता है, इसके लिए धन्यवाद।

def remove_node(doc, element):
    """ removes a specific node, adding its children in its place
    """
    fragment = doc.createDocumentFragment()
    while element.firstChild:
        fragment.appendChild(element.firstChild)

    parent = element.parentNode
    parent.insertBefore(fragment, element)
    parent.removeChild(element)

1
यह कौनसी भाषा है?
ब्रूनोइस

अजगर जैसा दिखता है - जो उपयोगकर्ता के उल्लेख के बाद से समझ में आता है pyjamas
mgilson

0

मैं एक महत्वपूर्ण DOM पर काम करते हुए सर्वश्रेष्ठ उत्तर प्रदर्शन-वार की तलाश कर रहा था ।

पलकहीनता का जवाब इस ओर इशारा कर रहा था कि जावास्क्रिप्ट का उपयोग करना सबसे अच्छा होगा।

मैंने हटाने के लिए निम्नलिखित निष्पादन समय परीक्षण 5,000 लाइनों और 400,000 वर्णों के साथ एक जटिल DOM संरचना के साथ किया है। मैं जावास्क्रिप्ट का उपयोग करते समय सुविधाजनक कारण के लिए एक वर्ग के बजाय एक आईडी का उपयोग कर रहा हूं।

$ .Unwrap () का उपयोग करना

$('#remove-just-this').contents().unwrap();

201.237ms

$ .ReplaceWith () का उपयोग करना

var cnt = $("#remove-just-this").contents();
$("#remove-just-this").replaceWith(cnt);

156.983ms

जावास्क्रिप्ट में DocumentFragment का उपयोग करना

var element = document.getElementById('remove-just-this');
var fragment = document.createDocumentFragment();
while(element.firstChild) {
    fragment.appendChild(element.firstChild);
}
element.parentNode.replaceChild(fragment, element);

147.211ms

निष्कर्ष

प्रदर्शन-वार, अपेक्षाकृत बड़े DOM संरचना पर भी, jQuery और जावास्क्रिप्ट का उपयोग करने के बीच का अंतर बहुत बड़ा नहीं है। हैरानी $.unwrap()की बात है की तुलना में सबसे महंगा है $.replaceWith()। परीक्षण jQuery 1.12.4 के साथ किया गया है।


0

यदि आप कई पंक्तियों के साथ काम कर रहे हैं, क्योंकि यह मेरे उपयोग के मामले में था तो आप शायद इन पंक्तियों के साथ कुछ बेहतर कर सकते हैं:

 $(".card_row").each(function(){
        var cnt = $(this).contents();
        $(this).replaceWith(cnt);
    });
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.