As textWidth
funções fornecidas nas respostas e que aceitam a string
como argumento não levarão em conta espaços em branco à esquerda e à direita (aqueles não são renderizados no contêiner fictício). Além disso, eles não funcionarão se o texto contiver qualquer marcação html (uma sequência secundária <br>
não produzirá nenhuma saída e
retornará o comprimento de um espaço).
Este é apenas um problema para as textWidth
funções que aceitam um string
, porque se um elemento DOM é fornecido e .html()
é chamado sobre o elemento, então provavelmente não há necessidade de corrigir isso para esse caso de uso.
Mas se, por exemplo, você está calculando a largura do texto para modificar dinamicamente a largura de um input
elemento de texto conforme o usuário digita (meu caso de uso atual), você provavelmente desejará substituir os espaços à esquerda e à direita por
e codificar a string para html.
Usei a solução de philfreo, então aqui está uma versão dela que corrige isso (com comentários sobre adições):
$.fn.textWidth = function(text, font) {
if (!$.fn.textWidth.fakeEl) $.fn.textWidth.fakeEl = $('<span>').appendTo(document.body);
var htmlText = text || this.val() || this.text();
htmlText = $.fn.textWidth.fakeEl.text(htmlText).html(); //encode to Html
htmlText = htmlText.replace(/\s/g, " "); //replace trailing and leading spaces
$.fn.textWidth.fakeEl.html(htmlText).css('font', font || this.css('font'));
return $.fn.textWidth.fakeEl.width();
};