Get selected text position and place an element next to it

前端 未结 3 1425
挽巷
挽巷 2020-11-27 02:49

tl;dr

The idea is to allow a user to mark any text and see menu pop-up just next to the selection, with possible actions to apply to the selected text.


<
3条回答
  •  我在风中等你
    2020-11-27 03:09

    You could position a marker span at the end of the selection, get its coordinates using jQuery, place your button at those coordinates and remove the marker span.

    The following should get you started:

    var markSelection = (function() {
        var markerTextChar = "\ufeff";
        var markerTextCharEntity = "";
    
        var markerEl, markerId = "sel_" + new Date().getTime() + "_" + Math.random().toString().substr(2);
    
        var selectionEl;
    
        return function(win) {
            win = win || window;
            var doc = win.document;
            var sel, range;
            // Branch for IE <= 8 
            if (doc.selection && doc.selection.createRange) {
                // Clone the TextRange and collapse
                range = doc.selection.createRange().duplicate();
                range.collapse(false);
    
                // Create the marker element containing a single invisible character by creating literal HTML and insert it
                range.pasteHTML('' + markerTextCharEntity + '');
                markerEl = doc.getElementById(markerId);
            } else if (win.getSelection) {
                sel = win.getSelection();
                range = sel.getRangeAt(0).cloneRange();
                range.collapse(false);
    
                // Create the marker element containing a single invisible character using DOM methods and insert it
                markerEl = doc.createElement("span");
                markerEl.id = markerId;
                markerEl.appendChild( doc.createTextNode(markerTextChar) );
                range.insertNode(markerEl);
            }
    
            if (markerEl) {
                // Lazily create element to be placed next to the selection
                if (!selectionEl) {
                    selectionEl = doc.createElement("div");
                    selectionEl.style.border = "solid darkblue 1px";
                    selectionEl.style.backgroundColor = "lightgoldenrodyellow";
                    selectionEl.innerHTML = "<- selection";
                    selectionEl.style.position = "absolute";
    
                    doc.body.appendChild(selectionEl);
                }
    
                // Find markerEl position http://www.quirksmode.org/js/findpos.html
            var obj = markerEl;
            var left = 0, top = 0;
            do {
                left += obj.offsetLeft;
                top += obj.offsetTop;
            } while (obj = obj.offsetParent);
    
                // Move the button into place.
                // Substitute your jQuery stuff in here
                selectionEl.style.left = left + "px";
                selectionEl.style.top = top + "px";
    
                markerEl.parentNode.removeChild(markerEl);
            }
        };
    })();
    

提交回复
热议问题