Как отменить выделение текста после начального события mousedown?

Я пытаюсь реализовать всплывающее меню на основе щелчка и удерживания, расположенного так, чтобы (действительно) медленный щелчок по-прежнему запускал действие по умолчанию, и с установленной задержкой, чтобы жест выделения текста выигрывал ' t обычно вызывает меню.

Что я не могу сделать, так это отменить выделение текста таким образом, чтобы в первую очередь не предотвратить выделение текста: возврат false из обработчика событий (или вызов $(this).preventDefault()) не позволяет пользователю вообще выбирать, и очевидный $().trigger('mouseup') вообще ничего не делает с выбором.

  • Это в общем контексте страницы, а не в конкретном текстовом поле или другом текстовом поле.
  • e.stopPropogation() не отменяет выделение текста.
  • Я не ищу выделения текста не допустить, а скорее вето их после некоторого короткого периода времени, если выполняются определенные условия.
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
8 417
6

Ответы 6

Попробуй это:

var input = document.getElementById('myInputField');
if (input) {
    input.onmousedown = function(e) {

        if (!e) e = window.event;
        e.cancelBubble = true;
        if (e.stopPropagation) e.stopPropagation();

    }
}

А если нет, прочтите:

http://www.quirksmode.org/js/introevents.html

Проблема в том, что я уже не нахожусь в контексте события к тому времени, когда я знаю, нужно мне отменить выбор или нет.

cwillu-gmail 22.09.2008 12:24

$(this).focus() (или что-то вроде document.body.focus()), похоже, помогает, хотя я не тестировал его, кроме ff3.

Я не уверен, что это точно поможет, но вот код для отмены выделения текста:

// onselectstart is IE-only
if ('undefined' !== typeof this.onselectstart) {
    this.onselectstart = function () { return false; };
} else {
    this.onmousedown   = function () { return false; };
    this.onclick       = function () { return true;  };
}

"this" в этом контексте будет элементом, для которого вы хотите предотвратить выделение текста.

В дополнение к главному потоку есть официальный способ реализовать то, что я думаю, вы хотите в DOM. Вместо событий можно использовать нечто, называемое объектом диапазона.

Считайте, (который окончательно работает на FF3)

window.onclick = function(evt)
{
   // retrieves the selection and displays its content
   var selectObj = window.getSelection();
   alert(selectObj);

   // now collapse the selection to the initial point of the selection
   var rangeObj = selectObj.getRangeAt(0);
   rangeObj.collapse(true);
}

К сожалению, это не совсем так с IE, Opera, Chrome или Safari; не уверен, почему, потому что в Opera, Chrome или Safari есть что-то, связанное с методами collapse и getRangeAt. Если я узнаю больше, я дам вам знать.


Обновление моего предыдущего ответа, который работает более универсально, - это объект выбора и методы collapse, collapseToStart, collapseToEnd. (текст ссылки)

Теперь рассмотрим 2.0 из вышеизложенного:


window.onmouseup = function(evt)
{
   var selectObj = window.getSelection();
   alert(selectObj); // to get a flavor of what you selected

   // works in FF3, Safari, Opera, and Chrome
   selectObj.collapseToStart();

   // works in FF3, Safari, Chrome (but not opera)
   /* selectObj.collapse(document.body, 0); */

   // and as the code is native, I have no idea why...
   // ...and it makes me sad
}

Мне подходит ответ на этот вопрос: Как отключить выделение текста с помощью jquery?

(Он не только отключает, но и отменяет, любое выделение текста.
По крайней мере, на моем компьютере в FF и Chrome.)

Вот что делает ответ:

    .attr('unselectable', 'on')

    '-ms-user-select': 'none',
    '-moz-user-select': 'none',
    '-webkit-user-select': 'none',
    'user-select': 'none'

    .each(function() {  // for IE
      this.onselectstart = function() { return false; };
    });

Спасибо Knight за начало универсального решения. Эта небольшая модификация также включает поддержку IE 7-10 (и, вероятно, 6).

У меня была аналогичная проблема, как у cwillu-gmail .., которую нужно было прикрепить к событию Shift-click (щелкнуть ярлык, удерживая клавишу Shift), чтобы выполнить некоторые альтернативные функции в определенном "режиме разработки". (Да, звучит странно, но это то, чего хотел клиент.) Эта часть была простой, но имела раздражающий эффект выделения текста. Это сработало для меня: (я использовал onclick, но вы можете использовать onmouseup .. зависит от того, что вы пытаетесь сделать и когда)

var element = document.getElementById("myElementId");
element.onclick = function (event)
{
    // if (event.shiftKey) // uncomment this line to only deselect text when clicking while holding shift key
    {
        if (document.selection)
        {
            document.selection.empty(); // works in IE (7/8/9/10)
        }
        else if (window.getSelection)
        {
            window.getSelection().collapseToStart(); // works in chrome/safari/opera/FF
        }
    }
}

window.getSelection().collapseToStart() работает, но, похоже, больше не отменяет выбор в Chrome ...

Mobigital 10.05.2018 00:11

Другие вопросы по теме