ตั้งค่าตำแหน่งเคอร์เซอร์บน contentEditable <div>


142

ฉันอยู่หลังโซลูชันข้ามเบราว์เซอร์ที่ชัดเจนเพื่อตั้งค่าตำแหน่งเคอร์เซอร์ / คาเร็ตเป็นตำแหน่งที่รู้จักล่าสุดเมื่อ contentEditable = 'on' <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>

PS ฉันได้ลองใช้ทรัพยากรนี้แล้ว แต่ดูเหมือนว่ามันไม่ได้ผลสำหรับ <div> บางทีเพียง textarea ( วิธีเลื่อนเคอร์เซอร์ไปที่จุดสิ้นสุดของเอนทิตีที่เป็นที่พึงพอใจ )


ฉันไม่ทราบว่าcontentEditableทำงานได้ในเบราว์เซอร์ที่ไม่ใช่ IE o_o
aditya

10
ใช่มันทำ aditya
GONeale

5
aditya, Safari 2+, Firefox 3+ ฉันคิดว่า
เปลือกตา

ลองตั้งค่า tabindex = "0" บน div ซึ่งควรทำให้สามารถโฟกัสได้ในเบราว์เซอร์ส่วนใหญ่
Tokimon

คำตอบ:


58

สิ่งนี้เข้ากันได้กับเบราว์เซอร์ที่ได้มาตรฐาน แต่อาจจะล้มเหลวใน IE ฉันให้มันเป็นจุดเริ่มต้น IE ไม่รองรับ DOM Range

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

ขอบคุณตาฉันลองใช้วิธีแก้ปัญหาของฉันฉันรีบหน่อย แต่หลังจากเดินสายแล้วมันจะวางตำแหน่ง "-" ที่จุดโฟกัสสุดท้ายเท่านั้น (ซึ่งดูเหมือนจะเป็นตัวแก้จุดบกพร่อง?) และนั่นคือเมื่อเราสูญเสีย โฟกัสดูเหมือนจะไม่เรียกคืนเคอร์เซอร์ / คาเร็ตเมื่อฉันคลิกย้อนกลับ (อย่างน้อยไม่ได้อยู่ใน Chrome ฉันจะลอง FF) มันจะไปถึงจุดสิ้นสุดของ div ดังนั้นฉันจะยอมรับโซลูชันของ Nico เพราะฉันรู้ว่ามันเข้ากันได้กับเบราว์เซอร์ทั้งหมดและมีแนวโน้มที่จะทำงานได้ดี ขอบคุณมากสำหรับความพยายามของคุณ
GONeale

3
คุณรู้ไหมลืมคำตอบสุดท้ายของฉันหลังจากตรวจสอบทั้งของคุณและของนิโก้ต่อไปคุณไม่ใช่สิ่งที่ฉันขอในคำอธิบาย แต่เป็นสิ่งที่ฉันชอบและรู้ว่าฉันต้องการ ของคุณอย่างถูกต้องตั้งตำแหน่งของเคอร์เซอร์ที่คุณคลิกเมื่อเปิดใช้งานโฟกัสกลับไปที่ <div> เช่นกล่องข้อความปกติ การกู้คืนโฟกัสไปที่จุดสุดท้ายนั้นไม่เพียงพอที่จะทำให้ฟิลด์รายการที่ใช้งานง่าย ฉันจะให้คะแนนแก่คุณ
GONeale

9
ใช้งานได้ดี! นี่คือ jsfiddle ของการแก้ปัญหาข้างต้น: jsfiddle.net/s5xAr/3
vaughan

4
ขอบคุณสำหรับการโพสต์จาวาสคริปต์จริงแม้ว่า OP จะออกและต้องการใช้เฟรมเวิร์ก
จอห์น

cursorStart.appendChild(document.createTextNode('\u0002'));เป็นสิ่งทดแทนที่เราคิดว่าสมเหตุสมผล สำหรับตัวละคร ขอบคุณสำหรับรหัส
twobob

97

วิธีนี้ใช้ได้กับเบราว์เซอร์หลัก ๆ ทั้งหมด:

