2010-11-18 12 views
7

जब HTML दस्तावेज़ में ग्रंथों का चयन, एक दूसरे तत्व के लिए एक डोम तत्व के भीतर से शुरू कर सकते हैं के लिए सभी डोम ब्लॉक तत्वों जाओ संभवतः रास्ते पर कई अन्य तत्वों के ऊपर से गुजर। डीओएम एपीआई का उपयोग करना, चयन किए गए ब्राउज़र के आधार पर चयन, चयनित ग्रंथों और यहां तक ​​कि उन सभी चयनित डॉम तत्वों (सामान्य एनेस्टर कॉन्टैनर या पैरेंट एलिमेंट() का उपयोग करने के लिए मूल तत्व प्राप्त करना संभव है। हालांकि, मुझे कोई तरीका नहीं है कि मैं उन सभी ग्रंथों को सूचीबद्ध कर सकता हूं जो चयनित ग्रंथों के तत्वों को सूचीबद्ध कर सकते हैं, जो एकमात्र अभिभावक तत्व प्राप्त करने के अलावा अन्य हैं। माता-पिता का उपयोग करना और बच्चों के नोड्स को घुमाने में ऐसा नहीं होगा, क्योंकि ऐसे अन्य भाई बहन भी हो सकते हैं जिन्हें इस माता-पिता के अंदर नहीं चुना गया है।, चयनित ग्रंथों

तो, वहाँ एक रास्ता है कि मैं इन सभी तत्वों है कि चयनित ग्रंथों में शामिल है प्राप्त कर सकते हैं है। मैं मुख्य रूप से ब्लॉक तत्व (पी, एच 1, एच 2, एच 3, ... आदि) प्राप्त करने में रूचि रखता हूं लेकिन मुझे विश्वास है कि अगर सभी तत्व प्राप्त करने का कोई तरीका है, तो मैं उनके माध्यम से जा सकता हूं और उन्हें प्राप्त करने के लिए फ़िल्टर कर सकता हूं। चाहते हैं। मैं किसी भी विचार और सुझावों का स्वागत करता हूं।

धन्यवाद।

उत्तर

16

कुंजी window.getSelection().getRangeAt(0)https://developer.mozilla.org/en/DOM/range

है यहां कुछ नमूना कोड है कि आप आप क्या चाहते करने के लिए के साथ खेल सकते हैं। इस सवाल का जिक्र करते हुए कि आप वास्तव में प्रश्न के लिए क्या चाहते हैं, लोगों को बेहतर उत्तर प्रदान करने में मदद मिलेगी।

var selection = window.getSelection(); 
var range = selection.getRangeAt(0); 
var allWithinRangeParent = range.commonAncestorContainer.getElementsByTagName("*"); 

var allSelected = []; 
for (var i=0, el; el = allWithinRangeParent[i]; i++) { 
    // The second parameter says to include the element 
    // even if it's not fully selected 
    if (selection.containsNode(el, true)) { 
    allSelected.push(el); 
    } 
} 


console.log('All selected =', allSelected); 

यह सबसे कारगर तरीका नहीं है, आप अपने आप को डोम पार कर सकता है रेंज के startContainer/endContainer का उपयोग कर, nextSibling/previousSibling और childNodes के साथ।

+0

जैसा आपने कहा था, सही समाधान नहीं है, लेकिन इसने मुझे यह विचार करने के बारे में एक विचार दिया। इसलिए, मैंने इसे अपनी ज़रूरत के सबसे सही उत्तर के रूप में चुना है। वास्तव में इसकी सराहना करते हैं। – cria

+0

यह एक सभ्य जवाब है, लेकिन आईई <9. में काम नहीं करेगा यह चेक कि चयन कॉल करने से पहले से मौजूद है के साथ कर सकता 'selection.getRangeAt (0);' भी (चयन के 'rangeCount' संपत्ति का उपयोग कर के लिए सबसे आसान है)। –

+0

बहुत सारे गॉचस हैं जिन्हें मैंने संबोधित नहीं किया है, यह सिर्फ सही दिशा में आगे बढ़ने के लिए है। वास्तव में इसे संभालने के लिए आपकी लाइब्रेरी में असम्पीडित जावास्क्रिप्ट की 22k की आवश्यकता है और यदि मुझे इसकी आवश्यकता है, तो मैं इसका उपयोग करूँगा। –

0

ऐसा लगता है आप Traversing from the jQuery API इस्तेमाल कर सकते हैं की तरह।

संभवतः .contents()

आशा है कि मदद करता है!

+0

हाँ तरीकों सभी महान हैं। लेकिन मुझे विश्वास नहीं है कि मैं उन विधियों के लिए इनपुट के रूप में ब्राउज़र चयनित टेक्स्ट रेंज का उपयोग कर सकता हूं, क्या मैं कर सकता हूं? या शायद मुझे कुछ याद आ रहा है ... धन्यवाद – cria

10

तुम मेरे Rangy library यह करने के लिए उपयोग कर सकते हैं। यह आईई समेत सभी ब्राउज़रों के लिए डोम रेंज और चयन ऑब्जेक्ट्स का कार्यान्वयन प्रदान करता है, और इसमें अतिरिक्त रेंज विधियां हैं। इनमें से एक getNodes() है:

function isBlockElement(el) { 
    // You may want to add a more complete list of block level element 
    // names on the next line 
    return /h[1-6]|div|p/i.test(el.tagName); 
} 

var sel = rangy.getSelection(); 
if (sel.rangeCount) { 
    var range = sel.getRangeAt(0); 
    var blockElements = range.getNodes([1], isBlockElement); 
    console.log(blockElements); 
} 
+0

मुझे कोई संदेह नहीं है कि यह कोड सबसे सटीक है। लेकिन lib के बड़े आकार के कारण मेरे lib के लिए आपके lib का उपयोग करना एक ओवरकिल है। इसलिए, मैंने दूसरा जवाब चुना है, भले ही इसमें कुछ समस्याएं हैं जिन्हें मुझे संभालने की आवश्यकता है। यदि दो उत्तरों चुनने का विकल्प था, तो मैं निश्चित रूप से भी आपका निशान चिन्हित करूंगा। महान lib/work रखें :) – cria

+0

@cria: पर्याप्त मेला। आप मेरे साथ क्या प्राप्त करते हैं आईई के लिए समर्थन है। –

+3

@TimDown रंगी पर आपके काम के लिए धन्यवाद। यह जटिल समस्याओं का एक सेट बहुत आसान बनाता है। –

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