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


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуй это:
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
$(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 ...
Проблема в том, что я уже не нахожусь в контексте события к тому времени, когда я знаю, нужно мне отменить выбор или нет.