Las textWidthfunciones proporcionadas en las respuestas y que aceptan a stringcomo argumento no tendrán en cuenta los espacios en blanco iniciales y finales (no se representan en el contenedor ficticio). Además, no funcionarán si el texto contiene algún marcado html (una subcadena <br>no producirá ningún resultado y devolverá la longitud de un espacio).
Esto es solo un problema para las textWidthfunciones que aceptan a string, porque si se proporciona un elemento DOM y .html()se invoca sobre el elemento, entonces probablemente no haya necesidad de arreglar esto para tal caso de uso.
Pero si, por ejemplo, está calculando el ancho del texto para modificar dinámicamente el ancho de un inputelemento de texto a medida que el usuario escribe (mi caso de uso actual), probablemente querrá reemplazar los espacios iniciales y finales con y codificar la cadena a html.
Usé la solución de philfreo, así que aquí hay una versión que corrige esto (con comentarios sobre adiciones):
$.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();
};