У меня есть следующий код 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);
});
Это отлично подходит для элементов типа ввода = "текст". Какой элемент #souper_fancy?
$("#souper_fancy").focus(function() {
$(this).select();
});
Простое предотвращение по умолчанию при нажатии кнопки мыши вызывает постоянное включение текста. Событие MOUSEUP отвечает за очистку текста. Однако, предотвращая его поведение по умолчанию, вы не можете отменить выбор текста с помощью мыши.
Чтобы избежать этого и снова выберите текст, вы можете установить флаг на FOCUS, прочитать его с MOUSEUP и reset, чтобы будущие события 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. Не совсем уверен, но я думаю, что это может быть связано с тем, что эти три браузера повторно выдают фокусное событие, даже если поле уже имеет фокус, поэтому вы никогда не вставляете курсор (поскольку вы его снова выбираете), тогда как в IE и Opera кажется, что он этого не делает, поэтому фокусное событие больше не запускается и, следовательно, курсор встает.
Я нашел лучшее исправление в этой статье Stack, которая не имеет этой проблемы и работает во всех браузерах.
Это также должно работать в хроме:
$("#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
, иначе элемент не будет правильно прокручиваться в окно просмотра после того, как клавиатура появится на iOS.
При использовании setSelectionRange()
важно установить тип ввода text
, иначе он может вызывать исключения в Chrome (см. selectionStart/selectionEnd для типа ввода = "number" , больше не разрешено в Chrome).