2012-02-07 4 views
10

Я подражаю текстовому редактору в своем проекте с пользовательским каретом, но собственным выбором. Есть ли способ определить, в каком направлении пользователь выбирает текст? Допустим, пользователь выбрал текст «hello world». Есть две возможности: он может начать с щелчка мышью по букве «d» и заканчивается буквой «h», или он может начинать с буквы «h» и заканчивать буквой «d». Есть ли простой способ, как отличить эти две ситуации? Спасибо.Определить направление выбора пользователя с помощью javascript

+2

Я не думаю, что объект выбора достаточно умен для этого. Вам придется записывать местоположения мыши и определять это самостоятельно. –

+0

@Diodeus Сделайте так, чтобы он принял его. И (at) OP Попробуйте добавить пользовательские сеттеры и геттеры для этих действий, используя значения по умолчанию и добавив вычисления местоположения мыши тоже. – Relic

+0

Возможно. https://stackoverflow.com/a/12652116/96100 –

ответ

15

Старый вопрос, но я думал, что я хотел бы добавить простое решение:

var sel = getSelection(), 
position = sel.anchorNode.compareDocumentPosition(sel.focusNode), 
backward = false; 
// position == 0 if nodes are the same 
if (!position && sel.anchorOffset > sel.focusOffset || 
    position === Node.DOCUMENT_POSITION_PRECEDING) 
    backward = true; 

Node.compareDocumentPosition (MDN)

4

Насколько я знаю, нет никакого свойства или события, родного Javascript, который скажет вам направление. This site детали, как отслеживать направление мыши, вы можете настроить его на свои нужды.

По существу, до тех пор, пока вы можете получить позицию мыши (либо loc.pageX, либо Y, или event.clientX или Y), вы можете написать свои собственные функции для отслеживания направления, основанного на положении и времени.

В вашем случае вы, вероятно, захотите зафиксировать это, когда пользователь имеет текст «выбрано», то есть на событие mousedown.

+0

Спасибо, я боялся, что мне придется это сделать :) – Ondra

+0

Возможно. https://stackoverflow.com/a/12652116/96100 –

+0

@TimDown Уверен, что это возможно, и ссылка, которую я предоставил, имеет один подход. Там просто нет * native * function/property (например, window.mouseDirection), который дает вам; вам нужно создать собственный код, например, в вашем примере. – Igor

1

отслеживать MouseDown X offet, а затем MouseUp Х смещения, и результат показывает направление: (используя JQuery)

var textSelectionDirection = (function(){ 
    var direction = '', mouseDownOffset = null; 

    function getDirection(e){ 
     if(e.type == 'mousedown') 
      mouseDownOffset = e.clientX; 
     else if(e.type == 'mouseup'){ 
      direction = e.clientX < mouseDownOffset ? 'left' : 'right'; 
      console.log(direction); 
     } 
    } 

    return getDirection 
})(); 

$(document).on('mousedown mouseup', textSelectionDirection); 

DEMO: http://jsfiddle.net/ffumv/

+0

В настоящее время это работает только с выбором мыши, а не с клавиатурой – vsync

1

Это должно работать:

function isBackwards(sel) { 
    var rg = document.createRange(); 
    rg.setStart(sel.anchorNode, sel.anchorOffset); 
    rg.setEnd(sel.focusNode, sel.focusOffset); 
    return !rg.toString(); 
} 

Примечание. Если вы разрешаете выбор только для разрывов и пробелов, вам необходимо изменить функцию выше, поскольку он возвратил бы true в таком случае, несмотря ни на что.

+0

Не работайте в одном текстовом узле. Работает только в том случае, если начальный и конечный узлы не совпадают. – Jordan

1

Я пытался найти решение, которое работает для меня на пару дней. Вот что я придумал, это будет работать с выбором одного диапазона:

var selection = window.getSelection(); 
var range = selection.getRangeAt(0); 
var isSelectionDown = selection.focusNode === range.endContainer; 
var isSelectionUp = selection.focusNode === range.startContainer; 

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

+0

Работает только в том случае, если выбор охватывает несколько узлов. Если не проблема, то можно свести к: 'var isReverse = selection.anchorNode! == selection.getRangeAt (0) .startContainer; ' – Pocketsand

Смежные вопросы