Подтвердить что ты не робот

Получить ширину текста при вводе

У меня есть текст типа ввода

<input type="text" id="txtid">

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

Это то, что я пробовал:

document.getElementById("txtid").offsetWidth;

и

var test = document.getElementById("txtid");
var width = (test.clientWidth + 1) + "px";

Эти два не дают ширину введенного текста

В основном я хочу:

введите описание изображения здесь

Предположим, что input text width - 320px. Мне нужна ширина введенного текста i.e 120px, который продолжает меняться при входе.

4b9b3361

Ответ 1

Я вижу два пути.

Первый:

Вы можете использовать div с редактируемым содержимым вместо ввода. Таким образом, вы можете увидеть ширину div.

var elemDiv = document.getElementById('a');

elemDiv.onblur = function() {
  console.log(elemDiv.clientWidth + 'px');
}
div {
  width: auto;
  display: inline-block;
}
<div id='a' contenteditable="true">Test</div>

Ответ 2

Я немного изменил Chillers, потому что похоже, что вам нужна ширина, а не буква. Я создал пролет, который абсолютно свободен от экрана. Затем я добавляю значение ввода к нему, а затем получаю ширину диапазона. Чтобы сделать его более фантастичным, вы можете создать диапазон с помощью javascript.

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

document.getElementById("txtid").addEventListener("keyup", function(){
  var mrspan = document.getElementById("mrspan");
  mrspan.innerText = this.value;
  console.log(mrspan.offsetWidth + "px");
});
<input type="text" id="txtid">
<span id="mrspan" style="position:absolute;left:-100%;"></span>

Ответ 3

UPDATE

Две вещи, которые я хочу выдвинуть

  • Выполнение отображения none не даст вам никакого offsetWidth, если мы пытаемся использовать vanilla JS. мы можем использовать visibility: hidden; или opacity:0 для этого.

  • нам нужно добавить overflow:auto в скрытый span, иначе текст будет деформирован на следующую строку, если он превышает окно браузера ширина и ширина будут оставаться фиксированными (ширина окна)

OLD

Вы можете попробовать этот подход

Добавьте пробел и скройте его

<span id="value"></span>

а затем onkeyup добавить текст textfield в свой скрытый диапазон и получить его ширину.

С ПОМОЩЬЮ JQUERY

SNIPPET (ОБНОВЛЕНО)

function update(elm,value) {
     $('#value').text(value);
     var width =   $('#value').width();
     $('#result').text('The width of '+ value +' is '+width +'px');
   
}
#value{
  display:none;
  overflow:auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" oninput='update(this,this.value)'>
<span id="value"></span>
<div id="result"></div>

Ответ 4

Метод Canvas measureText() может быть полезен в этом случае. Вызывайте следующую функцию, когда вам нужно получить ширину текста:

function measureMyInputText() {
    var input = document.getElementById("txtid");
    var c = document.createElement("canvas");
    var ctx = c.getContext("2d");
    var txtWidth = ctx.measureText(input.value).width;

    return txtWidth;
}

Для получения более точного результата вы можете установить стиль шрифта на холст, особенно если вы установите для него некоторые свойства шрифта. Используйте следующую функцию, чтобы получить шрифт ввода:

 function font(element) {
     var prop = ["font-style", "font-variant", "font-weight", "font-size", "font-family"];
     var font = "";
     for (var x in prop)
         font += window.getComputedStyle(element, null).getPropertyValue(prop[x]) + " ";

     return font;
 }

Затем добавьте эту строку к функции frist:

ctx.font = font(input);