ContentEditable <div> पर कर्सर स्थिति सेट करें


142

मैं एक निश्चित, क्रॉस-ब्राउज़र समाधान के बाद कर्सर / कैरेट स्थिति को अंतिम ज्ञात स्थिति में सेट करता हूं, जब '<div>' पर ध्यान केंद्रित करता है। यह प्रतीत होता है कि एक संपादन योग्य div की सामग्री की कार्यक्षमता कार्यशील / कर्सर को उस पाठ के आरंभ में div पर ले जाने के लिए है, जब आप उस पर क्लिक करते हैं, जो अवांछनीय है।

मेरा मानना ​​है कि मुझे वर्तमान कर्सर स्थिति में एक चर में स्टोर करना होगा जब वे div का ध्यान केंद्रित कर रहे हैं, और फिर इसे फिर से सेट करें जब उनका ध्यान फिर से अंदर हो, लेकिन मैं एक साथ नहीं रख पा रहा हूं, या एक काम नहीं कर पा रहा हूं कोड नमूना अभी तक।

अगर किसी के पास कोई विचार है, तो काम करने वाले कोड स्निपेट या नमूने हैं जिन्हें देखकर मुझे खुशी होगी।

मेरे पास वास्तव में अभी तक कोई कोड नहीं है लेकिन यहाँ मेरे पास क्या है:

