Try this http://jsfiddle.net/Qb9WX/3/
HTML
<div id="demo">
Morbi leo risus, porta ac consectetur ac, vestibulum at eros.
Donec id elit non mi porta gravida at eget metus. Nulla vitae
elit libero, a pharetra augue. Nullam id dolor id nibh
ultricies vehicula ut id elit. Vivamus sagittis lacus vel
augue laoreet rutrum faucibus dolor auctor.
</div>
JS
$(document).ready(function() {
var content = $('#demo').html();
content = content.replace(/(\w|\s)/g, '<span>$1</span>');
$('#demo').html(content);
// Check each <span> for its offsetTop
var highest_top = 0;
var tmp_top = 0;
$('#demo span').each(function() {
tmp_top = $(this)[0].offsetTop;
if (tmp_top > highest_top) {
highest_top = tmp_top;
}
});
// Collect total width
var total_width = 0;
$('#demo span').each(function() {
check_top = $(this)[0].offsetTop;
if (check_top == highest_top) {
total_width += $(this).width();
}
});
console.log(total_width);
});
You can tweak it to your own needs.
For me it gives 88px in the fiddle:

You can buffer back the original (span
-less) string into the element too after doing the calculations. This way you don't need to keep the cluttered elements.
A final note; if you use foreign characters (like the German ß
or Russian/Japanese/etc.) the regex might fail to match on \w
. You need to expand your knowledge on character-set matching then. But that goes beyond the scope of this question.
Small (delayed) update
You might want to change:
/(\w|\s)/g
to something like:
/([^\n\t])/g
This way you will match anything except tabs and newlines. I noticed the pixel count might be a bit off if you match only letters and spaces. It might miss important comma's and other read-signs.