2012-02-18 5 views
6

क्या केवल शीर्ष तत्व के आंतरिक पाठ प्राप्त करने का कोई तरीका है (और बच्चे तत्व के आंतरिक पाठ को अनदेखा करें)?क्या केवल शीर्ष तत्व के आंतरिक पाठ प्राप्त करने का कोई तरीका है (और बच्चे तत्व के आंतरिक पाठ को अनदेखा करें)?

उदाहरण:

<div> 
    top node text 
    <div> child node text </div> 
</div> 

कैसे जबकि "चाइल्ड नोड पाठ" अनदेखी "शीर्ष नोड पाठ" पाने के लिए? शीर्ष div की आंतरिक पाठ संपत्ति आंतरिक, शीर्ष पाठ दोनों के संयोजन को वापस करने लगती है।

+1

गैर पाठ सीधे बच्चे नोड्स को पहले हटाएं? – Oded

+1

@ ओडेड: कोई ज़रूरत नहीं है। बस बच्चों और concatenate पर फिर से शुरू करें। बहुत आसान। –

उत्तर

11

बस बच्चे नोड पर पुनरावृति और श्रेणीबद्ध पाठ नोड्स:

var el = document.getElementById("your_element_id"), 
    child = el.firstChild, 
    texts = []; 

while (child) { 
    if (child.nodeType == 3) { 
     texts.push(child.data); 
    } 
    child = child.nextSibling; 
} 

var text = texts.join(""); 
+1

+1 क्लोनिंग से स्पष्ट रूप से बेहतर है कि डीओएम पेड़ का एक बहुत बड़ा हिस्सा हो सकता है, बस इसे छोड़ने के लिए। केवल सुधार ही पाठ में 'text = [] 'होगा, और उसके बाद' text.push (child.data) प्रति पुनरावृत्ति होगा, और अंत में' text = text.join ('') 'अंत में' सरणी को चालू करने के लिए ' एक स्ट्रिंग में टुकड़े, जो एक सतत बढ़ती स्ट्रिंग के लिए दोहराए गए concatenations से तेजी से होता है। –

+0

@DanielEarwicker: मैंने इसे माना, लेकिन मुझे लगता है कि आखिरी मानक मैंने देखा है कि यह स्पष्ट कटौती नहीं थी कि यह वास्तव में प्रदर्शन में सुधार करता है, इसलिए मैं सरल संस्करण के लिए गया। मैं अभी जांच करूंगा। –

+1

अच्छा है। पुनश्च। 'डेटा' को '' CharacterData'] (https://developer.mozilla.org/en/DOM/CharacterData) इंटरफ़ेस में परिभाषित किया गया है, जिसे' टेक्स्ट' (टेक्स्ट नोड्स) द्वारा कार्यान्वित किया जाता है। –

3
  1. तत्व क्लोन करें।
  2. सभी बच्चे नोड्स (पीछे की ओर, विवादों से बचने के लिए) के माध्यम से लूप:
    यदि तत्व में tagName विशेषता है, तो यह एक तत्व है: नोड निकालें।
  3. पाठ सामग्री प्राप्त करने के लिए innerText का उपयोग करें (पर फ़ॉलबैक के साथ, innerText समर्थित नहीं है)।

कोड:

var elem = document.getElementById('theelement'); 
elem = elem.cloneNode(true); 
for (var i=elem.childNodes.length-1; i>=0; i--) { 
    if (elem.childNodes[i].tagName) elem.removeChild(elem.childNodes[i]); 
} 
var innerText = elem['innerText' in elem ? 'innerText' : 'textContent']; 
+0

वाह, सभी ब्राउज़रों में आकर्षण की तरह काम करता है। सचमुच, मुझे नहीं लगता था कि प्रश्न पोस्ट करने से पहले यह संभव था :) ... धन्यवाद ... – ivymike

+2

डीओएम को क्लोन या म्यूट करने की कोई ज़रूरत नहीं है। बस पाठ नोड बच्चों को पढ़ें। मेरा जवाब देखें –

+2

@ivymike Tims की विधि बेहतर है। मैं अपने जवाब के बजाय अपना जवाब स्वीकार करने का सुझाव देता हूं। यह सभी ब्राउज़रों में भी काम करता है (आईई 6 +, क्रोम 1+, सफारी 5, फ़ायरफ़ॉक्स 3+ में परीक्षण)। –

0

आप चाइल्ड तत्व के भीतर पाठ को अनदेखा नहीं करना चाहते हैं, तो निम्न का उपयोग समारोह:

function getInnerText(el) { 
    var x = []; 
    var child = el.firstChild; 
    while (child) { 
     if (child.nodeType == 3) { 
      x.push(child.nodeValue); 
     } 
     else if (child.nodeType == 1) { 
      var ii = getInnerText(child); 
      if (ii.length > 0) x.push(ii); 
     } 
     child = child.nextSibling; 
    } 
    return x.join(" "); 
} 
+0

क्या मुझे कुछ याद आ रहा है, या यह उनके विपरीत क्या है इसके विपरीत है? – Tom

2

यह आपके उदाहरण में काम करेगा: document.getElementById("item").firstChild.nodeValue;

नोट: ध्यान रखें कि इस यदि आप जानते हैं आप उस विशिष्ट HTML के साथ काम कर रहे हैं काम करेंगे। अपने HTML उदाहरण के लिए, बदल सकते हैं:

<div> 
    <div class="item"> child node text </div> 
    top node text 
</div> 

तो आप @Tim Down


यहाँ से अधिक सामान्य समाधान का उपयोग करना चाहिए काम कर रहा है कोड का टुकड़ा:

window.onload = function() { 
 
    var text = document.getElementById("item").firstChild.nodeValue; 
 
    document.getElementById("result").innerText = text.trim(); 
 
};
#result { 
 
    border: 1px solid red; 
 
}
<div id="item"> 
 
    top node text 
 
    <div> child node text </div> 
 
</div> 
 

 

 

 
<strong>Result:</strong> <div id="result"></div>

संबंधित मुद्दे