<script type="text/javascript">
// jQuery
$(document).ready(function() {
   $('#area').focus(function() { .. }  // focus I would imagine I need.
}
</script>
<div id="area" contentEditable="true"></div>

पुनश्च। मैंने इस संसाधन की कोशिश की है, लेकिन ऐसा प्रतीत होता है कि यह <div> के लिए काम नहीं करता है। शायद केवल textarea के लिए ( कैसे संतुष्ट सामग्री के अंत में कर्सर को स्थानांतरित करने के लिए )


मुझे नहीं पता था कि contentEditableIE-IE ब्राउज़रों में काम किया था o_o
आदित्य

10
हाँ यह आदित्य करता है।
गोनैले जूल 27'09

5
आदित्य, सफारी 2+, फ़ायरफ़ॉक्स 3+ मुझे लगता है।
पलक

Div पर tabindex = "0" सेट करने का प्रयास करें। यह सबसे ब्राउज़रों में ध्यान देने योग्य बनाना चाहिए।
टोकिमन

जवाबों:


58

यह मानकों-आधारित ब्राउज़रों के साथ संगत है, लेकिन संभवतः IE में विफल हो जाएगा। मैं इसे शुरुआती बिंदु के रूप में प्रदान कर रहा हूं। IE डोम रेंज का समर्थन नहीं करता है।

var editable = document.getElementById('editable'),
    selection, range;

// Populates selection and range variables
var captureSelection = function(e) {
    // Don't capture selection outside editable region
    var isOrContainsAnchor = false,
        isOrContainsFocus = false,
        sel = window.getSelection(),
        parentAnchor = sel.anchorNode,
        parentFocus = sel.focusNode;

    while(parentAnchor && parentAnchor != document.documentElement) {
        if(parentAnchor == editable) {
            isOrContainsAnchor = true;
        }
        parentAnchor = parentAnchor.parentNode;
    }

    while(parentFocus && parentFocus != document.documentElement) {
        if(parentFocus == editable) {
            isOrContainsFocus = true;
        }
        parentFocus = parentFocus.parentNode;
    }

    if(!isOrContainsAnchor || !isOrContainsFocus) {
        return;
    }

    selection = window.getSelection();

    // Get range (standards)
    if(selection.getRangeAt !== undefined) {
        range = selection.getRangeAt(0);

    // Get range (Safari 2)
    } else if(
        document.createRange &&
        selection.anchorNode &&
        selection.anchorOffset &&
        selection.focusNode &&
        selection.focusOffset
    ) {
        range = document.createRange();
        range.setStart(selection.anchorNode, selection.anchorOffset);
        range.setEnd(selection.focusNode, selection.focusOffset);
    } else {
        // Failure here, not handled by the rest of the script.
        // Probably IE or some older browser
    }
};

// Recalculate selection while typing
editable.onkeyup = captureSelection;

// Recalculate selection after clicking/drag-selecting
editable.onmousedown = function(e) {
    editable.className = editable.className + ' selecting';
};
document.onmouseup = function(e) {
    if(editable.className.match(/\sselecting(\s|$)/)) {
        editable.className = editable.className.replace(/ selecting(\s|$)/, '');
        captureSelection();
    }
};

editable.onblur = function(e) {
    var cursorStart = document.createElement('span'),
        collapsed = !!range.collapsed;

    cursorStart.id = 'cursorStart';
    cursorStart.appendChild(document.createTextNode('—'));

    // Insert beginning cursor marker
    range.insertNode(cursorStart);

    // Insert end cursor marker if any text is selected
    if(!collapsed) {
        var cursorEnd = document.createElement('span');
        cursorEnd.id = 'cursorEnd';
        range.collapse();
        range.insertNode(cursorEnd);
    }
};

// Add callbacks to afterFocus to be called after cursor is replaced
// if you like, this would be useful for styling buttons and so on
var afterFocus = [];
editable.onfocus = function(e) {
    // Slight delay will avoid the initial selection
    // (at start or of contents depending on browser) being mistaken
    setTimeout(function() {
        var cursorStart = document.getElementById('cursorStart'),
            cursorEnd = document.getElementById('cursorEnd');

        // Don't do anything if user is creating a new selection
        if(editable.className.match(/\sselecting(\s|$)/)) {
            if(cursorStart) {
                cursorStart.parentNode.removeChild(cursorStart);
            }
            if(cursorEnd) {
                cursorEnd.parentNode.removeChild(cursorEnd);
            }
        } else if(cursorStart) {
            captureSelection();
            var range = document.createRange();

            if(cursorEnd) {
                range.setStartAfter(cursorStart);
                range.setEndBefore(cursorEnd);

                // Delete cursor markers
                cursorStart.parentNode.removeChild(cursorStart);
                cursorEnd.parentNode.removeChild(cursorEnd);

                // Select range
                selection.removeAllRanges();
                selection.addRange(range);
            } else {
                range.selectNode(cursorStart);

                // Select range
                selection.removeAllRanges();
                selection.addRange(range);

                // Delete cursor marker
                document.execCommand('delete', false, null);
            }
        }

        // Call callbacks here
        for(var i = 0; i < afterFocus.length; i++) {
            afterFocus[i]();
        }
        afterFocus = [];

        // Register selection again
        captureSelection();
    }, 10);
};

धन्यवाद आंख, मैंने आपके समाधान की कोशिश की, मैं थोड़ा जल्दी में था लेकिन इसे ऊपर उठाने के बाद, यह केवल अंतिम फोकस बिंदु पर "-" स्थिति रखता है (जो डिबग मार्कर प्रतीत होता है?) और जब हम हार जाते हैं? ध्यान दें, जब मैं वापस क्लिक करता हूं, तो यह कर्सर / कैरेट को पुनर्स्थापित नहीं करता है (कम से कम क्रोम में नहीं, मैं एफएफ की कोशिश करूंगा), यह सिर्फ div के अंत में जाता है। इसलिए मैं नीको के समाधान को स्वीकार करूंगा क्योंकि मुझे पता है कि यह सभी ब्राउज़रों में संगत है, और अच्छा काम करता है। यद्यपि आपके प्रयास के लिए बहुत बहुत धन्यवाद।
गोनेले

3
क्या आप जानते हैं कि मेरी आखिरी प्रतिक्रिया को भूल जाइए, आपका और निको दोनों का परीक्षण करने के बाद, आपका वह नहीं है जो मैंने अपने विवरण में मांगा था, लेकिन मुझे जो पसंद है और जो मुझे महसूस हुआ है। आपका सही ढंग से कर्सर का स्थान सेट करता है, जहाँ आप ध्यान केंद्रित करते हैं कि एक नियमित पाठ बॉक्स की तरह <div> पर ध्यान केंद्रित करें। अंतिम बिंदु पर ध्यान केंद्रित करना उपयोगकर्ता के अनुकूल प्रवेश क्षेत्र बनाने के लिए पर्याप्त नहीं है। मैं आपको अंक प्रदान करूंगा।
गोनेले

9
बहुत अच्छा काम करता है! यहाँ उपरोक्त समाधान का एक jsfiddle है: jsfiddle.net/s5xAr/3
vaughan

4
असली जावास्क्रिप्ट पोस्ट करने के लिए धन्यवाद, भले ही ओपी बाहर घूम गया और एक रूपरेखा का उपयोग करना चाहता था।
जॉन

cursorStart.appendChild(document.createTextNode('\u0002'));हमारे विचार से एक उचित प्रतिस्थापन है। के लिए - चार। कोड के लिए धन्यवाद
17

97

यह समाधान सभी प्रमुख ब्राउज़रों में काम करता है:

saveSelection()div की घटनाओं से जुड़ा हुआ है onmouseupऔर onkeyupचर के लिए चयन बचाता है savedRange

restoreSelection()onfocusdiv की घटना से जुड़ा हुआ है और में सहेजे गए चयन को फिर से दर्शाता है savedRange

यह पूरी तरह से तब तक काम करता है जब तक कि आप चयन को बहाल नहीं करना चाहते हैं जब उपयोगकर्ता div aswell पर क्लिक करता है (जो कि थोड़ा सा अनपेक्षित है जैसा कि आमतौर पर आप कर्सर को जाने की उम्मीद करते हैं जहां आप क्लिक करते हैं लेकिन पूर्णता के लिए शामिल कोड)

इसे प्राप्त करने के लिए onclickऔर onmousedownईवेंट को रद्द करने के लिए फ़ंक्शन cancelEvent()जो इवेंट को रद्द करने के लिए एक क्रॉस ब्राउज़र फ़ंक्शन है। cancelEvent()समारोह भी चलाता है restoreSelection()क्योंकि के रूप में क्लिक करें घटना को रद्द कर दिया है div फोकस प्राप्त नहीं होता है और जब तक यह काम करता है चलाया जाता है इसलिए कुछ भी नहीं सब पर चयन किया जाता है समारोह।

चर isInFocusस्टोर करता है चाहे वह फ़ोकस में हो और "झूठे" onblurऔर "सच" में बदल जाए onfocus। यह क्लिक इवेंट को केवल तभी रद्द करने की अनुमति देता है जब डिव फोकस में न हो (अन्यथा आप चयन बिल्कुल नहीं बदल पाएंगे)।

यदि आप चयन को बदलने की इच्छा रखते हैं जब div पर एक क्लिक से ध्यान केंद्रित किया जाता है, और चयन को पुनर्स्थापित नहीं किया जाता है onclick(और केवल तब जब प्रोग्राम का उपयोग कर document.getElementById("area").focus();या समान रूप से तत्व पर ध्यान दिया जाता है, तो बस onclickऔर onmousedownईवेंट हटा दें । onblurईवेंट onDivBlur()और cancelEvent()फ़ंक्शन। इन परिस्थितियों में भी सुरक्षित रूप से हटाया जा सकता है।

यदि आप इसे जल्दी से परीक्षण करना चाहते हैं तो यह कोड काम करना चाहिए सीधे html पृष्ठ के शरीर में

<div id="area" style="width:300px;height:300px;" onblur="onDivBlur();" onmousedown="return cancelEvent(event);" onclick="return cancelEvent(event);" contentEditable="true" onmouseup="saveSelection();" onkeyup="saveSelection();" onfocus="restoreSelection();"></div>
<script type="text/javascript">
var savedRange,isInFocus;
function saveSelection()
{
    if(window.getSelection)//non IE Browsers
    {
        savedRange = window.getSelection().getRangeAt(0);
    }
    else if(document.selection)//IE
    { 
        savedRange = document.selection.createRange();  
    } 
}

function restoreSelection()
{
    isInFocus = true;
    document.getElementById("area").focus();
    if (savedRange != null) {
        if (window.getSelection)//non IE and there is already a selection
        {
            var s = window.getSelection();
            if (s.rangeCount > 0) 
                s.removeAllRanges();
            s.addRange(savedRange);
        }
        else if (document.createRange)//non IE and no selection
        {
            window.getSelection().addRange(savedRange);
        }
        else if (document.selection)//IE
        {
            savedRange.select();
        }
    }
}
//this part onwards is only needed if you want to restore selection onclick
var isInFocus = false;
function onDivBlur()
{
    isInFocus = false;
}

function cancelEvent(e)
{
    if (isInFocus == false && savedRange != null) {
        if (e && e.preventDefault) {
            //alert("FF");
            e.stopPropagation(); // DOM style (return false doesn't always work in FF)
            e.preventDefault();
        }
        else {
            window.event.cancelBubble = true;//IE stopPropagation
        }
        restoreSelection();
        return false; // false = IE style
    }
}
</script>

1
धन्यवाद यह वास्तव में काम करता है! आईई, क्रोम और एफएफ नवीनतम में परीक्षण किया गया। सुपर विलंबित उत्तर के बारे में क्षमा करें =)
गोनैले

if (window.getSelection)...यदि ब्राउज़र समर्थन करता है तो केवल परीक्षण नहीं करेगा getSelection, चयन नहीं है या नहीं?
सैंडी जिफोर्ड

@ कैंडी हां बिल्कुल। कोड का यह हिस्सा तय कर रहा है कि मानक getSelectionएपीआई या document.selectionIE के पुराने संस्करणों द्वारा उपयोग की जाने वाली विरासत एप का उपयोग करना है या नहीं । यदि चयन नहीं है, तो बाद में getRangeAt (0)कॉल वापस आ जाएगी null, जिसे पुनर्स्थापना फ़ंक्शन के लिए जांचा जाता है।
निको बर्न्स

@NicoBurns सही है, लेकिन दूसरे सशर्त ब्लॉक में कोड ( else if (document.createRange)) है जो मैं देख रहा हूं। यह केवल तभी कहा जाएगा जब window.getSelectionवह मौजूद नहीं है, फिर भी उपयोग करता हैwindow.getSelection
सैंडी गिफोर्ड

@NicoBurns इसके अलावा, मुझे नहीं लगता कि आपको एक ब्राउज़र मिलेगा window.getSelectionलेकिन नहीं document.createRange- जिसका अर्थ है कि दूसरा ब्लॉक कभी भी इस्तेमाल नहीं किया जाएगा ...
सैंडी गिफोर्ड

19

अपडेट करें

मैंने एक क्रॉस-ब्राउज़र रेंज और चयन लाइब्रेरी लिखी है जिसे रंगी कहा जाता है जो नीचे पोस्ट किए गए कोड के एक बेहतर संस्करण को शामिल करता है। आप इस विशेष प्रश्न के लिए चयन को बचाने और मॉड्यूल को पुनर्स्थापित करने के लिए उपयोग कर सकते हैं , हालांकि मुझे @Nico बर्न्स के उत्तर की तरह कुछ का उपयोग करने के लिए लुभाया जाएगा यदि आप अपनी परियोजना में चयनों के साथ कुछ और नहीं कर रहे हैं और थोक की आवश्यकता नहीं है पुस्तकालय।

पिछला उत्तर

आप IE के TextRange को DOM रेंज की तरह कुछ में बदलने के लिए IERange ( http://code.google.com/p/ierange/ ) का उपयोग कर सकते हैं और इसे eyelidlessness के शुरुआती बिंदु जैसे कुछ के साथ संयोजन में उपयोग कर सकते हैं। व्यक्तिगत रूप से मैं केवल IERange से एल्गोरिदम का उपयोग करूँगा जो कि रेंज <-> TextRange रूपांतरणों को पूरी बात का उपयोग करने के बजाय करते हैं। और IE की चयन वस्तु में फ़ोकस नोड और एंकरकोड गुण नहीं हैं, लेकिन आपको इसके बजाय चयन से प्राप्त रेंज / टेक्स्टरेंज का उपयोग करने में सक्षम होना चाहिए।

मैं ऐसा करने के लिए कुछ एक साथ रख सकता हूं, अगर और जब मैं करूंगा तो यहां वापस पोस्ट करूंगा।

संपादित करें:

मैंने एक स्क्रिप्ट का डेमो बनाया है जो ऐसा करता है। यह ओपेरा 9 में एक बग को छोड़कर अब तक मैंने जो कुछ भी आजमाया है, उसमें वह काम करता है, जिसे देखने के लिए मेरे पास अभी तक समय नहीं है। ब्राउज़रों यह काम करता है IE में 5.5, 6 और 7, क्रोम 2, फ़ायरफ़ॉक्स 2, 3 और 3.5, और सफारी 4, सभी विंडोज पर हैं।

http://www.timdown.co.uk/code/selections/

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

मैं जल्द ही किसी बिंदु पर इसे पूरी तरह से लिखूंगा।


15

मेरे पास एक संबंधित स्थिति थी, जहां मुझे विशेष रूप से एक संतोषप्रद div के अंत में कर्सर की स्थिति निर्धारित करने की आवश्यकता थी। मैं रंगी की तरह एक पूर्ण पुस्तकालय का उपयोग नहीं करना चाहता था, और कई समाधान बहुत भारी थे।

अंत में, मैं इस सिंपल jQuery फंक्शन के साथ एक कंटेडटेबल डिव के अंत में कैरेट पोजीशन सेट करने के लिए आया:

$.fn.focusEnd = function() {
    $(this).focus();
    var tmp = $('<span />').appendTo($(this)),
        node = tmp.get(0),
        range = null,
        sel = null;

    if (document.selection) {
        range = document.body.createTextRange();
        range.moveToElementText(node);
        range.select();
    } else if (window.getSelection) {
        range = document.createRange();
        range.selectNode(node);
        sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
    }
    tmp.remove();
    return this;
}

सिद्धांत सरल है: संपादन योग्य के अंत में एक स्पेंड को जोड़ें, इसे चुनें, और फिर स्पैन को हटा दें - हमें div के अंत में एक कर्सर के साथ छोड़ दें। आप इस समाधान को उस स्थान पर सम्मिलित करने के लिए अनुकूलित कर सकते हैं जहाँ आप चाहते हैं, इस प्रकार कर्सर को एक विशिष्ट स्थान पर रखा जा सकता है।

उपयोग सरल है:

$('#editable').focusEnd();

बस!


3
आपको सम्मिलित करने की आवश्यकता नहीं है <span>, जो गलती से ब्राउज़र के अंतर्निहित पूर्ववत स्टैक को तोड़ देगा। देखें stackoverflow.com/a/4238971/96100
टिम नीचे

6

मैंने निको बर्न्स का जवाब लिया और इसे jQuery का उपयोग करके बनाया:

  • जेनेरिक: हर के लिए div contentEditable="true"
  • छोटा

आपको jQuery 1.6 या उच्चतर की आवश्यकता होगी:

savedRanges = new Object();
$('div[contenteditable="true"]').focus(function(){
    var s = window.getSelection();
    var t = $('div[contenteditable="true"]').index(this);
    if (typeof(savedRanges[t]) === "undefined"){
        savedRanges[t]= new Range();
    } else if(s.rangeCount > 0) {
        s.removeAllRanges();
        s.addRange(savedRanges[t]);
    }
}).bind("mouseup keyup",function(){
    var t = $('div[contenteditable="true"]').index(this);
    savedRanges[t] = window.getSelection().getRangeAt(0);
}).on("mousedown click",function(e){
    if(!$(this).is(":focus")){
        e.stopPropagation();
        e.preventDefault();
        $(this).focus();
    }
});


@salivan मुझे पता है कि इसे अपडेट करने की देर है, लेकिन मुझे लगता है कि यह अब काम करता है। मूल रूप से मैंने एक नई शर्त जोड़ी और तत्व की आईडी का उपयोग करके तत्व के सूचकांक में बदल दिया, जो हमेशा मौजूद होना चाहिए :)
Gatsbimantico

4

ऊपर खेलने के बाद मैंने ऊपर की ओर पलक झपकते हुए उत्तर दिया है और इसे jQuery प्लगइन बनाया है ताकि आप इनमें से एक कर सकें:

var html = "The quick brown fox";
$div.html(html);

// Select at the text "quick":
$div.setContentEditableSelection(4, 5);

// Select at the beginning of the contenteditable div:
$div.setContentEditableSelection(0);

// Select at the end of the contenteditable div:
$div.setContentEditableSelection(html.length);

लंबे कोड पोस्ट का उपयोग करें, लेकिन यह किसी की मदद कर सकता है:

$.fn.setContentEditableSelection = function(position, length) {
    if (typeof(length) == "undefined") {
        length = 0;
    }

    return this.each(function() {
        var $this = $(this);
        var editable = this;
        var selection;
        var range;

        var html = $this.html();
        html = html.substring(0, position) +
            '<a id="cursorStart"></a>' +
            html.substring(position, position + length) +
            '<a id="cursorEnd"></a>' +
            html.substring(position + length, html.length);
        console.log(html);
        $this.html(html);

        // Populates selection and range variables
        var captureSelection = function(e) {
            // Don't capture selection outside editable region
            var isOrContainsAnchor = false,
                isOrContainsFocus = false,
                sel = window.getSelection(),
                parentAnchor = sel.anchorNode,
                parentFocus = sel.focusNode;

            while (parentAnchor && parentAnchor != document.documentElement) {
                if (parentAnchor == editable) {
                    isOrContainsAnchor = true;
                }
                parentAnchor = parentAnchor.parentNode;
            }

            while (parentFocus && parentFocus != document.documentElement) {
                if (parentFocus == editable) {
                    isOrContainsFocus = true;
                }
                parentFocus = parentFocus.parentNode;
            }

            if (!isOrContainsAnchor || !isOrContainsFocus) {
                return;
            }

            selection = window.getSelection();

            // Get range (standards)
            if (selection.getRangeAt !== undefined) {
                range = selection.getRangeAt(0);

                // Get range (Safari 2)
            } else if (
                document.createRange &&
                selection.anchorNode &&
                selection.anchorOffset &&
                selection.focusNode &&
                selection.focusOffset
            ) {
                range = document.createRange();
                range.setStart(selection.anchorNode, selection.anchorOffset);
                range.setEnd(selection.focusNode, selection.focusOffset);
            } else {
                // Failure here, not handled by the rest of the script.
                // Probably IE or some older browser
            }
        };

        // Slight delay will avoid the initial selection
        // (at start or of contents depending on browser) being mistaken
        setTimeout(function() {
            var cursorStart = document.getElementById('cursorStart');
            var cursorEnd = document.getElementById('cursorEnd');

            // Don't do anything if user is creating a new selection
            if (editable.className.match(/\sselecting(\s|$)/)) {
                if (cursorStart) {
                    cursorStart.parentNode.removeChild(cursorStart);
                }
                if (cursorEnd) {
                    cursorEnd.parentNode.removeChild(cursorEnd);
                }
            } else if (cursorStart) {
                captureSelection();
                range = document.createRange();

                if (cursorEnd) {
                    range.setStartAfter(cursorStart);
                    range.setEndBefore(cursorEnd);

                    // Delete cursor markers
                    cursorStart.parentNode.removeChild(cursorStart);
                    cursorEnd.parentNode.removeChild(cursorEnd);

                    // Select range
                    selection.removeAllRanges();
                    selection.addRange(range);
                } else {
                    range.selectNode(cursorStart);

                    // Select range
                    selection.removeAllRanges();
                    selection.addRange(range);

                    // Delete cursor marker
                    document.execCommand('delete', false, null);
                }
            }

            // Register selection again
            captureSelection();
        }, 10);
    });
};

3

आप चुनिंदाNodeContents का लाभ उठा सकते हैं जो आधुनिक ब्राउज़रों द्वारा समर्थित है।

var el = document.getElementById('idOfYoursContentEditable');
var selection = window.getSelection();
var range = document.createRange();
selection.removeAllRanges();
range.selectNodeContents(el);
range.collapse(false);
selection.addRange(range);
el.focus();

क्या इस कोड को संशोधित करना संभव है जो अंतिम उपयोगकर्ता को अभी भी किसी भी स्थिति में कैरेट को स्थानांतरित करने में सक्षम होने की अनुमति दे सकता है?
ज़ब्स

हाँ। आपको सीमा ऑब्जेक्ट पर setStart और setEnd विधियों का उपयोग करना चाहिए। developer.mozilla.org/en-US/docs/Web/API/Range/setStart
zoonman

0

फ़ायरफ़ॉक्स में आपके पास बच्चे के नोड में डिव का पाठ हो सकता है ( o_div.childNodes[0])

var range = document.createRange();

range.setStart(o_div.childNodes[0],last_caret_pos);
range.setEnd(o_div.childNodes[0],last_caret_pos);
range.collapse(false);

var sel = window.getSelection(); 
sel.removeAllRanges();
sel.addRange(range);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.