saveSelection()ถูกแนบกับonmouseupและonkeyupเหตุการณ์ของ div และบันทึกการเลือกไปยังตัวแปรsavedRangeและบันทึกการเลือกให้กับตัวแปร

restoreSelection()ถูกแนบกับonfocusเหตุการณ์ของ div และเลือกการเลือกที่บันทึกไว้ใหม่savedRangeใหม่

วิธีนี้จะทำงานได้อย่างสมบูรณ์เว้นแต่คุณต้องการให้มีการเรียกคืนสิ่งที่เลือกเมื่อผู้ใช้คลิกที่ div เช่นกัน (ซึ่งค่อนข้างไม่เป็นไปตามปกติคุณคาดหวังว่าเคอร์เซอร์จะไปยังตำแหน่งที่คุณคลิก

เพื่อให้บรรลุถึงสิ่งนี้onclickและonmousedownเหตุการณ์จะถูกยกเลิกโดยฟังก์ชั่นcancelEvent()ซึ่งเป็นฟังก์ชั่นข้ามเบราว์เซอร์เพื่อยกเลิกเหตุการณ์ cancelEvent()ฟังก์ชั่นยังทำงานrestoreSelection()ฟังก์ชั่นเพราะเป็นเหตุการณ์คลิกจะถูกยกเลิก div ที่ไม่ได้รับการมุ่งเน้นและดังนั้นจึงไม่มีอะไรที่จะถูกเลือกในทุกฟังก์ชั่นนี้ยกเว้นในกรณีที่มีการเรียก

ตัวแปรจัดisInFocusเก็บว่าอยู่ในโฟกัสหรือไม่และเปลี่ยนเป็น "false" onblurและ "true"onfocus"ความจริง" การทำเช่นนี้ช่วยให้เหตุการณ์การคลิกถูกยกเลิกเฉพาะในกรณีที่ div ไม่ได้อยู่ในโฟกัส (ไม่เช่นนั้นคุณจะไม่สามารถเปลี่ยนการเลือกได้เลย)

หากคุณต้องการให้การเลือกเปลี่ยนแปลงเมื่อ 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
ขอบคุณที่ใช้งานได้จริง! ผ่านการทดสอบใน IE, Chrome และ FF ล่าสุด ขออภัยเกี่ยวกับการตอบกลับล่าช้าสุด =)
GONeale

จะไม่if (window.getSelection)...ทดสอบว่าเบราว์เซอร์รองรับgetSelectionหรือไม่มีการเลือกหรือไม่
Sandy Gifford

@Sandy ใช่แน่นอน รหัสนี้เป็นส่วนหนึ่งของการตัดสินใจว่าจะใช้getSelectionAPI มาตรฐานหรือdocument.selectionAPI ดั้งเดิมที่ใช้โดย IE รุ่นเก่ากว่า การgetRangeAt (0)โทรในภายหลังจะกลับมาnullหากไม่มีการเลือกซึ่งจะถูกตรวจสอบในฟังก์ชั่นการคืนค่า
Nico Burns

@NicoBurns ถูกต้อง แต่โค้ดในบล็อกตามเงื่อนไขที่สอง ( else if (document.createRange)) คือสิ่งที่ฉันกำลังดู มันจะถูกเรียกถ้าwindow.getSelectionไม่ได้มีอยู่ยังใช้window.getSelection
Sandy Gifford

@NicoBurns ยิ่งกว่านั้นฉันไม่คิดว่าคุณจะพบเบราว์เซอร์ที่มีwindow.getSelectionแต่ไม่ใช่document.createRange- หมายถึงบล็อกที่สองจะไม่ถูกนำมาใช้ ...
Sandy Gifford

19

ปรับปรุง

ฉันเขียนช่วงข้ามเบราว์เซอร์และห้องสมุดตัวเลือกที่เรียกว่าRangyซึ่งรวมเอาที่ปรับปรุงแล้วที่ฉันโพสต์ไว้ด้านล่าง คุณสามารถใช้โมดูลบันทึกและกู้คืนการเลือกสำหรับคำถามเฉพาะนี้ได้แม้ว่าฉันจะถูกล่อลวงให้ใช้คำตอบของ @Nico Burnsหากคุณไม่ได้ทำสิ่งใดกับการเลือกในโครงการของคุณและไม่ต้องการจำนวนมาก ห้องสมุด.

