2011-11-14 17 views
18

मैं वर्तमान में माउस की स्थिति को एक सीमा में परिवर्तित करने में सक्षम होना चाहता हूं, विशेष रूप से CKEditor में।जावास्क्रिप्ट माउस स्थिति को चयन श्रेणी

CKEditor एक सीमा के अनुसार कर्सर की स्थापना के लिए एक API प्रदान करता है:

var ranges = new CKEDITOR.dom.range(editor.document); 
editor.getSelection().selectRanges([ ranges ]); 

के बाद से CKEditor इस एपीआई प्रदान करता है, समस्या इस आवश्यकता को दूर करने और सिर्फ एक रास्ता से श्रृंखला का उत्पादन करने के लिए द्वारा सरलीकृत किये जा सकते माउस विभिन्न HTML तत्वों वाले एक div पर निर्देशांक करता है।

हालांकि, यह टेक्स्टरेरा में कर्सर की स्थिति में माउस समन्वय को परिवर्तित करने जैसा नहीं है क्योंकि टेक्स्टरेअस ने कॉलम चौड़ाई और पंक्ति ऊंचाई तय की है जहां सीकेएडिटर एक आईफ्रेम के माध्यम से एचटीएमएल प्रस्तुत करता है।

this के आधार पर, ऐसा लगता है कि सीमा तत्वों पर लागू की जा सकती है।

आप वर्तमान माउस स्थिति के निकटतम प्रारंभ/समाप्ति सीमा को कैसे समझेंगे?

संपादित करें: माउसअप ईवेंट पर एक श्रेणी का चयन करने के लिए कोई व्यक्ति ckeditor API का उपयोग कैसे कर सकता है इसका एक उदाहरण।

editor.document.on('mouseup', function(e) { 
    this.focus(); 
    var node = e.data.$.target; 

    var range = new CKEDITOR.dom.range(this.document); 
    range.setStart(new CKEDITOR.dom.node(node), 0); 
    range.collapse(); 

    var ranges = []; 
    ranges.push(range); 
    this.getSelection().selectRanges(ranges); 
}); 

ऊपर के उदाहरण के साथ समस्या यह है कि घटना लक्ष्य नोड (e.data। $। लक्ष्य) केवल जैसे HTML, शरीर, या आईएमजी के रूप में, लेकिन पाठ नोड्स के लिए नहीं नोड्स के लिए फायरिंग कर रहा है। यहां तक ​​कि अगर ऐसा होता है, तो ये नोड टेक्स्ट के हिस्सों का प्रतिनिधित्व करते हैं जो टेक्स्ट के उस हिस्से में कर्सर को माउस की स्थिति में सेट करने का समर्थन नहीं करेंगे।

उत्तर

1

ऐसा करने के दो तरीके हैं, जैसे कि प्रत्येक WYSIWYG करता है।

पहला: - आप हार मानते हैं क्योंकि यह बहुत कठिन है और यह एक ब्राउज़र हत्यारा बन जाएगा;

दूसरा: - आप पाठ पार्स और मूल ऊपर एक अर्द्धपारदर्शी पाठ क्षेत्र या div में सटीक स्थान में डाल करने के लिए प्रयास करते हैं, लेकिन यहाँ हम दो समस्याएं हैं:

1) कैसे आप गतिशील पार्स होगा डेटा का हिस्सा केवल पाठ प्राप्त करने के लिए और यह सुनिश्चित करने के लिए कि आप इसे वास्तविक सामग्री की सटीक स्थिति पर मानचित्रित करते हैं

2) आप अपने द्वारा टाइप किए जाने वाले प्रत्येक डर्न कैरेक्टर या आपके द्वारा किए जाने वाले प्रत्येक कार्य के लिए विश्लेषण को कैसे हल करेंगे संपादक।

अंत में यह सिर्फ "डोम पेड़ के अंधेरे तरफ एक क्रूर ओडिसी" है, लेकिन यदि आप दूसरी पोस्ट चुनते हैं, तो आपकी पोस्ट से कोड एक आकर्षण की तरह काम करेगा।

