J'ai un texte de type d'entrée
<input type="text" id="txtid">
Lorsque je commence à taper du texte à l'intérieur de l'entrée, je devrais pouvoir obtenir la longueur du texte saisi.
Voici ce que j'ai essayé:
document.getElementById("txtid").offsetWidth;
et
var test = document.getElementById("txtid");
var width = (test.clientWidth + 1) + "px";
Ces deux ne donnent pas la largeur du texte saisi
Fondamentalement, ce que je veux, c'est:
Supposons que input text
la largeur est 320px
. J'ai besoin de la largeur du texte saisi, c'est-à-dire 120px
, qui ne cesse de changer lorsque j'entre.
Premier:
Vous pouvez utiliser une div avec un contenu modifiable à la place. Comme ça, vous pouvez voir la largeur de la 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>
Remarque: Comme le dit @Leon Adler, cette méthode permet de coller des images, des tableaux et un formatage à partir d'autres programmes. Vous avez donc peut-être besoin d'une validation avec javascript pour vérifier le contenu avant d'obtenir la taille.
Deuxième:
Utilisez un texte de type d'entrée et collez le contenu dans une div invisible. Et vous pouvez voir la largeur du div invisible.
var elemDiv = document.getElementById('a'),
elemInput = document.getElementById('b');
elemInput.oninput = function() {
elemDiv.innerText = elemInput.value;
console.log(elemDiv.clientWidth + 'px');
}
.div {
width: auto;
display: inline-block;
visibility: hidden;
position: fixed;
overflow:auto;
}
<input id='b' type='text'>
<div id='a' class='div'></div>
Note: Pour cette façon, vous devez avoir même police et taille de police sur input
et div
Mots clés.
J'ai légèrement modifié la réponse de Chillers, car il semble que vous souhaitiez la largeur plutôt que le nombre de lettres. J'ai créé un span, qui est absolu positionné hors de l'écran. J'ajoute ensuite la valeur de l'entrée à celle-ci, puis j'obtiens la largeur de la travée. Pour le rendre plus sophistiqué, vous pouvez créer le span avec javascript.
Notez que l'entrée et la plage doivent avoir le même style CSS pour que cela soit précis.
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>
MISE À JOUR
Deux choses que je veux mettre en avant
Ne rien afficher ne vous donnera pas de
offsetWidth
si nous essayons d'utiliser Vanilla JS. on peut utiliservisibility: hidden;
ouopacity:0
pour ça.nous devons ajouter
overflow:auto
à la cachéespan
ou bien le texte sera déformé à la ligne suivante s'il dépasse la largeur de la fenêtre du navigateur et la largeur restera fixe ( largeur de la fenêtre )
ANCIEN
Vous pouvez essayer cette approche
Ajouter un span et le cacher
<span id="value"></span>
puis onkeyup
ajoutez le texte du textfield
sur votre span caché et obtenez sa largeur.
AVEC L'AIDE DE JQUERY
EXTRAIT ( [~ # ~] mis à jour [~ # ~] )
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>
TILISATION DE JS UNIQUEMENT
EXTRAIT ( [~ # ~] mis à jour [~ # ~] )
function update(Elm,value) {
var span = document.getElementById('value');
span.innerHTML = value;
var width = span.offsetWidth;
document.getElementById('result').innerHTML = 'The width of '+ value +' is '+ width+ 'px';
}
#value{
opacity:0;
overflow:auto;
}
<input type="text" oninput='update(this,this.value)'>
<span id="value"></span>
<div id="result"></div>
La méthode Canvas measureText()
peut être utile dans un tel cas. Appelez la fonction suivante chaque fois que vous avez besoin d'obtenir la largeur de votre texte:
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;
}
Pour un résultat plus précis, vous pouvez définir le style de police sur le canevas, surtout si vous définissez certaines propriétés de police sur l'entrée. Utilisez la fonction suivante pour obtenir la police d'entrée:
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;
}
Ensuite, ajoutez cette ligne à la fonction frist:
ctx.font = font(input);