Как и @Travis и @Mari, я хотел сделать автоматический выбор, когда пользователь нажал на кнопку, что означает предотвращение поведения по умолчанию для события mouseup
, но не помешает пользователю нажимать вокруг. Предлагаемое мной решение, которое работает в IE11, Chrome 45, Opera 32 и Firefox 29 (это браузеры, которые я установил в настоящее время), основано на последовательности событий, связанных с щелчком мыши.
Когда вы нажимаете на текстовый ввод, который не имеет фокуса, вы получаете следующие события (среди прочих):
mousedown
: в ответ на ваш щелчок. Обработка по умолчанию поднимает focus
при необходимости и устанавливает начало выбора.
focus
: как часть обработки по умолчанию mousedown
.
mouseup
: завершение вашего клика, обработка которого по умолчанию установит окончание выбора.
Когда вы нажимаете на текстовый ввод, который уже имеет фокус, событие focus
пропускается. Как @Travis и @Mari оба сообразили, что обработку по умолчанию mouseup
необходимо предотвратить, только если происходит событие focus
. Однако, поскольку события "focus
не произошло" нет, нам нужно сделать вывод об этом, что мы можем сделать в обработчике mousedown
.
@ Решение Мари требует импорта jQuery, чего я хочу избежать. Решение @ Travis делает это путем проверки document.activeElement
. Я не знаю, почему именно его решение не работает во всех браузерах, но есть другой способ отследить, имеет ли фокус ввод текста: просто следуйте его событиям focus
и blur
.
Вот код, который работает для меня:
var blockMouseUp = false;
var customerInputFocused = false;
txtCustomer.onfocus =
function ()
{
try
{
txtCustomer.selectionStart = 0;
txtCustomer.selectionEnd = txtCustomer.value.length;
}
catch (error)
{
txtCustomer.select();
}
customerInputFocused = true;
};
txtCustomer.onblur =
function ()
{
customerInputFocused = false;
};
txtCustomer.onmousedown =
function ()
{
blockMouseUp = !customerInputFocused;
};
txtCustomer.onmouseup =
function ()
{
if (blockMouseUp)
return false;
};
Надеюсь, это кому-нибудь поможет. : -)