JavaScript 'contenteditable' — Getting/Setting Caret Position

后端 未结 6 554
别跟我提以往
别跟我提以往 2021-01-04 04:50

I have read a few posts on positioning the caret, but none seem to answer my particular issue.

  1. I have 2 divs (div1 and div2)<
6条回答
  •  旧时难觅i
    2021-01-04 05:05

    you can, basically you need set temporary content editable on your first div to catch caret pos

    $('div1').hover(function()
    { $(this).attr('contenteditable','true');
    },function()
    { $(this).removeAttr('contenteditable');
    }).mouseup(function()
    {   var t = $(this);
        // get caret position and remove content editable
        var caret = t.getCaret();
        t.removeAttr('contenteditable');
        // do your div switch stuff
        ...
        // and apply saved caret position
        $('div2').setCaret(caret);
    });
    

    now just need get/set caret method :)

    edit > here is my own, (live demo)

            getSelection:function($e)
            {   if(undefined === window.getSelection) return false;
                var range = window.getSelection().getRangeAt(0);
    
                function getTreeOffset($root,$node)
                {   if($node.parents($root).length === 0) return false; // is node child of root ?
                    var tree = [], treesize = 0;
                    while(1)
                    {   if($node.is($root)) break;
                        var index, $parent = $node.parent();
                        index = $parent.contents().index($node);
                        if(index !== -1) { tree[treesize++] = index; } $node = $parent;
                    };  return tree.reverse();
                }
    
                var start = getTreeOffset($e,$(range.startContainer));
                var end   = getTreeOffset($e,$(range.endContainer));
    
                if(start & end === false) return false;
    
                return {start:start,end:end,startOffset:range.startOffset,endOffset:range.endOffset};
            }, setSelection:function($e,s,win)
            {   $e.focus(); if(s === false) return; var sel = win.getSelection(); sel.removeAllRanges();
    
                function getNode($e,s)
                {   var node = $e;
                    for( var n=0;n

提交回复
热议问题