2008-09-22 2 views
3

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

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

  • Это общий контекст страницы, не относящейся к тексту или зоне ввода.
  • e.stopPropogation() не отменяет текст-выбор.
  • Я не смотрю на , предупреждая текст, а не veto после некоторого короткого периода времени, если выполнены определенные условия.

ответ

5

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

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

+0

Проблема заключается в том, что я не в контексте события по времени Я знаю, если мне нужно отменить выбор или нет. – 2008-09-22 08:24:19

0

$(this).focus() (или что-нибудь вдоль линий document.body.focus()), кажется, сделать трюк, хотя я не тестировал его намного выше ff3.

2

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

// 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; }; 
} 

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

4

В дополнение к верхней теме есть официальный способ реализовать то, что я думаю, что вы хотите в 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. Если я узнаю больше, я дам вам знать.


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

Теперь рассмотрим 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 
} 

0

Ответ на этот вопрос работает для меня: How to disable text selection using 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; }; 
    }); 
0

Благодаря рыцарем для начала универсального решения. Эта небольшая модификация также включает поддержку 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 
     } 
    } 
}