JS, вывод хинта над выделенным текстом

329
10 июня 2017, 17:06

Получаю выделенный юзером текст: https://jsfiddle.net/o7qu9034/ Теперь нужно вывести над текстом хинт.

НО, даже если брать статичный хинт, который будет спрятан до момента срабатывания функции, то я элементарно не могу получить координаты, что бы его навесить чуть выше текста, ибо txt.offset - нет такого метода у getSelection, а сам кусок выделенного текста может и не быть засунут в какой либо тег. И в итоге хинт выскочит не там, где нужно.

В общем, как можно навесить хинт над конкретно выделенным текстом?

Answer 1

На основе ответа с EnSO:

function getSelectionCoordsAndText(win) { 
    win = win || window; 
    var doc = win.document; 
    var sel = doc.selection, range, rects, rect; 
    var x = 0, y = 0, text = ''; 
    if (sel) { 
        if (sel.type != "Control") { 
            range = sel.createRange(); 
            text = range.text; 
            range.collapse(true); 
            x = range.boundingLeft; 
            y = range.boundingTop; 
        } 
    } else if (win.getSelection) { 
        sel = win.getSelection(); 
        text = sel.toString(); 
        if (sel.rangeCount) { 
            range = sel.getRangeAt(0).cloneRange(); 
            if (range.getClientRects) { 
                range.collapse(true); 
                rects = range.getClientRects(); 
                if (rects.length > 0) { 
                    rect = rects[0]; 
                    x = rect.left; 
                    y = rect.top; 
                } 
            } 
            // Fall back to inserting a temporary element 
            if (x == 0 && y == 0) { 
                var span = doc.createElement("span"); 
                if (span.getClientRects) { 
                    // Ensure span has dimensions and position by 
                    // adding a zero-width space character 
                    span.appendChild( doc.createTextNode("\u200b") ); 
                    range.insertNode(span); 
                    rect = span.getClientRects()[0]; 
                    x = rect.left; 
                    y = rect.top; 
                    var spanParent = span.parentNode; 
                    spanParent.removeChild(span); 
 
                    // Glue any broken text nodes back together 
                    spanParent.normalize(); 
                } 
            } 
        } 
    } 
    return { x: x, y: y, text: text }; 
} 
$(document).on('mouseup click', function(){ 
    var selData = getSelectionCoordsAndText(); 
    if(selData.text != ''){ 
        $('#hint').show(); 
        $('#hint').css({left: selData.x, top: selData.y-10}); 
    } else { 
        $('#hint').hide(); 
    } 
}); 
$(document).ready(function(){ 
    $('#hint').on('selectstart', false); 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
<p>Этот текст можно выделять. И этот текст тоже</p> 
<p>Этот текст можно выделять. И этот текст тоже</p> 
<p>Этот текст можно выделять. И этот текст тоже</p> 
<p>Этот текст можно выделять. И этот текст тоже</p> 
<div id="hint" style="position:absolute; display:none; background-color:aqua; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none;">Hint</div>

READ ALSO
package.json Для виндовс 10

package.json Для виндовс 10

Нужен packagejson где можна скачать либо установить?Нужен для Gulp из-за него не хочет устанавливаться

302
Блок &#171;Поделиться&#187;: при нажатии на любую кнопку открывается два окна - вкладка и popup

Блок «Поделиться»: при нажатии на любую кнопку открывается два окна - вкладка и popup

Блок «Поделиться»: при нажатии на любую кнопку открывается два окна - вкладка и popupКод без изменений - просто скопирован с https://tech

230
При отводе мышки цвет ссылки должен остаться серый - jQuery

При отводе мышки цвет ссылки должен остаться серый - jQuery

Есть Меню при наведении на которое оно выделяется серым цветом,в нем есть субменю, когда уводишь мышку на субменю цвет серый пропадает и становится...

347
Как получить id текущего элемента в owl carousel?

Как получить id текущего элемента в owl carousel?

Как мне получить id текущего элемента и атрибут src текущего изображения в owl carousel?

421