how to get selection inside a div using jquery/javascript

前端 未结 3 1001
难免孤独
难免孤独 2020-11-30 12:21

there are lots of code to get selection in a page, but i want a code to get selection inside a div, if the selection is outside of my div, the function must return empty str

3条回答
  •  感情败类
    2020-11-30 12:36

    This is slightly verbose because of long-winded boundary comparisons and because IE takes a different approach from other browsers, but does the job in all major browsers. It also handles multiple selections in Firefox.

    jsFiddle: http://jsfiddle.net/Q982A/2/

    Code:

    function getSelectedTextWithin(el) {
        var selectedText = "";
        if (typeof window.getSelection != "undefined") {
            var sel = window.getSelection(), rangeCount;
            if ( (rangeCount = sel.rangeCount) > 0 ) {
                var range = document.createRange();
                for (var i = 0, selRange; i < rangeCount; ++i) {
                    range.selectNodeContents(el);
                    selRange = sel.getRangeAt(i);
                    if (selRange.compareBoundaryPoints(range.START_TO_END, range) == 1 && selRange.compareBoundaryPoints(range.END_TO_START, range) == -1) {
                        if (selRange.compareBoundaryPoints(range.START_TO_START, range) == 1) {
                            range.setStart(selRange.startContainer, selRange.startOffset);
                        }
                        if (selRange.compareBoundaryPoints(range.END_TO_END, range) == -1) {
                            range.setEnd(selRange.endContainer, selRange.endOffset);
                        }
                        selectedText += range.toString();
                    }
                }
            }
        } else if (typeof document.selection != "undefined" && document.selection.type == "Text") {
            var selTextRange = document.selection.createRange();
            var textRange = selTextRange.duplicate();
            textRange.moveToElementText(el);
            if (selTextRange.compareEndPoints("EndToStart", textRange) == 1 && selTextRange.compareEndPoints("StartToEnd", textRange) == -1) {
                if (selTextRange.compareEndPoints("StartToStart", textRange) == 1) {
                    textRange.setEndPoint("StartToStart", selTextRange);
                }
                if (selTextRange.compareEndPoints("EndToEnd", textRange) == -1) {
                    textRange.setEndPoint("EndToEnd", selTextRange);
                }
                selectedText = textRange.text;
            }
        }
        return selectedText;
    }
    

    Alternatively, you could use my Rangy library, and the code becomes:

    function getSelectedTextWithin(el) {
        var selectedText = "";
        var sel = rangy.getSelection(), rangeCount = sel.rangeCount;
        var range = rangy.createRange();
        range.selectNodeContents(el);
        for (var i = 0; i < rangeCount; ++i) {
            selectedText += sel.getRangeAt(i).intersection(range);
        }
        return selectedText;
    }
    

提交回复
热议问题