2016-08-20 15 views
8

Я ищу способ отслеживания выбора текста на веб-странице. Мне нужно, чтобы какой-то код выполнялся всякий раз, когда происходит изменение выбора. Я успешно сделал это во всех основных настольных браузерах, но, похоже, не работает в Firefox для Android.JavaScript: Отслеживание выбора Изменение в Firefox для Android

Я попробовал три подхода (ни один из них работали!):

  1. Пытался поймать "mouseup" события и проверить, есть ли непустое выделения текста. Проблема заключается в том, что "mouseup" не получает , если был выбран выбор во время последовательности усечения-подъема !
  2. Пробовал делать то же самое с событием "touchend" - тот же результат.
  3. Пробовал поймать "selectionchange" события. Я видел, что это не , вызванное, когда выбор изменяется, так как ему нужен ключ конфигурации "dom.select_events.enabled". Это false по умолчанию, и я, очевидно, не может попросить своих посетителей настроить параметры браузера :-)

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

Единственное решение, о котором я могу думать сейчас, это периодический опросчик (с использованием setInterval), который проверяет наличие текста. Это определенно нечисто и неэффективно.

Любые альтернативы и/или советы будут очень полезными.

Спасибо

+0

где вы привязываете событие mouseup к телу/документу/html? попробуйте комбинацию из них. –

+0

Просто протестировал его на firefox mobile и, действительно, он не активировал какое-либо событие>.> – seahorsepip

+0

Вы можете создать опросчика, когда выбор начал использовать событие mouseup, а затем удалить poller, когда не было выбора в течение X секунд , Не могу придумать что-нибудь еще, чтобы решить это, кроме надеясь, что событие changechange скоро станет дефолтным:/ – seahorsepip

ответ

2

1) Native Text События выбора

В настоящее время опроса, кажется, единственным обходным. Однако, selectionchange событие is currently experimentally implemented in Firefox for Android Nightly. Его можно включить, установив флаг dom.select_events.enabled на true (по умолчанию false).

В Nightly строит этот флаг уже по умолчанию true, так что есть шанс, что вы можете использовать его, как правило, в течение нескольких месяцев.

 

2) Найти события, которые работают

(UNTESTED !!)

Даже если onselectstart не может использоваться продуктивно в Firefox для Android еще, единственным жизнеспособным простым решением является опрос ,

Для улучшения производительности и снижения издержек, может быть запущен опрос в окне blur event. Потому что всякий раз, когда пользователь делает выбор, фокус должен быть установлен на видовом экране (непроверен).

window.addEventListener('blur', function(){ 
    // start polling for text selections 
}); 

Когда внимание уделяется назад, опрос может быть остановлен.

window.addEventListener('focus', function(){ 
    // stop polling 
}); 

Для проверки, если браузер действительно поддерживает события выбора текста, вы можете использовать эту функцию:

var browserSupportsTextSelectionEvents = function(){ 
    return !!('onselectstart' in document.body); 
} 

 

3) хакерство

Третья идея заключается в том, чтобы отключить выбор текста для мобильных пользователей Firefox через CSS (-moz-user-select: none), реализовать пользовательский текст selec в зависимости от положения начала и конца касания и нажатия на собственный диапазон выбора обратно в браузер через HTMLElement.setSelectionRange().

+0

Да, опрос, кажется, единственный выход на данный момент, по крайней мере до тех пор, пока «порядок выбора» не будет принят в стабильный канал. В любом случае, спасибо за ваши результаты, связанные с эффективностью, когда начинать/останавливать опроллера. Хотя я еще не проверял это, это похоже на путь вперед. Благодарю. – techfoobar

+0

Я думаю, что метод «взлома» (3) является наиболее перспективным. Я не могу попробовать, потому что у меня нет Android + Firefox, чтобы проверить его, но с этим решением опроса не требуется. Просто запустите 'window.getSelection()' после события 'touchhend'. Это событие будет запущено, если пользовательский выбор отключен через CSS. – Gerald