Texte HTML-débordement détection de points de suspension
J'ai une collection de bloquer les éléments sur une page. Elles ont toutes les règles CSS white-space, de dépassement, de text-overflow définie de sorte que le débordement de texte est équilibré et des points de suspension est utilisée.
Cependant, pas tous les éléments de débordement.
Est-il de toute façon je peux utiliser javascript pour détecter les éléments qui débordent?
Grâce.
Ajouté: exemple de structure HTML, je travaille avec.
<td><span>Normal text</span></td>
<td><span>Long text that will be trimmed text</span></td>
Les éléments SPAN toujours en forme dans les cellules, ils ont les points de suspension de la règle appliquée. Je veux détecter le moment où les points de suspension est appliquée sur le contenu du texte de la DURÉE.
- Dupliquer: stackoverflow.com/questions/143815/...
- Pas un doublon! Cette question est à propos d'un élément à l'intérieur de l'autre, élément parent. Je parle du texte dans un élément unique. Dans mon cas, la DURÉE de la TD jamais de débordement de la TD, c'est le texte dans l'espace qui déborde, et est garni. C'est ce que je suis en train de les détecter! Désolé - je pourrais avoir posé cette question mieux je l'avoue.
- Oh, j'ai oublié d'ajouter - ce seulement besoin de travailler sur webkit si ça peut aider...
- Je n'ai Ghommey juste pour voir si il a fait un travail...il n'a pas.
- les points de suspension aspect est sans importance; tout ce que vous devez détecter est de savoir s'il est débordé.
Vous devez vous connecter pour publier un commentaire.
Une fois, j'avais besoin de le faire, et le seul de la croix-navigateur solution fiable, je suis tombé sur le hack de travail. Je ne suis pas le plus grand fan de solutions de ce type, mais il a certainement produit le résultat correct encore et encore.
L'idée est que le clonage de l'élément, de supprimer toute délimitation de largeur, et de tester si l'élément cloné est plus large que l'original. Si oui, vous savez qu'il va y avoir été tronqué.
Par exemple, à l'aide de jQuery:
J'ai fait un jsFiddle pour le démontrer, http://jsfiddle.net/cgzW8/2/
Vous pouvez même créer votre propre personnalisé pseudo-sélecteur jQuery:
Puis l'utiliser pour trouver des éléments
Démo: http://jsfiddle.net/cgzW8/293/
Espérons que cette aide, hacky comme il est.
white-space: nowrap
.white-space: nowrap
et ça marche... jsfiddle.net/cgzW8/2white-space: nowrap
, et il fonctionne dans ma démonstration. jsfiddle.net/cgzW8/291. Testé dans Chrome, Firefox, Safari, IE8, et IE11.scrollWidth
a moins deoffsetWidth
, celui-ci résolu. Fait une petite modification pour mon cas, si, au lieu de l'ajout debody
ajouté à l'élément courant(td
dans mon cas) et immédiatement supprimé. Merci beaucoup!!element.parentNode
? (un peu de css imbrication des règles qui affectent la largeur peut ne pas s'appliquer lorsque vous l'ajouter à corps)…
obtenir la largeur d'ajouter à la$c.width()
ou soustraire de$element.width()
Essayer cette fonction JS, en passant l'élément span comme argument:
text-overflow:ellipsis
il devrait êtree.offsetWidth <= e.scrollWidth
clientWidth
au lieu deoffsetWidth
et la même question était évidente.L'ajout d'italo réponse, vous pouvez également le faire à l'aide de jQuery.
Aussi, comme Smoky remarquer, vous souhaitez peut-être utiliser jQuery outerWidth() au lieu de width().
$jQueryObject.width()
n'est pas "correct" car elle ne prend pas les cellules de la marge en compte.$jQueryObject.outerWidth()
doit être utilisé.Pour ceux qui utilisent (ou envisagent de le faire) la accepté de répondre à de Christian Varga, s'il vous plaît être conscient des problèmes de performances.
Clonage/manipulation du DOM de manière causes DOM Redistribution (voir une explication sur les DOM de redistribution ici), qui est extrêmement gourmande en ressources.
L'aide de Christian Varga de la solution sur+ de 100 éléments sur une page causé 4 secondes de redistribution retard au cours de laquelle la JS fil est verrouillé. Considérant le JS est mono-thread, ce qui signifie un important UX de retard à l'utilisateur final.
Italo Borssatto de réponse devrait être accepté, il était environ 10 fois plus rapide lors de ma profilage.
mouseenter
pour voir si une info-bulle doit être affichée.elem.offsetWdith VS ele.scrollWidth
Ce travail pour moi!
https://jsfiddle.net/gustavojuan/210to9p1/
Le plus simple (et cross-browser) la solution est de comparer les scrollWidth avec clientWidth
Code de travail ici : https://stackoverflow.com/a/19156627/1213445
Cet exemple afficher les info-bulle sur la cellule de tableau avec un texte tronqué. Est dynamique basée sur la largeur de la table:
Démo: https://jsfiddle.net/t4qs3tqs/
Il fonctionne sur toutes les versions de jQuery
Réponse de italo est très bon! Toutefois, permettez-moi de préciser un peu:
De compatibilité du navigateur
Si, en fait, vous essayez le code ci-dessus et l'utilisation
console.log
pour imprimer les valeurs dee.offsetWidth
ete.scrollWidth
, vous remarquerez, sur IE, que, même lorsque vous n'avez pas de texte de troncature, une différence de valeur1px
ou2px
est connu.Ainsi, en fonction de la taille de la police que vous utilisez, permettent une certaine tolérance!
Je pense que la meilleure façon de le détecter est l'utilisation
getClientRects()
, il semble que chaque rect a la même hauteur, de sorte que nous pouvons caculate lignes en nombre avec le nombre de différentstop
valeur.getClientRects
travail comme cettegetRowRects
travail comme cettevous pouvez détecter comme cette
Toutes les solutions ne fonctionne pas vraiment pour moi, ce ne travail était de comparer les éléments
scrollWidth
à lascrollWidth
de son parent (ou enfant, selon l'élément a de la gâchette).Lorsque l'enfant
scrollWidth
est plus élevé que celui de ses parents, cela signifie.text-ellipsis
est active.Quand
event
est le parent de l'élémentQuand
event
est l'élément enfant