Tengo una colección de elementos de bloque en una página. Todos tienen las reglas CSS espacio en blanco, desbordamiento, desbordamiento de texto establecido para que el texto desbordado se recorte y se use una elipsis.
Sin embargo, no todos los elementos se desbordan.
¿Hay alguna forma de usar JavaScript para detectar qué elementos se desbordan?
Gracias.
Agregado: ejemplo de estructura HTML con la que estoy trabajando.
<td><span>Normal text</span></td>
<td><span>Long text that will be trimmed text</span></td>
Los elementos SPAN siempre caben en las celdas, tienen aplicada la regla de puntos suspensivos. Quiero detectar cuándo se aplican los puntos suspensivos al contenido de texto de SPAN.
javascript
html
css
ellipsis
deanoj
fuente
fuente
Respuestas:
Érase una vez que necesitaba hacer esto, y la única solución confiable entre navegadores que encontré fue el trabajo de pirateo. No soy el mayor fanático de soluciones como esta, pero ciertamente produce el resultado correcto una y otra vez.
La idea es que clone el elemento, elimine cualquier ancho delimitador y pruebe si el elemento clonado es más ancho que el original. Si es así, sabes que se habrá truncado.
Por ejemplo, usando jQuery:
Hice un jsFiddle para demostrar esto, http://jsfiddle.net/cgzW8/2/
Incluso podría crear su propio pseudo-selector personalizado para jQuery:
Luego úsalo para encontrar elementos
Demostración: http://jsfiddle.net/cgzW8/293/
Esperemos que esto ayude, hacky como es.
fuente
white-space: nowrap
.Pruebe esta función JS, pasando el elemento span como argumento:
fuente
text-overflow:ellipsis
debería sere.offsetWidth <= e.scrollWidth
Agregando a la respuesta de italo, también puedes hacer esto usando jQuery.
Además, como señaló Smoky, es posible que desee utilizar jQuery outsideWidth () en lugar de width ().
fuente
Para aquellos que usan (o planean usar) la respuesta aceptada de Christian Varga, tengan en cuenta los problemas de rendimiento.
Clonar / manipular el DOM de tal manera causa el Reflujo del DOM (vea una explicación sobre el reflujo del DOM) aquí), que recursos.
El uso de la solución de Christian Varga en más de 100 elementos en una página provocó un retraso de reflujo de 4 segundos durante el cual el hilo JS está bloqueado. Teniendo en cuenta que JS tiene un solo subproceso, esto significa un retraso significativo de UX para el usuario final.
La respuesta de Italo Borssatto debería ser la aceptada, fue aproximadamente 10 veces más rápida durante mi perfil.
fuente
mouseenter
para ver si es necesario mostrar una información sobre herramientas.¡La respuesta de italo es muy buena! Sin embargo, permítanme refinarlo un poco:
Compatibilidad cruzada del navegador
Si, de hecho, prueba el código anterior y lo usa
console.log
para imprimir los valores de ,e.offsetWidth
ye.scrollWidth
notará, en IE, que, incluso cuando no tiene truncamiento de texto, hay una diferencia de valor de1px
o2px
se experimenta .Entonces, dependiendo del tamaño de fuente que uses, ¡permite una cierta tolerancia!
fuente
elem.offsetWdith VS ele.scrollWidth ¡Esto funciona para mí! https://jsfiddle.net/gustavojuan/210to9p1/
fuente
Este ejemplo muestra información sobre herramientas en la tabla de celdas con texto truncado. Es dinámico según el ancho de la tabla:
Manifestación: https://jsfiddle.net/t4qs3tqs/
Funciona en todas las versiones de jQuery
fuente
Creo que la mejor manera de detectarlo es usarlo
getClientRects()
, parece que cada rect tiene la misma altura, por lo que podemos calcular el número de líneas con el número de diferentestop
valor .getClientRects
obra como estagetRowRects
trabaja como estase puede detectar como este
fuente
Todas las soluciones realmente no funcionaron para mí, lo que sí funcionó fue comparar los elementos
scrollWidth
conscrollWidth
de su padre (o hijo, dependiendo de qué elemento tenga el disparador).Cuando el niño
scrollWidth
es más alto que sus padres, significa que.text-ellipsis
está activo.Cuando
event
es el elemento padreCuando
event
es el elemento hijofuente
los
e.offsetWidth < e.scrollWidth
solución no siempre funciona.Y si quieres usar JavaScript puro, te recomiendo usar esto:
(mecanografiado)
fuente
La solución @ItaloBorssatto es perfecta. Pero antes de mirar SO, tomé mi decisión. Aquí está :)
fuente
Mi implementación)
fuente
Hay algunos errores en la demostración http://jsfiddle.net/brandonzylstra/hjk9mvcy/ mencionados por https://stackoverflow.com/users/241142/iconoclast .
en su demo, agregar estos códigos funcionará:
fuente