Как мне установить обратный выбор? - PullRequest
5 голосов
/ 17 декабря 2009

Я работаю над пользовательским токеном, основанным на textarea. Идея состоит в том, чтобы текстовая область с элементами div абсолютно позиционировалась выше, поэтому она выглядит , как будто они находятся в текстовой области.

Пока это было больно, но мне удалось сделать почти все, кроме одной вещи.

Возможно ли вообще в javascript установить обратный выбор? Когда вы поместите курсор где-нибудь посередине текстовой области, удерживая нажатой клавишу Shift и несколько раз нажмите стрелку влево, вы получите выделение. Сложность в том, что это не обычное дело - оно задом наперед (начало начинается справа от конца, а не так, как обычно). В моей текстовой области есть заполнители, над которыми я отображаю свои элементы (токены). Когда вы переходите к одному из них, курсор переходит на противоположный край заполнителя, так что это кажется естественным. Когда вы удерживаете нажатой клавишу shift и достигаете заполнителя, он переходит вправо и устанавливает новый выбор, поэтому он выглядит так, как будто вы выбрали токен (вы можете нажать «Удалить» и удалить выбранный диапазон с помощью самого токена, что круто) , НО это не сработает, если вы перемещаетесь справа налево, потому что установка нового выделения сделает его необратимым:

Выбор слева направо:

abcde[start]efg[end](token)
[shift]+[right]
abcde[start]efg(token)[end]
[del]
abcde

Выбор справа налево

(token)[end]efg[start]abcde
[shift]+[left]
[start](token)abcdeefg[end] //see? it's back to normal
[shift]+[left]
[start](token)abcdeef[end]g //huh?! shift-right moves end point (unexpected)
abcde

Итак, вот вопрос: могу ли я установить выделение в текстовой области, где начальная точка будет больше конечной точки? Просто element.setSelectionRange(right, left) не работает в firefox, есть еще идеи?

1 Ответ

1 голос
/ 17 декабря 2009

Немного поэкспериментировав в консоли Firebug, я думаю, что это не тривиально. Однако вы можете перехватить событие нажатия клавиши:

Если пользователь нажимает стрелку влево, вы должны сами расширить выбор влево и вернуть false. Тогда браузер по умолчанию не вызывается, но, тем не менее, у пользователя возникает ощущение выбора влево.

textarea.onkeypress = function (event) {
  if (!event){event = window.event; /* %#$! IE */ }
  if (event.shiftKey && event.keyCode == 37 /* left */) {
    event.target.selectionStart = currentSelectionStart - 1;
  }
  return false;
};

37 - стрелка влево, 38 - вверх, 39 - вправо, 40 - вниз.

...