คำตอบก่อนหน้า

คุณสามารถใช้ IERange ( http://code.google.com/p/ierange/ ) เพื่อแปลง TextRange ของ IE ให้เป็นอะไรบางอย่างเช่น DOM Range และใช้ร่วมกับบางอย่างเช่นจุดเริ่มต้นของหนังตา โดยส่วนตัวแล้วฉันจะใช้อัลกอริธึมจาก IERange ที่ทำแปลง Range <-> TextRange แทนที่จะใช้ทุกอย่าง และวัตถุการเลือกของ IE ไม่มีคุณสมบัติ focusNode และ anchorNode แต่คุณควรจะสามารถใช้ Range / TextRange ที่ได้รับจากการเลือกแทน

ฉันอาจจะทำบางอย่างร่วมกันเพื่อทำสิ่งนี้จะโพสต์กลับมาที่นี่หากและเมื่อฉัน

แก้ไข:

ฉันได้สร้างตัวอย่างของสคริปต์ที่ทำสิ่งนี้ มันใช้งานได้ในทุกสิ่งที่ฉันได้ลองมาแล้วยกเว้นข้อผิดพลาดใน Opera 9 ซึ่งฉันยังไม่มีเวลาดู เบราว์เซอร์ที่ใช้งานได้คือ IE 5.5, 6 และ 7, Chrome 2, Firefox 2, 3 และ 3.5 และ Safari 4 ทั้งหมดบน Windows

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

โปรดทราบว่าการเลือกอาจทำย้อนกลับในเบราว์เซอร์เพื่อให้โหนดโฟกัสอยู่ที่จุดเริ่มต้นของการเลือกและการกดปุ่มเคอร์เซอร์ขวาหรือซ้ายจะย้ายเครื่องหมายรูปหมวกไปยังตำแหน่งที่สัมพันธ์กับจุดเริ่มต้นของการเลือก ฉันคิดว่ามันเป็นไปไม่ได้ที่จะทำซ้ำสิ่งนี้เมื่อกู้คืนสิ่งที่เลือกดังนั้นโหนดโฟกัสจะอยู่ที่ท้ายการเลือกเสมอ

ฉันจะเขียนเรื่องนี้อย่างเต็มที่ในบางจุดในไม่ช้า


15

ฉันมีสถานการณ์ที่เกี่ยวข้องซึ่งฉันจำเป็นต้องกำหนดตำแหน่งเคอร์เซอร์เป็นส่วนท้ายของ div ที่น่าพอใจ ฉันไม่ต้องการใช้ห้องสมุดที่เต็มเปี่ยมเช่น Rangy และโซลูชันจำนวนมากก็มีน้ำหนักมากเกินไป

ในท้ายที่สุดฉันมาพร้อมกับฟังก์ชั่น jQuery ง่าย ๆ นี้เพื่อกำหนดตำแหน่งกะรัตเป็นจุดสิ้นสุดของ div ที่น่าพอใจ:

$.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
Tim Down

6

ฉันตอบคำตอบของ Nico Burns และใช้ 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

หลังจากเล่นไปแล้วฉันได้แก้ไขคำตอบของ eyelidlessness ด้านบนและทำให้มันเป็นปลั๊กอิน 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

คุณสามารถใช้ประโยชน์จากselectNodeContentsซึ่งรองรับโดยเบราว์เซอร์ที่ทันสมัย

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

เป็นไปได้หรือไม่ที่จะแก้ไขรหัสนี้เพื่อให้ผู้ใช้ยังสามารถย้ายเครื่องหมายรูปหมวกไปยังตำแหน่งที่ต้องการได้?
Zabs

ใช่. คุณควรใช้เมธอด setStart & setEnd บนวัตถุช่วง developer.mozilla.org/en-US/docs/Web/API/Range/setStart
zoonman

0

ใน Firefox คุณอาจมีข้อความของ div ในโหนดลูก ( 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.