252 votes

Détection des ellipses dans le cadre du dépassement de texte HTML

J'ai une collection d'éléments de bloc sur une page. Les règles CSS white-space, overflow, text-overflow sont définies pour que le texte qui déborde soit coupé et qu'une ellipse soit utilisée.

Cependant, tous les éléments ne débordent pas.

Est-il possible d'utiliser le javascript pour détecter les éléments qui débordent ?

Merci.

Ajouté : exemple de structure HTML avec laquelle je travaille.

<td><span>Normal text</span></td>
<td><span>Long text that will be trimmed text</span></td>

Les éléments SPAN tiennent toujours dans les cellules, la règle de l'ellipse est appliquée. Je veux détecter quand l'ellipse est appliquée au contenu textuel du SPAN.

15 votes

Pas un doublon ! Cette question porte sur un élément dans un autre, l'élément parent. Je parle du texte dans un seul élément. Dans mon cas, le SPAN dans le TD ne déborde jamais le TD, c'est le texte dans le SPAN qui déborde, et est coupé. C'est ce que j'essaie de détecter ! Désolé - j'aurais pu mieux poser ma question, je l'admets.

0 votes

Oh, j'ai oublié d'ajouter - ceci ne doit fonctionner que sur webkit si cela peut aider...

0 votes

J'ai fait Ghommey juste pour voir si ça marchait... ça ne marchait pas.

406voto

italo Points 3353

Essayez cette fonction JS, en passant l'élément span comme argument :

function isEllipsisActive(e) {
     return (e.offsetWidth < e.scrollWidth);
}

11 votes

Ceci devrait être la réponse - très élégant et fonctionne sur Chrome et IE(9)

19 votes

Cette réponse et celle d'Alex ne fonctionnent pas dans IE8 ; il y a des cas étranges où la largeur de défilement et la largeur extérieure sont les mêmes... mais il y a des ellipses, et puis des cas où elles sont les mêmes... et il n'y a PAS d'ellipses. En d'autres termes, la première solution est la seule qui fonctionne sur tous les navigateurs.

1 votes

Cela ne fonctionne pas pour moi. J'obtiens 0 tout le temps pour chaque élément, tant pour offsetWidth que pour scrollWidth, même si je peux clairement voir l'ellipse. (Et je n'utilise pas IE : j'utilise la dernière version de Chrome). jsfiddle.net/brandonzylstra/hjk9mvcy

133voto

Christian Varga Points 10299

Il fut un temps où j'avais besoin de faire cela, et la seule solution fiable pour tous les navigateurs que j'ai trouvée était hack job. Je ne suis pas le plus grand fan de ce genre de solution, mais elle produit certainement le bon résultat à chaque fois.

L'idée est de cloner l'élément, de supprimer toute largeur de délimitation et de tester si l'élément cloné est plus large que l'original. Si c'est le cas, vous savez qu'il a été tronqué.

Par exemple, en utilisant jQuery :

var $element = $('#element-to-test');
var $c = $element
           .clone()
           .css({display: 'inline', width: 'auto', visibility: 'hidden'})
           .appendTo('body');

if( $c.width() > $element.width() ) {
    // text was truncated. 
    // do what you need to do
}

$c.remove();

J'ai fait un jsFiddle pour démontrer cela, http://jsfiddle.net/cgzW8/2/

Vous pouvez même créer votre propre pseudo-sélecteur personnalisé pour jQuery :

$.expr[':'].truncated = function(obj) {
  var $this = $(obj);
  var $c = $this
             .clone()
             .css({display: 'inline', width: 'auto', visibility: 'hidden'})
             .appendTo('body');

  var c_width = $c.width();
  $c.remove();

  if ( c_width > $this.width() )
    return true;
  else
    return false;
};

Utilisez-le ensuite pour trouver des éléments

$truncated_elements = $('.my-selector:truncated');

Démonstration : http://jsfiddle.net/cgzW8/293/

J'espère que ça vous aidera, même si c'est un peu compliqué.

0 votes

Merci christian, j'ai déjà vu cela et il semble que ce soit la seule option qui s'offre à moi.

0 votes

Cela pourrait-il fonctionner avec le clonage du texte, et voir si les textes correspondent ou non ?

1 votes

@Lauri Non ; la troncature CSS ne modifie pas l'aspect de l'image. réel dans la boîte, de sorte que le contenu est toujours le même, qu'il soit tronqué, visible ou caché. Il n'y a toujours pas de moyen d'obtenir par programme le texte tronqué, s'il y en avait un, vous n'auriez pas besoin de cloner l'élément en premier lieu !

16voto

Alex Kinnee Points 1638

En ajoutant à la réponse de italo, vous pouvez également le faire avec jQuery.

 function isEllipsisActive($jQueryObject) {
    return ($jQueryObject.width() < $jQueryObject[0].scrollWidth);
}
 

En outre, comme l'a souligné Smoky, vous souhaiterez peut-être utiliser jQuery outerWidth () au lieu de width ().

 function isEllipsisActive($jQueryObject) {
    return ($jQueryObject.outerWidth() < $jQueryObject[0].scrollWidth);
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X