У меня есть следующий код jQuery (похожий на этот вопрос ), который работает в Firefox и IE, но не работает (без ошибок, просто не работает) в Chrome и Safari. Есть идеи обходного пути?
$("#souper_fancy").focus(function() { $(this).select() });
У меня есть следующий код jQuery (похожий на этот вопрос ), который работает в Firefox и IE, но не работает (без ошибок, просто не работает) в Chrome и Safari. Есть идеи обходного пути?
$("#souper_fancy").focus(function() { $(this).select() });
Ответы:
Это событие onmouseup приводит к тому, что выбор становится невыделенным, поэтому вам просто нужно добавить:
$("#souper_fancy").mouseup(function(e){ e.preventDefault(); });
источник
$('#randomfield').focus(function(event) { setTimeout(function() {$('#randomfield').select();}, 0); });
источник
Это отлично работает для элементов input type = "text". Что это за элемент #souper_fancy?
$("#souper_fancy").focus(function() { $(this).select(); });
источник
Простое предотвращение действия по умолчанию при наведении указателя мыши приводит к тому, что выделение текста всегда включено. Событие MOUSEUP отвечает за очистку выделения текста. Однако, предотвращая его поведение по умолчанию, вы не можете отменить выбор текста с помощью мыши.
Чтобы избежать этого и снова заставить выделение текста работать, вы можете установить флаг на FOCUS, прочитать его из MOUSEUP и сбросить его, чтобы будущие события MOUSEUP работали должным образом.
$("#souper_fancy").focus(function() { $(this).select(); //set flag for preventing MOUSEUP event.... $this.data("preventMouseUp", true); }); $("#souper_fancy").mouseup(function(e) { var preventEvent = $this.data("preventMouseUp"); //only prevent default if the flag is TRUE if (preventEvent) { e.preventDefault(); } //reset flag so MOUSEUP event deselect the text $this.data("preventMouseUp", false); });
источник
Хотя это работает для выбора его в IE, Firefox, Chrome, Safari и Opera, оно не позволит вам редактировать его, щелкнув второй раз в Firefox, Chrome и Safari. Не совсем уверен, но я думаю, что это может быть связано с тем, что эти 3 браузера повторно выдают событие фокуса, даже если поле уже имеет фокус, что никогда не позволяет вам фактически вставить курсор (поскольку вы выбираете его снова), тогда как в IE и Opera, похоже, этого не происходит, поэтому событие фокуса не запускалось снова, и, таким образом, курсор вставляется.
Я нашел лучшее исправление в этом сообщении стека, которое не имеет этой проблемы и работает во всех браузерах.
источник
Это должно работать и в хроме:
$("#souper_fancy").focus(function() { var tempSouper = $(this); setTimeout(function(){ tempSouper.select(); },100); });
источник
Поскольку при использовании setTimeout появляется мерцание, существует другое решение на основе событий. Таким образом, событие 'focus' присоединяет событие 'mouseup', и обработчик событий снова отключается.
function selectAllOnFocus(e) { if (e.type == "mouseup") { // Prevent default and detach the handler console.debug("Mouse is up. Preventing default."); e.preventDefault(); $(e.target).off('mouseup', selectAllOnFocus); return; } $(e.target).select(); console.debug("Selecting all text"); $(e.target).on('mouseup', selectAllOnFocus); }
Затем подключите первое событие
$('.varquantity').on('focus', selectAllOnFocus);
источник
Используйте
setSelectionRange()
внутри обратного вызова, чтобыrequestAnimationFrame()
:$(document).on('focus', '._selectTextOnFocus', (e) => { var input = e.currentTarget; var initialType = e.currentTarget.type; requestAnimationFrame(() => { // input.select() is not supported on iOS // If setSelectionRange is use on a number input in Chrome it throws an exception, // so here we switch to type text first. input.type = "text"; input.setSelectionRange(0, Number.MAX_SAFE_INTEGER || 9999); input.type = initialType; }); });
Использовать
setSelectionRange()
вместо,select()
посколькуselect()
не работает в мобильном Safari (см. Программный выбор текста в поле ввода на устройствах iOS (мобильный Safari) ).requestAnimationFrame
Перед выделением текста необходимо подождать using , иначе элемент не будет правильно прокручен в поле зрения после появления клавиатуры на iOS.При использовании
setSelectionRange()
важно установить тип вводаtext
, иначе в Chrome могут возникнуть исключения (см. SelectionStart / selectionEnd о input type = "number", больше не разрешенном в Chrome ).источник
Если кто-то снова столкнется с этой проблемой, у меня есть чистое JS-решение, которое (на данный момент) работает во всех браузерах, включая. мобильный
<input type="text" value="Hello world..." onFocus="window.setTimeout(() => this.select());">
(без setTimeout () он не работает в Safari, мобильном Safari и MS Edge)
источник