2

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

ब्राउज़र तत्व का पता लगाना आसान है: आपको या तो प्रत्येक तत्व पर अपना हैंडलर पंजीकृत करना होगा, या ईवेंट के लक्ष्य फ़ील्ड का उपयोग करना होगा। इस पर बहुत सारी जानकारी है, अगर आपको परेशानी हो रही है तो स्टैक ओवरफ्लो पर एक और अधिक विशिष्ट प्रश्न पूछें।

एक बार आपके पास तत्व होने के बाद आपको यह पता लगाने की आवश्यकता है कि तत्व के भीतर कौन सा चरित्र क्लिक किया गया था, फिर कर्सर को वहां रखने के लिए उचित सीमा बनाएं। जैसा कि आप पोस्ट से जुड़े पोस्ट के रूप में, ब्राउज़र विविधता यह वास्तव में कठिन बनाते हैं। यह पृष्ठ थोड़ा दिनांकित है, लेकिन श्रेणियों की अच्छी चर्चा है: http://www.quirksmode.org/dom/range_intro.html

रेंज आपको पृष्ठ पर अपनी स्थिति नहीं बता सकते हैं, इसलिए आपको यह जानने के लिए एक और तकनीक का उपयोग करना होगा कि किस पाठ का क्लिक किया गया था ।

मैंने कभी जावास्क्रिप्ट में इसका पूरा समाधान नहीं देखा है। कुछ साल पहले मैंने एक पर काम किया लेकिन मैं एक ऐसे उत्तर के साथ नहीं आया जो मैं खुश था (कुछ वास्तव में कठिन किनारे के मामलों)। जिस दृष्टिकोण का मैंने उपयोग किया वह एक भयानक हैक था: टेक्स्ट में स्पैन डालें, तब तक बाइनरी खोज करने के लिए उनका उपयोग करें जब तक आप माउस क्लिक वाले सबसे छोटे संभव स्पैन को न ढूंढें। स्पैन लेआउट को नहीं बदलते हैं, ताकि आप स्पैन की स्थिति_एक्स/वाई गुणों का उपयोग करके पता लगा सकें कि उनमें क्लिक शामिल है।

उदा। मान लीजिए कि आपके पास निम्न पाठ नोड में है:

<p>Here is some paragraph text.</p> 

हम जानते हैं कि क्लिक इस पैराग्राफ में कहीं था। एक अवधि के साथ आधे में पैरा विभाजित करें: काल क्लिक निर्देशांक शामिल

<p><span>Here is some p</span>aragraph text.</p> 

हैं, कि छमाही में द्विआधारी खोज जारी रखने के, अन्यथा दूसरी छमाही खोज करते हैं।

यह एकल लाइनों के लिए बहुत अच्छा काम करता है, लेकिन यदि पाठ कई पंक्तियों को फैलाता है तो आपको पहले लाइन ब्रेक मिलना होगा, या स्पैन ओवरलैप कर सकते हैं। क्लिक करने के लिए आपको यह भी करना होगा कि क्लिक किसी भी पाठ पर नहीं था, लेकिन तत्व में था --- उदाहरण के लिए अनुच्छेद में अंतिम पंक्ति के अंत से पहले।

चूंकि मैंने इस ब्राउज़र पर काम किया है, बहुत तेज़ हो गया है। वे शायद प्रत्येक चरित्र के चारों ओर एस जोड़ने के लिए पर्याप्त तेज़ हैं, फिर प्रत्येक दो अक्षर आदि के आसपास एक बाइनरी पेड़ बनाने के लिए जो खोजना आसान है। आप इस दृष्टिकोण को आजमा सकते हैं - इससे यह काम करना आसान हो जाएगा कि आप किस लाइन पर काम कर रहे हैं।

टीएल; डीआर यह वास्तव में एक कठिन समस्या है और यदि कोई उत्तर है, तो हो सकता है कि इसके साथ आने के लिए आपका समय लायक न हो।

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