2010-12-09 9 views
5

Aşağıdaki HTML parçası yapıldı Verilen:Javascript/JQuery ile öğe düğümleri arasındaki tüm metin düğümlerini nasıl bulabilirim?

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

Ben #x ve Javascript ile #y arasındaki tipi Metin tüm düğümleri getirmesi için bir algoritma gerekir. Veya tam olarak bunu yapan bir JQuery işlevi var mı? Yukarıdaki örneğin

çıkan Metin düğümleri (ihmal boşluk düğümler) sonra olacaktır: DOM yöntemleri ve hiçbir kütüphaneyi kullanan tüm büyük tarayıcılarda

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

Metin düğümlerini veya bunların (dize) içeriklerini almak ister misiniz? –

+0

Ayrıca, bu iki SPAN arasında 3'ten fazla metin düğümünün olduğunu unutmayın. (Sanırım 5, ama emin değilim) –

+0

@Sime: Metin düğümlerini almak istiyorum. –

cevap

7

aşağıdaki çalışır. Ayrıca soruda belirtildiği gibi beyaz boşluk metin düğümlerini de yok sayar.

kenarı 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" yerine, başlangıç ​​düğümü ve son düğümün ortak ana düğümünü kök düğüm olarak kullanabilirim. –

+0

@ user375773: Gerçekten de bunun daha iyi olacağını kabul ediyorum. Bunu basitlik uğruna ihmal ettim. –

0

Aşağıdaki örnek, yan yana olan herhangi iki elemanları bulmak için jQuery kullanır ya da aralarındaki metin düğümleri sahip olabilir veya olmayabilir. Bu foreach döngüsü, herhangi bir metin düğümünü bulmak ve listeye eklemek için sonuçlanan öğeleri kontrol eder.

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; 
} 
İlgili konular