#jquery
#jquery
Вопрос:
Я хочу input
, чтобы значение to resize
основывалось на ширине autocomplete
выделения, а также на -internal-input-suggested
. В настоящее время ширина ввода изменяется в соответствии с размером заполнителя и значением ввода, однако автозаполнение и -internal-input-предлагаемые в настоящее время не изменяют ширину ввода в соответствии с результатом.
$(document).ready(function () {
var $inputs = $(".inputs");
// Resize based on text if text.length > 0
// Otherwise resize based on the placeholder
function resizeForText(text) {
var $this = $(this);
if (!text.trim()) {
text = $this.attr("placeholder").trim();
}
var $span = $this.parent().find("span");
$span.text(text);
var $inputSize = $span.outerWidth();
$this.css("width", $inputSize);
}
$inputs.find("input").keypress(function (e) {
if (e.which amp;amp; e.charCode) {
var c = String.fromCharCode(e.keyCode | e.charCode);
var $this = $(this);
resizeForText.call($this, $this.val() c);
}
});
// Backspace event only fires for keyup
$inputs.find("input").keyup(function (e) {
if (e.keyCode === 8 || e.keyCode === 46) {
resizeForText.call($(this), $(this).val());
}
});
$inputs.find("input").each(function () {
var $this = $(this);
resizeForText.call($this, $this.val());
});
});
.inputs input,
.inputs span {
font-size: 16px;
font-family: inherit;
white-space: pre;
padding: 5px;
}
.inputs span {
display: none
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="inputs">
<input autocomplete="email" placeholder="placeholder" />
<span style="display:none"></span>
</div>
Комментарии:
1. Вот хорошая статья об обнаружении автозаполнения с помощью js medium.com/@brunn /…
2. @sagar1025 это выглядит интересно. Сможете ли вы предоставить ответ, включающий этот метод с кодом автоматической ширины во фрагменте?
3. можете ли вы сделать демонстрацию с автозаполнением?
Ответ №1:
Вместо использования keypress
and keyup
, почему бы просто не использовать input
событие? Кроме того, я не вижу необходимости в скрытом span
элементе, который используется только для вычисления ширины. Изящный трюк в CSS заключается в использовании ch
единицы измерения, а не px
в том случае, если вам нужно установить ширину, равную длине текста.
1ch
примерно равна ширине 1 символа.
jquery
Событие input
запускается для автозаполнения и каждый раз, когда в поле ввода вводится значение.
Я также привязываю blur
событие на случай, если автозаполнение заполняет другие поля.
Изначально установите ширину input
для 11ch
, потому что длина «заполнителя» составляет 11 символов.
.inputs input {
font-size: 16px;
font-family: inherit;
}
input[type="text"] {
width: 11ch;
max-width: 50ch;
}
Вот как должен выглядеть JS:
$(document).ready(function() {
var $inputs = $(".inputs");
//this binds all input fields. No need for loop.
$("input").on('blur input', function() {
var inputLength = $(this).val().length;
if (inputLength > 0) {
$(this).css("width", inputLength 'ch');
} else {
$(this).css("width", '11ch');
}
});
});
Вот скрипка, если она вам нужна
Комментарии:
1. Спасибо за это, однако я искал решение, которое автоматически расширяло ввод при наведении на предложения автозаполнения. При наведении курсора мыши на выделение он вводит предварительный просмотр во входные данные — именно для этого предварительного просмотра мне нужна автоматическая ширина для распознавания и соответствующего расширения
2. Я не думаю, что это было бы возможно. Я не думаю, что есть способ обнаружить события мыши в окне автозаполнения