বিষয়বস্তুতে কার্সারের অবস্থান নির্ধারণ করুন <ডিভি>> itable


142

আমি একটি নির্দিষ্ট, ক্রস ব্রাউজার সমাধানের পরে কার্সার / ক্যারেটের অবস্থানটি সর্বশেষ জ্ঞাত স্থানে সেট করতে চাইছি যখন কোনও সামগ্রী <'ডি'> <ডিভি>> এ ফোকাস ফিরে আসে। এটি কোনও কনটেন্ট সম্পাদনাযোগ্য ডিভির ডিফল্ট কার্যকারিতা হ'ল প্রতিবার যখন আপনি ক্লিক করবেন তখন ডিভের পাঠ্য শুরুর দিকে কার্ট / কার্সার সরিয়ে নেওয়া হয় যা অনাকাঙ্ক্ষিত।

আমি বিশ্বাস করি যে যখন তারা ডিভের উপর দৃষ্টি নিবদ্ধ রেখে চলেছে তখন আমি বর্তমানের কার্সার অবস্থানে একটি পরিবর্তনশীল রাখতে হবে এবং যখন তারা আবার ভিতরে ফোকাস করবে তখন এটি পুনরায় সেট করুন, তবে আমি একসাথে রাখতে সক্ষম হইনি বা কোনও কাজ খুঁজে পাচ্ছি না কোড নমুনা এখনও।

কারও যদি কিছু চিন্তা থাকে, ওয়ার্কিং কোড স্নিপেট বা নমুনা সেগুলি দেখে আমি আনন্দিত।

আমার কাছে এখনও কোনও কোড নেই তবে আমার কাছে যা আছে তা এখানে:

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

পুনশ্চ. আমি এই সংস্থানটি চেষ্টা করেছি তবে এটি <ডিভ> এর জন্য কাজ করে না বলে মনে হয়। সম্ভবত কেবল টেক্সারিয়ার জন্য ( কীভাবে সংবেদনশীল সত্তার শেষের দিকে কার্সার সরানো যায় )


আমি contentEditableনন-আইই ব্রাউজারগুলিতে কাজ জানি না o_o
আদিত্য

10
হ্যাঁ আদিত্য করে।
GONELE

5
আদিত্য, সাফারি 2+, ফায়ারফক্স 3+ আমার মনে হয়।
পলকহীনতা

বিভাগে ট্যাবিনডেক্স = "0" সেট করার চেষ্টা করুন। এটি বেশিরভাগ ব্রাউজারে এটিকে ফোকাসযোগ্য করে তুলতে হবে।
টোকিমন

উত্তর:


58

এটি স্ট্যান্ডার্ড-ভিত্তিক ব্রাউজারগুলির সাথে সামঞ্জস্যপূর্ণ তবে সম্ভবত আইইতে ব্যর্থ হবে। আমি এটি একটি সূচনা পয়েন্ট হিসাবে প্রদান করছি। আইও ডোম রেঞ্জ সমর্থন করে না।

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);
};

ধন্যবাদ চক্ষু, আমি আপনার সমাধানটি চেষ্টা করেছিলাম, আমি কিছুটা তাড়াহুড়ো করেছিলাম তবে তারটি সরিয়ে নেওয়ার পরে এটি কেবলমাত্র "-" অবস্থানটি সর্বশেষ ফোকাস পয়েন্টে (যা একটি ডিবাগ মার্কার বলে মনে হচ্ছে?) এবং আমরা হেরে গেলে ফোকাস করুন, যখন আমি ফিরে ক্লিক করব তখন কার্সার / ক্যারেটটি পুনরুদ্ধার করা হবে বলে মনে হচ্ছে না (কমপক্ষে ক্রোমে নেই, আমি এফএফ চেষ্টা করব), এটি কেবল ডিভের শেষ দিকে যায়। সুতরাং আমি নিকোর সমাধানটি গ্রহণ করব কারণ আমি জানি এটি সমস্ত ব্রাউজারগুলিতে উপযুক্ত। যদিও আপনার প্রচেষ্টার জন্য অনেক ধন্যবাদ।
গোনিলে

