Tengo un lapso con datos dinámicos en mi página, con ellipsis
estilo.
.my-class
{
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
width: 71px;
}
<span id="myId" class="my-class"></span>
document.getElementById('myId').innerText = "...";
Me gustaría agregar a este elemento información sobre herramientas con el mismo contenido, pero quiero que aparezca solo cuando el contenido es largo y los puntos suspensivos aparecen en la pantalla.
¿Hay alguna forma de hacerlo?
¿El navegador genera un evento cuando ellipsis
se activa?
* Navegador: Internet Explorer
text-overflow:ellipsis;
no funciona en absoluto en Firefox - vea esta pregunta para más información: stackoverflow.com/questions/4927257/…element.offsetWidth < element.scrollWidth
según esta respuesta parece funcionar hasta ahora.text-overflow:ellipsis;
ahora funciona en Firefox; se agregó en Firefox 7 (lanzado en septiembre de 2011).Respuestas:
Aquí hay una manera que lo hace usando la configuración de puntos suspensivos incorporados, y agrega el
title
atributo a pedido (con jQuery) basándose en el comentario de Martin Smith:fuente
"As of jQuery 1.7, the .on() method is the preferred method for attaching event handlers to a document"
para obtener más información, visite api.jquery.com/bind y api.jquery.com/onAquí hay una solución CSS pura. No hay necesidad de jQuery. No mostrará información sobre herramientas, sino que solo expandirá el contenido a su longitud completa al pasar el mouse.
Funciona muy bien si tienes contenido que se reemplaza. Entonces no tiene que ejecutar una función jQuery cada vez.
fuente
La respuesta de uosɐſ es fundamentalmente correcta, pero probablemente no desee hacerlo en el evento mouseenter. Eso hará que haga el cálculo para determinar si es necesario, cada vez que pase el mouse sobre el elemento. A menos que el tamaño del elemento esté cambiando, no hay razón para hacerlo.
Sería mejor llamar a este código inmediatamente después de agregar el elemento al DOM:
O, si no sabe cuándo se agregó exactamente, llame a ese código una vez que la página haya terminado de cargarse.
Si tiene más de un elemento con el que necesita hacer esto, puede darles la misma clase (como "mightOverflow") y usar este código para actualizarlos a todos:
fuente
$(".mightOverflow").each(function() { if( $(this).offsetWidth < $(this).scrollWidth && !$(this).attr('title')){ $(this).attr('title', $(this).text()); $(this).css('border-bottom', '1px dotted #A8A8A8'); } });
this.offsetWidth < this.scrollWidth
y posiblemente incluso la verificación!$this.attr('title')
se realizará cada vez que pase el mouse sobre el elemento.Aquí hay otras dos soluciones de CSS puro:
fuente
Aquí está mi complemento jQuery:
Uso:
Editar:
He hecho una idea general de este complemento. https://gist.github.com/UziTech/d45102cdffb1039d4415
fuente
Necesitamos detectar si los puntos suspensivos se aplican realmente, y luego mostrar información sobre herramientas para revelar el texto completo. No es suficiente con solo comparar "
this.offsetWidth < this.scrollWidth
" cuando el elemento casi mantiene su contenido, pero solo le falta uno o dos píxeles más de ancho, especialmente para el texto de caracteres chinos / japoneses / coreanos de ancho completo.Aquí hay un ejemplo: http://jsfiddle.net/28r5D/5/
Encontré una manera de mejorar la detección de puntos suspensivos:
this.offsetWidth < this.scrollWidth
" primero, continúe con el paso 2 si falló.Aquí está mi mejora: http://jsfiddle.net/28r5D/6/
fuente
Creé un complemento jQuery que utiliza la información sobre herramientas de Bootstrap en lugar de la información sobre herramientas incorporada del navegador. Tenga en cuenta que esto no se ha probado con navegadores antiguos.
JSFiddle: https://jsfiddle.net/0bhsoavy/4/
fuente
Esto es lo que hice. La mayoría de los scripts de información sobre herramientas requieren que ejecute una función que almacena la información sobre herramientas. Este es un ejemplo de jQuery:
Si no desea verificar los puntos suspensivos css, puede simplificar como:
Tengo el "cuándo" alrededor, de modo que la función "setupTooltip" no se ejecuta hasta que se hayan actualizado todos los títulos. Reemplace el "setupTooltip", con su función de información sobre herramientas y el * con los elementos que desea verificar. * los revisará todos si lo dejas.
Si simplemente desea actualizar los atributos del título con la información sobre herramientas de los navegadores, puede simplificar como:
O sin verificación de puntos suspensivos:
fuente
Si desea hacer esto únicamente con javascript, yo haría lo siguiente. Dele al palmo un atributo de identificación (para que pueda recuperarse fácilmente del DOM) y coloque todo el contenido en un atributo llamado 'contenido':
Luego, en su javascript, puede hacer lo siguiente después de que el elemento se haya insertado en el DOM.
Por supuesto, si está utilizando JavaScript para insertar el intervalo en el DOM, puede mantener el contenido en una variable antes de insertarlo. De esta manera no necesita un atributo de contenido en el lapso.
Hay soluciones más elegantes que esta si quieres usar jQuery.
fuente
$("#myDataId").attr("title", function() { var innerText = $(this).text(); var content = $(this).attr("content"); if (innerText.length <= content.length) { return content; } return null; });
Tengo la clase CSS, que determina dónde colocar puntos suspensivos. En base a eso, hago lo siguiente (el conjunto de elementos podría ser diferente, los escribo, donde se utilizan puntos suspensivos, por supuesto, podría ser un selector de clase separado):
fuente
this
era un,anchor
así que usé enthis.text()
lugar deval()
Aquí hay una solución JavaScript de Vanilla:
fuente
Esta fue mi solución, funciona como un encanto!
fuente
Ninguna de las soluciones anteriores funcionó para mí, pero descubrí una gran solución. El mayor error que comete la gente es tener las 3 propiedades CSS declaradas en el elemento al cargar la página. Debe agregar esos estilos + información sobre herramientas dinámicamente SI y SOLO SI el intervalo en el que desea una elipsis es más ancho que su elemento primario.
fuente
Es posible que rodee el tramo con otro tramo, luego simplemente pruebe si el ancho del tramo original / interno es mayor que el del tramo nuevo / externo. Tenga en cuenta que posiblemente digo: se basa aproximadamente en mi situación en la que tenía un
span
interior de a,td
por lo que no sé si funcionará con unspan
interior de aspan
.Aquí, sin embargo, está mi código para otros que pueden encontrarse en una posición similar a la mía; Lo estoy copiando / pegando sin modificaciones, aunque esté en un contexto angular, no creo que eso afecte la legibilidad y el concepto esencial. Lo codifiqué como método de servicio porque necesitaba aplicarlo en más de un lugar. El selector que he estado pasando ha sido un selector de clase que coincidirá con varias instancias.
fuente