2010-05-14 15 views
9

द्वारा अलग किया गया है, मैं एक jQuery लिपटे सेट में सभी टेक्स्ट इकट्ठा करने का एक तरीका ढूंढ रहा हूं, लेकिन मुझे भाई नोड्स के बीच रिक्त स्थान बनाने की आवश्यकता है जिनमें कोई टेक्स्ट नहीं है उनके बीच नोड्स।एक लिपटे सेट से सभी टेक्स्ट नोड्स को इकट्ठा करने के लिए jQuery का उपयोग करके,

<div> 
    <ul> 
    <li>List item #1.</li><li>List item #2.</li><li>List item #3.</li> 
    </ul> 
</div> 

तो मैं बस इस तरह की तरह, <div> की पाठ्य सामग्री इकट्ठा करने के लिए jQuery के text() विधि का उपयोग करें:

उदाहरण के लिए, इस HTML पर विचार

var $div = $('div'), text = $div.text().trim(); 

alert(text); 

कि निम्न पाठ का उत्पादन:

सूची आइटम # 1. सूची आइटम # 2. सूची आइटम # 3।

क्योंकि वहाँ प्रत्येक <li> तत्व के बीच कोई खाली स्थान के है। मैं वास्तव में क्या देख रहा हूं यह है (प्रत्येक वाक्य के बीच एकल स्थान को नोट करें):

सूची आइटम # 1। सूची आइटम # 3। सूची आइटम # 3।

यह मुझे सुझाव देता है कि मुझे लिपटे सेट में डीओएम नोड्स को पार करने की आवश्यकता है, प्रत्येक स्ट्रिंग में प्रत्येक के लिए पाठ जोड़ना, एक स्थान के बाद। मैं निम्नलिखित कोड की कोशिश की:

var $div = $('div'), text = ''; 

$div.find('*').each(function() { 
    text += $(this).text().trim() + ' '; 
}); 

alert(text); 

लेकिन यह निम्न पाठ का उत्पादन:

इस सूची आइटम # 1. इस सूची आइटम # 2. इस है # 3 सूची आइटम है। यह सूची आइटम # 1 है। यह सूची आइटम # 2 है। यह सूची आइटम # 3 है।

मुझे लगता है इस वजह से मैं <div> के हर वंश के माध्यम से पुनरावृत्ति कर रहा हूँ और पाठ जोड़कर, तो मैं <ul> और उसके <li> बच्चों में से प्रत्येक के भीतर पाठ नोड्स हो रही है, दोहराया गया पाठ के लिए अग्रणी।

मुझे लगता है कि मैं संभवतया लिपटे सेट के डीओएम को घुमाने और पाठ नोड्स को जोड़ने के लिए एक सादा जावास्क्रिप्ट फ़ंक्शन ढूंढ सकता/सकती हूं - लेकिन क्या jQuery का उपयोग करके ऐसा करने का एक आसान तरीका है? क्रॉस-ब्राउज़र स्थिरता बहुत महत्वपूर्ण है।

किसी भी मदद के लिए धन्यवाद!

उत्तर

7

jQuery ज्यादातर तत्वों के साथ सौदा करता है, इसकी टेक्स्ट-नोड शक्तियां अपेक्षाकृत कमजोर होती हैं। आप contents() वाले सभी बच्चों की एक सूची प्राप्त कर सकते हैं, लेकिन आपको अभी भी इसे चेक प्रकारों पर चलना होगा, इसलिए यह वास्तव में सादे DOM childNodes का उपयोग करने से अलग नहीं है। पाठ नोड्स को पुनः प्राप्त करने के लिए कोई विधि नहीं है, इसलिए आपको कुछ लिखना होगा, उदाहरण के लिए।कुछ की तरह:

function collectTextNodes(element, texts) { 
    for (var child= element.firstChild; child!==null; child= child.nextSibling) { 
     if (child.nodeType===3) 
      texts.push(child); 
     else if (child.nodeType===1) 
      collectTextNodes(child, texts); 
    } 
} 
function getTextWithSpaces(element) { 
    var texts= []; 
    collectTextNodes(element, texts); 
    for (var i= texts.length; i-->0;) 
     texts[i]= texts[i].data; 
    return texts.join(' '); 
} 
+0

बहुत बढ़िया, यह एक आकर्षण की तरह काम किया! बहुत बहुत धन्यवाद, मुझे नहीं पता कि मैं तुम्हारे बिना क्या करूँगा, बॉबन्स। ;-) – Bungle

+0

'Ndumiso Mlilo पर एक नई तस्वीर को खूबसूरती से काम करता है। '^ _^ – evandrix

0

आप सभी नोड्स (टेक्स्ट नोड्स सहित) प्राप्त करने के लिए jQuery contents() विधि का उपयोग कर सकते हैं, फिर अपने सेट को केवल टेक्स्ट नोड्स पर फ़िल्टर करें।

$("body").find("*").contents().filter(function(){return this.nodeType!==1;}); 

वहां से आप जो भी संरचना चाहते हैं उसे बना सकते हैं।

+2

उत्तर के लिए धन्यवाद, लेकिन यह मेरे लिए काम नहीं किया। क्या आप अपने नमूना कोड पर विस्तार कर सकते हैं? इसके अतिरिक्त, मुझे लगता है कि 'सामग्री()' केवल लिपटे सेट के तत्काल बच्चों को ट्रैवर करता है (http://api.jquery.com/contents/ देखें), सभी वंश नहीं। – Bungle

+0

@ बंगल जो सच है, 'सामग्री() 'नोड्स को दोबारा इकट्ठा नहीं करता है बल्कि केवल तत्काल वंशज हैं। – acme

+0

'Ndumiso Mlilo पर एक नई तस्वीर में विफल रहता है। ' – evandrix

2

यह आसान समाधान मैं के बारे में सोच सकता है:

$("body").find("*").contents().filter(function(){return this.nodeType!==1;}); 
+0

बहुत ही सुरुचिपूर्ण समाधान! – acme

+0

'Ndumiso Mlilo पर एक नई तस्वीर में विफल रहता है। ' – evandrix

+0

उत्पादन 'एक नई तस्वीर जोड़ा। Ndumiso Mlilo 'Ndumiso Mlilo के बजाय एक नई तस्वीर जोड़ा। ' – evandrix

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

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