3
আপনি কী জানেন, আমার শেষ প্রতিক্রিয়াটি কি ভুলে যাবেন, আপনার এবং নিকো উভয়েরই আরও পরীক্ষা করে দেখার পরে, আমি আমার বিবরণে যা চেয়েছিলাম তা আপনার নয়, তবে আমি যা পছন্দ করি এবং তা আমার উপলব্ধি বুঝতে পারে। আপনার নিয়মিত পাঠ্য বাক্সের মতো <ডিভি>> এ ফোকাস সক্রিয় করার সময় আপনি যেখানে ক্লিক করেছেন তার কার্সারের অবস্থানটি সঠিকভাবে সেট করে। ব্যবহারকারী-বান্ধব প্রবেশের ক্ষেত্রটি তৈরি করার জন্য শেষ পয়েন্টটিতে ফোকাস পুনরুদ্ধার করা যথেষ্ট নয়। আমি আপনাকে পয়েন্ট পুরষ্কার দেব।
GONELE

9
দুর্দান্ত কাজ! এখানে উপরে সমাধানের একটি jsfiddle হয় jsfiddle.net/s5xAr/3
Vaughan

4
যদিও ওপি ক্ষোভ প্রকাশ করেছে এবং একটি কাঠামো ব্যবহার করতে চেয়েছিল আসল জাভাস্ক্রিপ্ট পোস্ট করার জন্য ধন্যবাদ।
জন

cursorStart.appendChild(document.createTextNode('\u0002'));আমরা মনে করি একটি যুক্তিসঙ্গত প্রতিস্থাপন। চরের জন্য
কোডটির

97

এই সমাধানটি সমস্ত বড় ব্রাউজারগুলিতে কাজ করে:

saveSelection()সংযুক্ত onmouseupএবং onkeyupএর div ঘটনা এবং পরিবর্তনশীল নির্বাচন সংরক্ষণ savedRange

restoreSelection()onfocusডিভের ইভেন্টের সাথে সংযুক্ত থাকে এবং সেভ করা নির্বাচনটি পুনরায় প্রদর্শন করে savedRange

এটি পুরোপুরি কার্যকর হয় যদি না আপনি নির্বাচনটি পুনরুদ্ধার করতে চান তবে যখন ব্যবহারকারী ডিভকে ক্লিক করেন (যা কিছুটা অপ্রয়োজনীয় তবে সাধারণত আপনি যেখানে ক্লিক করেন সেখানে কোডারটি পূর্ণ হওয়ার জন্য কোডটি অন্তর্ভুক্ত রয়েছে)

এটি অর্জনের জন্য onclickএবং onmousedownইভেন্টগুলি ফাংশন দ্বারা বাতিল করা হয় cancelEvent()যা ইভেন্টটি বাতিল করার জন্য একটি ক্রস ব্রাউজার ফাংশন। cancelEvent()ফাংশন এছাড়াও চালায় restoreSelection()কারণ হিসাবে ক্লিক ইভেন্টটি বাতিল করা হয়েছে DIV আছে ফোকাস গ্রহণ করে না এবং যদি না এই ফাংশন চালানো হয় সেইজন্য কিছুই এ সব নির্বাচন করা হয় ফাংশন।

পরিবর্তনশীল isInFocusএটি ফোকাসে রয়েছে এবং "মিথ্যা" onblurএবং "সত্য" এ পরিবর্তিত হয়েছে কিনা তা সংরক্ষণ করে onfocus। এটি ক্লিক ইভেন্টগুলি কেবলমাত্র ডিভ ফোকাসে না থাকলে বাতিল করতে দেয় (অন্যথায় আপনি নির্বাচনটি মোটেই পরিবর্তন করতে পারবেন না)।

