Text selection in div(contenteditable) when double click

后端 未结 2 1783
情歌与酒
情歌与酒 2020-12-06 06:48

I have div with some text and contenteditable=\"true\". When I single click on this div - works some my scripts, it is not very important. And when I double click on this di

相关标签:
2条回答
  • 2020-12-06 07:28

    Every current major browser provides an API to create a range from a mouse event, although there are four different code branches needed.

    Here is some background:

    • https://stackoverflow.com/a/10659990/96100
    • https://stackoverflow.com/a/12705894/96100
    • Creating a collapsed range from a pixel position in FF/Webkit

    Here's a demo: http://jsfiddle.net/timdown/krtTD/10/

    And here's some code:

    function getMouseEventCaretRange(evt) {
        var range, x = evt.clientX, y = evt.clientY;
    
        // Try the simple IE way first
        if (document.body.createTextRange) {
            range = document.body.createTextRange();
            range.moveToPoint(x, y);
        }
    
        else if (typeof document.createRange != "undefined") {
            // Try Mozilla's rangeOffset and rangeParent properties,
            // which are exactly what we want
            if (typeof evt.rangeParent != "undefined") {
                range = document.createRange();
                range.setStart(evt.rangeParent, evt.rangeOffset);
                range.collapse(true);
            }
    
            // Try the standards-based way next
            else if (document.caretPositionFromPoint) {
                var pos = document.caretPositionFromPoint(x, y);
                range = document.createRange();
                range.setStart(pos.offsetNode, pos.offset);
                range.collapse(true);
            }
    
            // Next, the WebKit way
            else if (document.caretRangeFromPoint) {
                range = document.caretRangeFromPoint(x, y);
            }
        }
    
        return range;
    }
    
    function selectRange(range) {
        if (range) {
            if (typeof range.select != "undefined") {
                range.select();
            } else if (typeof window.getSelection != "undefined") {
                var sel = window.getSelection();
                sel.removeAllRanges();
                sel.addRange(range);
            }
        }
    }
    
    document.getElementById("editor").ondblclick = function(evt) {
        evt = evt || window.event;
        this.contentEditable = true;
        this.focus();
        var caretRange = getMouseEventCaretRange(evt);
    
        // Set a timer to allow the selection to happen and the dust settle first
        window.setTimeout(function() {
            selectRange(caretRange);
        }, 10);
        return false;
    };
    
    0 讨论(0)
  • $('p').dblclick(function(event) {
      $this = $(this);
      $this.attr('contenteditable', "true");
      $this.blur();
      $this.focus();
    });
    

    http://jsfiddle.net/krtTD/90/

    0 讨论(0)
提交回复
热议问题