2010-12-09 12 views
5

निम्न HTML-टुकड़ा दिया गया है:मैं जावास्क्रिप्ट/JQuery के साथ तत्व नोड्स के बीच सभी टेक्स्ट नोड्स कैसे ढूंढ सकता हूं?

<div> 
    <p> 
    abc <span id="x">[</span> def <br /> ghi 
    </p> 
    <p> 
    <strong> jkl <span id="y">]</span> mno </strong> 
    </p> 
</div> 

मैं एक एल्गोरिथ्म की जरूरत #x और जावास्क्रिप्ट के साथ #y के बीच प्रकार पाठ के सभी नोड्स लाने के लिए। या क्या कोई JQuery फ़ंक्शन है जो वास्तव में करता है?

जिसके परिणामस्वरूप पाठ नोड्स ऊपर के उदाहरण के लिए (सफेद स्थान को नजरअंदाज कर दिया नोड्स) तो होगा: डोम तरीकों और कोई लाइब्रेरी का उपयोग कर सभी प्रमुख ब्राउज़रों में

['def', 'ghi', 'jkl'] 
+0

क्या आप टेक्स्ट नोड्स या उनकी (स्ट्रिंग) सामग्री को पकड़ना चाहते हैं? –

+0

साथ ही, ध्यान दें कि उन दो SPANs के बीच 3 से अधिक टेक्स्ट नोड्स हैं। (मुझे लगता है 5, लेकिन मुझे यकीन नहीं है) –

+0

@ सैम: मैं टेक्स्ट नोड्स को पकड़ना चाहता हूं। –

उत्तर

7

निम्नलिखित काम करता है। यह प्रश्न में उल्लिखित व्हाइटस्पेस टेक्स्ट नोड्स को भी अनदेखा करता है।

अनिवार्य jsfiddle: http://jsfiddle.net/timdown/a2Fm6/

function getTextNodesBetween(rootNode, startNode, endNode) { 
    var pastStartNode = false, reachedEndNode = false, textNodes = []; 

    function getTextNodes(node) { 
     if (node == startNode) { 
      pastStartNode = true; 
     } else if (node == endNode) { 
      reachedEndNode = true; 
     } else if (node.nodeType == 3) { 
      if (pastStartNode && !reachedEndNode && !/^\s*$/.test(node.nodeValue)) { 
       textNodes.push(node); 
      } 
     } else { 
      for (var i = 0, len = node.childNodes.length; !reachedEndNode && i < len; ++i) { 
       getTextNodes(node.childNodes[i]); 
      } 
     } 
    } 

    getTextNodes(rootNode); 
    return textNodes; 
} 

var x = document.getElementById("x"), 
    y = document.getElementById("y"); 

var textNodes = getTextNodesBetween(document.body, x, y); 
console.log(textNodes); 
+0

'document.body' के बजाय मुझे लगता है कि मैं प्रारंभ नोड और एंड नोड दोनों रूट नोड के सामान्य पैरेंट नोड का उपयोग कर सकता हूं। –

+0

@ user375773: दरअसल, मैं मानता हूं कि बेहतर होगा। मैंने सादगी के लिए छोड़ दिया। –

0

निम्न उदाहरण jQuery किसी भी दो तत्वों है कि एक दूसरे के बगल में हैं खोजने के लिए उपयोग करता है और या उन दोनों के बीच पाठ नोड्स नहीं हो सकता है हो सकता है। यह फ़ोरैच लूप परिणाम वाले तत्वों को किसी भी टेक्स्ट नोड्स को ढूंढने और सूची में जोड़ने के लिए जांच करेगा।

function getTextNodes() { 
    var list = []; 
    $(document.body).find("*+*").toArray().forEach(function (el) { 
     var prev = el.previousSibling; 
     while (prev != null && prev.nodeType == 3) { 
      list.push(prev); 
      prev = prev.previousSibling; 
     } 
    }); 
    return list; 
} 
संबंधित मुद्दे