আপনি যদি onclickডিভকে ক্লিকের মাধ্যমে কেন্দ্রীভূত করে নির্বাচনটি পরিবর্তন করতে চান এবং নির্বাচনটি পুনরুদ্ধার না করে (এবং শুধুমাত্র যখন উপাদানটিকে প্রোগ্রামিকভাবে ব্যবহার document.getElementById("area").focus();বা অনুরূপভাবে ফোকাস দেওয়া হয় তবে কেবল ইভেন্টগুলি onclickএবং onmousedownইভেন্টগুলি সরিয়ে দিন The onblurইভেন্ট onDivBlur()এবং cancelEvent()কার্য এবং ফাংশনগুলি এই পরিস্থিতিতে নিরাপদে অপসারণ করা যেতে পারে।

আপনি যদি দ্রুত এটি পরীক্ষা করতে চান তবে এই কোডটি এইচটিএমএল পৃষ্ঠাতে সরাসরি ফেলে দেওয়া হলে কাজ করা উচিত:

<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
ধন্যবাদ এটি আসলে কাজ করে! আইই, ক্রোম এবং এফএফ সর্বশেষে পরীক্ষিত। অতি বিলম্বিত উত্তর সম্পর্কে দুঃখিত =)
GONeale

if (window.getSelection)...কেবল ব্রাউজারটি সমর্থন করলেই পরীক্ষা করবে না getSelection, নির্বাচন আছে কিনা?
Sandy Gifford

@ স্যান্ডি হ্যাঁ কোডের এই অংশটি সিদ্ধান্ত নিয়েছে যে স্ট্যান্ডার্ড getSelectionএপিআই বা document.selectionআইএসির পুরানো সংস্করণ দ্বারা ব্যবহৃত লিগ্যাসি এপি ব্যবহার করবেন কিনা । কোনও নির্বাচন না থাকলে পরবর্তী getRangeAt (0)কলটি ফিরে আসবে null, যা পুনরুদ্ধার ফাংশনে যাচাই করা হয়েছে।
নিকো বার্নস

@ নিকো বার্নস ঠিক আছে, তবে দ্বিতীয় শর্তাধীন ব্লকের কোডটি ( else if (document.createRange)) আমি যা দেখছি। এটি কেবলমাত্র window.getSelectionঅস্তিত্ব না থাকলে কল করা হবে, তবুও ব্যবহার করেwindow.getSelection
Sandy Gifford

@ নিকো বার্নস তদ্ব্যতীত, আমি মনে করি না যে আপনি কোনও ব্রাউজার পেয়েছেন window.getSelectionতবে তা নয় document.createRange- যার অর্থ দ্বিতীয় ব্লকটি কখনই ব্যবহার করা হবে না ...
স্যান্ডি গিফফোর্ড

19

হালনাগাদ

আমি রঙ্গী নামে একটি ক্রস-ব্রাউজার পরিসর এবং নির্বাচন লাইব্রেরি লিখেছি যা নীচে পোস্ট করা কোডটির একটি উন্নত সংস্করণ অন্তর্ভুক্ত করে। আপনি এই নির্দিষ্ট প্রশ্নের জন্য নির্বাচন সংরক্ষণ এবং পুনরুদ্ধার মডিউলটি ব্যবহার করতে পারেন , যদিও আমি @ নিকো বার্নসের উত্তর মত কিছু ব্যবহার করার জন্য প্রলুব্ধ হব যদি আপনি আপনার প্রকল্পে নির্বাচনের সাথে অন্য কিছু না করে থাকেন এবং একটি বড় অংশের প্রয়োজন না হয় গ্রন্থাগার।

পূর্ববর্তী উত্তর

