Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Выделять текст БЕЗ удерживания ЛКМ. (https://javascript.ru/forum/events/56286-vydelyat-tekst-bez-uderzhivaniya-lkm.html)

Teamur 08.06.2015 19:32

Выделять текст БЕЗ удерживания ЛКМ.
 
Текст:
Это нереально осуществить?

Задача:
Выделение текста двумя кликами (I - текстовый курсор):
1й делаем здесь: Это неIреально осуществить?
2й делаем здесь: Это нереальноI осуществить?

Будет выделено: реально

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

Смотрел про Range, Selection (JavaScript) и нихрена (извиняюсь) не понял, как решить казалось бы простую задачу!

Может быть можно как-то программно удерживать левую кнопку мыши, типа mousepressed. Может ли JavaScript получить состояние кнопки мыши, а потом поддерживать его, мол 0 - кнопка не нажата, а 1 - нажата?

Помогите, пожалуйста, товарищи!

Rise 08.06.2015 20:56

Teamur, а такое выделение на каждый второй клик раздражать не будет?

Teamur 08.06.2015 21:54

Нет )
Насколько я понял так называемая граничная точка выделения (boundary point) появляется лишь когда пользователь зажимает и отводит курсор. (https://learn.javascript.ru/range-textrange-selection)

Длительное удерживание кнопки мыши нажатой напрягает мышцы, особенно если нужно выделить большой фрагмент текста. А тут 2 спокойных щелчка в начале и конце фрагмента и он выделен.

Данная фишка, так сказать, будет реализовываться в блоке в режиме contenteditable. Пользователь устанавливает текстовый курсор и как только он это сделает, скрипт должен включить выделение как если бы пользователь стал удерживать лкм.

рони 08.06.2015 22:19

Teamur,
если не заморачиватся -- выделение текста только слева на право и без ie8
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body>
 <p id="content">Это <b>нереально</b> осуществить?</p>
 <script>
var s = [], d = document.getElementById("content"), el;
function setSelect() {
    var a = window.getSelection(),
        c = a.anchorOffset;
    if (s.length) {
        var b = document.createRange();
        b.setStart(el, s.shift());
        b.setEnd(a.anchorNode, c);
        a.removeAllRanges();
        a.addRange(b)
    } else {s.push(c); el = a.anchorNode}
};
d.onclick = setSelect
 </script>

</body>

</html>

Teamur 08.06.2015 22:28

Отлично, но выделение какое-то не отзывчивое, как-то через раз.
А можно ли сделать так, чтобы скрипт сам "зажал" лкм как только курсор будет установлен? Спасибо.
Типа Mousedown fixed - двигаем курсор, а за ним всё выделяется - второй клик и готово )
Конечно, я понимаю на словах все просто, но в реальности (

рони 08.06.2015 22:40

Teamur,
Цитата:

Сообщение от Teamur
как-то через раз.

значит был в начале правый клик :)
Цитата:

Сообщение от Teamur
А можно ли сделать так, чтобы скрипт сам "зажал" лкм как только курсор будет установлен?

рекомендую мульфильм - двое из ларца

и весь этот скрипт заменяет клавиша Shift -- вам трудно второй клик сделать с нажатым шифтом?

Teamur 08.06.2015 22:46

О точно, можно ведь имитировать нажатие шифта. )
Желание реализовать эту функцию в итоге привело к тому, что я зарегистрировался на этом сайте, так как запутался в десятках вкладок и потерялся в море информации, так и не нашел ничего подобного.

рони 08.06.2015 22:50

Цитата:

Сообщение от Teamur
имитировать нажатие шифта

когда вы это сотворите програмно -
Цитата:

Сообщение от Teamur
Range, Selection

будут для вас как семечки :dance:

Teamur 08.06.2015 22:57

Значит Javascript не такой могущественный как я считал ранее. Всего то нужно 2 клика. Может так: клик в блоке - выделяет всё, что в нем находится, но в стилях мы специально скроем фон выделения (100% прозрачность). Далее 2 кликами мы просто будем обрубать то, что находится снаружи.

Teamur 08.06.2015 22:59

Честно говоря, я без понятия как решить задачу. Я бы сразу добавил скрипт в избранное! ))
Двое из ларца: "И так сойдет! )))"
Не хотелось бы, чтобы это сообщение было последним в теме!


Часовой пояс GMT +3, время: 06:53.