2013-05-24 6 views
7

सहित संतोषजनक div में कैरेट स्थिति प्राप्त करें मेरे पास एक संतोषजनक div है जिसमें मेरे पास एकाधिक टैग (बीआर, बी, यू, i) और टेक्स्ट हैं और मुझे div के सापेक्ष कैरेट स्थिति प्राप्त करने की आवश्यकता है, जिसमें सभी टैग शामिल हैं ।टैग

उदाहरण के लिए:

<div id="h" contenteditable="true">abc<b>def<br>ghi</b>jkl</div> 

कर्सर जी और एच के बीच है, तो मैं कैरट स्थिति की जरूरत है 14. होने की समस्या है कि पाया तरीकों कि एक treeWalker का उपयोग इस मामले में काम नहीं करते । बोल्ड टैग नहीं मिला है ... शायद क्योंकि यह बंद नहीं है। इसके अलावा मैंने कई तरीकों की कोशिश की है लेकिन अभी भी कोई भाग्य नहीं है।

मुझे इसे फ़ायरफ़ॉक्स में काम करने की आवश्यकता है। धन्यवाद।

+0

क्यों आप की जरूरत है यह अंक? यह अनिवार्य रूप से अर्थहीन है क्योंकि अलग-अलग HTML के साथ एक ही डोम का प्रतिनिधित्व करने के कई तरीके हैं जो संख्या को प्रभावित करेंगे (उदाहरण के लिए '
' '
' के चरण में)। मुझे लगता है कि आप इसे चाहते हैं ताकि आप सर्वर से ब्राउज़र में भेजे जा रहे HTML स्ट्रिंग के सापेक्ष ऑफसेट प्राप्त कर सकें। –

+0

हां ... यही कारण है कि मुझे संख्या की आवश्यकता है। मैंने कई साधनों की कोशिश की है लेकिन अभी भी कोई सफलता नहीं है। – helldrain

+1

DOM के माध्यम से मूल HTML स्ट्रिंग को वापस पाने का कोई तरीका नहीं है, इसलिए आपको पृष्ठ को अजाक्स के माध्यम से फिर से अनुरोध करने की आवश्यकता होगी, HTML को पार्स करें और इसे वर्तमान DOM से मेल करें। यह काफी मुश्किल होने जा रहा है। –

उत्तर

20

क्या आपने यह कोशिश की है? Get a range's start and end offset's relative to its parent container

jsfiddle को सीधा लिंक: https://jsfiddle.net/TjXEG/1/

समारोह कोड:

function getCaretCharacterOffsetWithin(element) { 
    var caretOffset = 0; 
    if (typeof window.getSelection != "undefined") { 
     var range = window.getSelection().getRangeAt(0); 
     var preCaretRange = range.cloneRange(); 
     preCaretRange.selectNodeContents(element); 
     preCaretRange.setEnd(range.endContainer, range.endOffset); 
     caretOffset = preCaretRange.toString().length; 
    } else if (typeof document.selection != "undefined" && document.selection.type != "Control") { 
     var textRange = document.selection.createRange(); 
     var preCaretTextRange = document.body.createTextRange(); 
     preCaretTextRange.moveToElementText(element); 
     preCaretTextRange.setEndPoint("EndToEnd", textRange); 
     caretOffset = preCaretTextRange.text.length; 
    } 
    return caretOffset; 
} 

function showCaretPos() { 
    var el = document.getElementById("test"); 
    var caretPosEl = document.getElementById("caretPos"); 
    caretPosEl.innerHTML = "Caret position: " + getCaretCharacterOffsetWithin(el); 
} 

document.body.onkeyup = showCaretPos; 
document.body.onmouseup = showCaretPos; 
+7

आपके उत्तर के लिए धन्यवाद। समस्या यह है कि
को कैरेट स्थिति निर्धारित करते समय ध्यान में नहीं रखा जाता है। – helldrain

+1

@helldrain मुझे आश्चर्य है कि क्या आप एक समाधान ढूंढने में कामयाब रहे हैं जिसमें टैग शामिल हैं। –

+0

कोई ऐसा फ़ंक्शन है जिसमें टैग की लंबाई भी शामिल है। ? –

3

सिर्फ इस करना था तो वहाँ है कुछ काम कर समाधान (कुछ परीक्षण की आवश्यकता हो सकती)

मूल विचार यह है:

  1. textContent स्थिति इस पद्धति का उपयोग मिलता है: अगर HTML टैग या संस्था का सामना करना पड़ा है, textContent स्थिति

  2. के एक तत्व के innerHTML के माध्यम से Get caret (cursor) position in contentEditable area containing HTML content

  3. पुनरावृति सामान्य चार जब तक यह के माध्यम से पुनरावृति, तो

  4. जारी रखने के लिए

नमूना यहाँ कोड:

function getHTMLCaretPosition(element) { 
var textPosition = getCaretPosition(element), 
    htmlContent = element.innerHTML, 
    textIndex = 0, 
    htmlIndex = 0, 
    insideHtml = false, 
    htmlBeginChars = ['&', '<'], 
    htmlEndChars = [';', '>']; 


if (textPosition == 0) { 
    return 0; 
} 

while(textIndex < textPosition) { 

    htmlIndex++; 

    // check if next character is html and if it is, iterate with htmlIndex to the next non-html character 
    while(htmlBeginChars.indexOf(htmlContent.charAt(htmlIndex)) > -1) { 
    // console.log('encountered HTML'); 
    // now iterate to the ending char 
    insideHtml = true; 

    while(insideHtml) { 
     if (htmlEndChars.indexOf(htmlContent.charAt(htmlIndex)) > -1) { 
     if (htmlContent.charAt(htmlIndex) == ';') { 
      htmlIndex--; // entity is char itself 
     } 
     // console.log('encountered end of HTML'); 
     insideHtml = false; 
     } 
     htmlIndex++; 
    } 
    } 
    textIndex++; 
} 

//console.log(htmlIndex); 
//console.log(textPosition); 
// in htmlIndex is caret position inside html 
return htmlIndex; 
} 
+3

आप मेरे नायक हैं। यह खूबसूरती से काम किया और मुझे आँसू के घंटे बचाया। –