আইই এর টেক্সটরেঞ্জকে একটি ডিওএম রেঞ্জের মতো কোনও কিছুর মধ্যে রূপান্তর করতে এবং আইলিজলেসনেস স্টার্টিং পয়েন্টের মতো কোনও কিছুর সাথে মিলিয়ে এটি ব্যবহার করতে পারেন IERange ( http://code.google.com/p/ierange/ ) can ব্যক্তিগতভাবে আমি কেবল IERange থেকে আলগোরিদিমগুলি ব্যবহার করব যা পুরো জিনিসটি ব্যবহার না করে <<> পাঠ্যরঞ্জ রূপান্তর করে do এবং আইই এর নির্বাচন বস্তুতে ফোকাসনোড এবং অ্যাঙ্করনোড বৈশিষ্ট্য নেই তবে আপনি কেবল নির্বাচনের থেকে প্রাপ্ত রেঞ্জ / টেক্সটরেঞ্জ ব্যবহার করতে সক্ষম হবেন।

আমি এটি করতে কিছু একসাথে রেখেছি, যদি এবং কখন করি তবে এখানে আবার পোস্ট করব।

সম্পাদনা করুন:

আমি একটি স্ক্রিপ্টের একটি ডেমো তৈরি করেছি যা এটি করে। অপেরা 9-তে একটি বাগ ছাড়া আমি এ পর্যন্ত যা কিছু চেষ্টা করেছি সেটিতে এটি কাজ করে, যা এখনও দেখার জন্য আমার হাতে সময় নেই। এটিতে যে ব্রাউজারগুলি কাজ করে তা হ'ল IE 5.5, 6 এবং 7, ক্রোম 2, ফায়ারফক্স 2, 3 এবং 3.5 এবং সাফারি 4 সমস্ত উইন্ডোজ।

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

নোট করুন যে বাছাইগুলি ব্রাউজারগুলিতে পিছনের দিকে করা যেতে পারে যাতে ফোকাস নোডটি নির্বাচনের শুরুতে থাকে এবং ডান বা বাম কার্সার কী চাপলে সিলেক্টটি নির্বাচনের শুরুর সাথে সম্পর্কিত অবস্থানে নিয়ে যায়। কোনও নির্বাচন পুনরুদ্ধার করার সময় এটির পুনরায় প্রতিস্থাপন করা সম্ভব বলে আমি মনে করি না, সুতরাং ফোকাস নোডটি সর্বদা নির্বাচনের শেষে থাকে।

আমি শীঘ্রই কোন এক সময়ে এটি সম্পূর্ণ লিখতে হবে।


15

আমার একটি সম্পর্কিত পরিস্থিতি ছিল, যেখানে আমি বিশেষত একটি সন্তোষজনক ডিভের সমাপ্তির জন্য কার্সারের অবস্থান নির্ধারণ করা দরকার। আমি রাঙ্গির মতো একটি পূর্ণাঙ্গ লাইব্রেরিটি ব্যবহার করতে চাইনি এবং অনেকগুলি সমাধান খুব বেশি ভারী ওজনের ছিল।

শেষ পর্যন্ত, আমি ক্যানরেট অবস্থানকে একটি সন্তোষজনক ডিভের শেষের দিকে সেট করতে এই সাধারণ 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;
}

তত্ত্বটি সহজ: সম্পাদনাযোগ্যের শেষে একটি স্প্যান যুক্ত করুন, এটি নির্বাচন করুন এবং তারপরে স্প্যানটি সরিয়ে ফেলুন - ডিভের শেষে একটি কার্সার রেখে আমাদের ছেড়ে দিন। আপনি যেখানেই চান স্প্যানটি সন্নিবেশ করানোর জন্য এই সমাধানটিকে অভিযোজিত করতে পারেন, যাতে কার্সারটিকে একটি নির্দিষ্ট স্থানে রেখে দেওয়া হয়।

ব্যবহার সহজ:

$('#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();
    }
});


@ সালিভান আমি জানি এটি আপডেট করতে দেরি হয়েছে তবে আমি মনে করি এটি এখন কার্যকর হয়েছে। মূলত আমি একটি নতুন শর্ত যুক্ত করেছি এবং উপাদানটির আইডি ব্যবহার করে উপাদান সূচকে পরিবর্তিত
হয়েছি

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

আপনি নির্বাচিত নোডকন্টেন্টগুলি উত্তোলন করতে পারেন যা আধুনিক ব্রাউজারগুলি দ্বারা সমর্থিত।

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();

শেষ ব্যবহারকারীর এখনও ক্যারেটটি যে কোনও অবস্থানে যেতে চান সেটির অনুমতি দেওয়ার জন্য কি এই কোডটি সংশোধন করা সম্ভব?
জাবস

হ্যাঁ. আপনার রেঞ্জ অবজেক্টে সেটস্টার্ট ও সেটএন্ড পদ্ধতি ব্যবহার করা উচিত। বিকাশকারী.মোজিলা.আর.ইন-
ইউএস

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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.