2010-01-26 13 views
26

मैं WYSIWYG HTML संपादक (फ़ायरफ़ॉक्स के लिए) का विस्तार कर रहा हूं, मैं चयन के चारों ओर टैग जोड़ना चाहता हूं। मुझे Mozilla Midas specification में इसे पूरा करने के लिए कोई फ़ंक्शन नहीं मिल रहा है।window.getSelection() मुझे चयनित टेक्स्ट देता है, लेकिन मुझे HTML

एचटीएमएल के साथ चयन को बदलने के लिए एक आदेश है।
तो अगर मैं चयन सामग्री पढ़ सकता हूं, तो मैं अपने टैग को इस स्ट्रिंग में जोड़ सकता हूं।

window.getSelection() लगभग काम करता है, लेकिन यह मुझे nsISelection देता है जो एक सादे-पाठ स्ट्रिंग में परिवर्तित होता है।

पीएस: document.getSelection() सादे-पाठ स्ट्रिंग को nsISelection पर वापस नहीं देता है।

+0

अरे बॉब Fanger यू यू है यू सिर्फ मुझे बता सकते हैं है.अगर के लिए किसी भी समाधान मिला। – Warrior

+0

नहीं, हमने TinyMCE पर स्विच किया, जिसने (व्यवसाय) समस्या हल की। पुनश्च। TinyMCE के पास अपने एचटीएमएलडिटर को विस्तारित करने के लिए एक महान एपीआई है। आप http://wiki.moxiecode.com/index.php/TinyMCE:API/tinymce.Editor/selection –

+0

के कार्यान्वयन की जांच कर सकते हैं, मेरा सुझाव है कि आप कुछ (अच्छी तरह से विकसित) WYSIWYG htmleditor - tinymce पर एक नज़र डालें उदाहरण - इसे समझने के लिए। :) –

उत्तर

34

DOM Range spec पर एक नज़र डालें। आप का उपयोग कर फ़ायरफ़ॉक्स में उपयोगकर्ता चयन से एक Range प्राप्त कर सकते हैं:

var range = window.getSelection().getRangeAt(0); 

ध्यान दें कि Firefox सहित कुछ ब्राउज़रों,, एकाधिक चयन, चयन के getRangeAt() विधि के माध्यम से पहुँचा जा सकता है जो अनुमति देते हैं।

Range उन नोड्स के भीतर डोम नोड्स और ऑफ़सेट के संदर्भ में व्यक्त किया गया है। एक बार जब आप अपना Range प्राप्त कर लेते हैं, तो आप जो भी चाहते हैं उसे ठीक करने के लिए सीधा नहीं है, क्योंकि सीमा की सीमाएं डोम पेड़ के विभिन्न स्तरों पर अलग-अलग नोड्स में हो सकती हैं, इसलिए टैग के साथ रेंज की सामग्री के आस-पास बस हमेशा संभव नहीं होता है। तुम्हें पता है, निम्नलिखित की तरह कुछ करने के लिए सक्षम हो सकता है, हालांकि यह एक नया ब्लॉक तत्व चयनित सामग्री को रोकने के लिए पैदा करेगा: (

var range = window.getSelection().getRangeAt(0); 
var selectionContents = range.extractContents(); 
var div = document.createElement("div"); 
div.style.color = "yellow"; 
div.appendChild(selectionContents); 
range.insertNode(div); 

एक और, hacky, वैकल्पिक चयन को संशोधित करने के document की execCommand() विधि का उपयोग करने के लिए है उदाहरण के लिए इसे किसी विशेष रंग में सेट करके) और फिर उस रंग के तत्वों का चयन करने के लिए document.querySelectorAll या कुछ चयनकर्ता लाइब्रेरी का उपयोग करके और फिर स्टाइल लागू करें।

+0

अंतिम पंक्ति पर एक मामूली टाइपो है, आपको एस/स्पैन/div/ –

+0

@Will: आह हाँ की आवश्यकता है।धन्यवाद, अब तय है। –

+0

@tim समस्या यह है कि यदि मैं रेंज ऑब्जेक्ट से प्रारंभ और अंत निकालने का प्रयास करूंगा तो यह सही स्थिति नहीं लौटा रहा है जो मुझे ** window.getSelection() ** ऑब्जेक्ट के माध्यम से दे रहा है .. पाने के लिए किसी भी तरह से और यदि मैं दोनों का उपयोग करता हूं तो ** window.getSelection()। getRangeAt (0) ** रेंज स्टार्ट एंड एंड ** विंडो.getSelection() ** ऑब्जेक्ट स्टार्ट एंड एंड वैल्यू ओवरराइड करता है। किसी भी तरह से कृपया इस लिंक का पालन करें मैंने यहां पोस्ट किया है http://stackoverflow.com/questions/42113694/how-to-get-selected-text-range-and-add-color-to-the-particular- चयनित- पाठ/42114215 # 42114215 –

10

टिम डाउन का जवाब सही रास्ते पर है। हालांकि एक मुद्दा यह है कि निकालें सामग्री() डोम से चयन को हटा देगा। आप

window.getSelection().getRangeAt(0).cloneContents(); 

का उपयोग केवल चयनित चीज़ों की एक प्रति प्राप्त करने के लिए कर सकते हैं। फिर आप इसे अपने नए टैग से लपेट सकते हैं और उसके बाद चयन को प्रतिस्थापित कर सकते हैं। कई एचटीएमएल तत्वों को फैलाने वाली सीमा के बारे में टिम डाउन की चिंता निश्चित रूप से मान्य है। मुझे लगता है कि एक बार जब आप सीमा प्राप्त कर लेते हैं, तो यह एचटीएमएल को 'ठीक करता है', लेकिन जब आप इसे वापस डाल देते हैं तो इससे समस्याएं पैदा हो सकती हैं। Here रेंज ऑब्जेक्ट पर एक अच्छा संसाधन है।

+0

जब मैंने पोस्ट किया था तो मैं काफी समाप्त नहीं हुआ था। अब मैंने अपना जवाब पूरा कर लिया है। 'निकालने के लिए सामग्री 'का उपयोग जानबूझकर था क्योंकि आपको इसे पुन: सम्मिलित करने से पहले दस्तावेज़ से सामग्री को हटाने की आवश्यकता है। –

+0

हाँ, मुझे लगा कि निकालने के लिए निकालने का एक अच्छा तरीका होगा इसे हल करने के लिए सामग्री, मैंने सोचा कि मुझे यह इंगित करना चाहिए कि यह 'विनाशकारी' है और चयनित एचटीएमएल प्राप्त करने का एक और तरीका है। वैसे भी, अच्छा जवाब, +1। – rosscj2533

2

window.getSelection() एक ऑब्जेक्ट वापस कर देगा। आप वस्तुओं को कॉल करके स्ट्रिंग के रूप में लौटाई गई चयन ऑब्जेक्ट का उपयोग कर सकते हैं .toString() विधि।

var selObj = window.getSelection(); 
var selectedText = selObj.toString(); 

https://developer.mozilla.org/en/DOM/window.getSelection

+0

पुराना उत्तर, लेकिन मार्कअप के बिना, एक नंगे स्ट्रिंग देता है। मैंने 'अलर्ट()' के साथ परीक्षण किया है। – cst1992

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