J'ai réécrit le code de la première réponse à quelques reprises, et je pense que ce devrait être le plus rapide.
Il trouve d'abord une "Estimation" de la longueur du texte, puis ajoute ou supprime un caractère jusqu'à ce que la largeur est correct.
Je n'ai pas testé avec multilines.
La logique qu'il utilise est indiqué ci-dessous:
Après une "estimation" de la longueur du texte est trouvé, les personnages sont ajoutés ou supprimés jusqu'à ce que la largeur désirée est atteinte.
Je suis sûr qu'il a besoin de quelques ajustements, mais voici le code:
(function ($) {
$.fn.ellipsis = function () {
return this.each(function () {
var el = $(this);
if (el.css("overflow") == "hidden") {
var text = el.html().trim();
var t = $(this.cloneNode(true))
.hide()
.css('position', 'absolute')
.css('overflow', 'visible')
.width('auto')
.height(el.height())
;
el.after(t);
function width() { return t.width() > el.width(); };
if (width()) {
var myElipse = "....";
t.html(text);
var suggestedCharLength = (text.length * el.width() / t.width()) - myElipse.length;
t.html(text.substr(0, suggestedCharLength) + myElipse);
var x = 1;
if (width()) {
while (width()) {
t.html(text.substr(0, suggestedCharLength - x) + myElipse);
x++;
}
}
else {
while (!width()) {
t.html(text.substr(0, suggestedCharLength + x) + myElipse);
x++;
}
x--;
t.html(text.substr(0, suggestedCharLength + x) + myElipse);
}
el.html(t.html());
t.remove();
}
}
});
};
})(jQuery);