Ich habe eine Sammlung von Blockelementen auf einer Seite. Sie alle haben die CSS-Regeln Leerraum, Überlauf, Textüberlauf so eingestellt, dass überlaufender Text abgeschnitten und eine Ellipse verwendet wird.
Es laufen jedoch nicht alle Elemente über.
Kann ich mit Javascript erkennen, welche Elemente überlaufen?
Vielen Dank.
Hinzugefügt: Beispiel einer HTML-Struktur, mit der ich arbeite.
<td><span>Normal text</span></td>
<td><span>Long text that will be trimmed text</span></td>
Die SPAN-Elemente passen immer in die Zellen, es wird die Ellipsenregel angewendet. Ich möchte erkennen, wann die Auslassungspunkte auf den Textinhalt des SPAN angewendet werden.
javascript
html
css
ellipsis
Deanoj
quelle
quelle
Antworten:
Es war einmal, dass ich dies tun musste, und die einzige browserübergreifende zuverlässige Lösung, auf die ich stieß, war Hackjob. Ich bin nicht der größte Fan solcher Lösungen, aber es liefert immer wieder das richtige Ergebnis.
Die Idee ist, dass Sie das Element klonen, die Begrenzungsbreite entfernen und testen, ob das geklonte Element breiter als das Original ist. Wenn ja, wissen Sie, dass es abgeschnitten worden sein wird.
Beispiel: Verwenden von jQuery:
Ich habe eine jsFiddle erstellt, um dies zu demonstrieren: http://jsfiddle.net/cgzW8/2/
Sie können sogar Ihren eigenen benutzerdefinierten Pseudo-Selektor für jQuery erstellen:
Verwenden Sie es dann, um Elemente zu finden
Demo: http://jsfiddle.net/cgzW8/293/
Hoffentlich hilft das, hacky wie es ist.
quelle
white-space: nowrap
.Probieren Sie diese JS-Funktion aus und übergeben Sie das span-Element als Argument:
quelle
text-overflow:ellipsis
sollte seine.offsetWidth <= e.scrollWidth
Zusätzlich zur Antwort von italo können Sie dies auch mit jQuery tun.
Wie Smoky hervorhob, möchten Sie möglicherweise auch jQuery OuterWidth () anstelle von width () verwenden.
quelle
Wenn Sie die akzeptierte Antwort von Christian Varga verwenden (oder planen, diese zu verwenden), beachten Sie bitte die Leistungsprobleme.
Das Klonen / Bearbeiten des DOM auf diese Weise führt zu einem DOM-Reflow (siehe Erläuterung zum DOM-Reflow hier), der äußerst ressourcenintensiv ist.
Die Verwendung der Lösung von Christian Varga für mehr als 100 Elemente auf einer Seite verursachte eine Reflow-Verzögerung von 4 Sekunden, während der der JS-Thread gesperrt ist. Wenn man bedenkt, dass JS Single-Threaded ist, bedeutet dies eine erhebliche UX-Verzögerung für den Endbenutzer.
Die Antwort von Italo Borssatto sollte die akzeptierte sein, sie war während meiner Profilerstellung ungefähr zehnmal schneller.
quelle
mouseenter
, um festzustellen, ob ein Tooltip angezeigt werden muss.Antwort von italo ist sehr gut! Lassen Sie es mich jedoch ein wenig verfeinern:
Cross-Browser-Kompatibilität
Wenn Sie tatsächlich den obigen Code ausprobieren und
console.log
zum Ausdrucken der Werte vone.offsetWidth
und verwendene.scrollWidth
, werden Sie im IE feststellen, dass selbst wenn Sie keine Textabschneidung haben, eine Wertdifferenz von1px
oder2px
auftritt.Lassen Sie also je nach verwendeter Schriftgröße eine bestimmte Toleranz zu!
quelle
elem.offsetWdith VS ele.scrollWidth Diese Arbeit für mich! https://jsfiddle.net/gustavojuan/210to9p1/
quelle
In diesem Beispiel wird ein Tooltip für eine Zelltabelle mit abgeschnittenem Text angezeigt. Ist dynamisch basierend auf der Tabellenbreite:
Demo: https://jsfiddle.net/t4qs3tqs/
Es funktioniert auf allen Versionen von jQuery
quelle
Ich denke, der bessere Weg, dies zu erkennen, ist die Verwendung
getClientRects()
. Es scheint, dass jedes Rechteck die gleiche Höhe hat, sodass wir die Zeilennummer mit der Anzahl der unterschiedlichentop
Werte berechnen können.getClientRects
arbeite sogetRowRects
arbeite soSie kann wie erkennen diese
quelle
Alle Lösungen haben bei mir nicht wirklich funktioniert. Es hat funktioniert, die Elemente
scrollWidth
mit denenscrollWidth
des Elternteils (oder des Kindes, je nachdem, welches Element den Auslöser hat) zu vergleichen.Wenn das Kind
scrollWidth
höher ist als seine Eltern, bedeutet dies, dass.text-ellipsis
es aktiv ist.Wann
event
ist das übergeordnete Element?Wann
event
ist das untergeordnete Element?quelle
Die
e.offsetWidth < e.scrollWidth
Lösung funktioniert nicht immer.Und wenn Sie reines JavaScript verwenden möchten, empfehle ich Folgendes:
(Typoskript)
quelle
Die Lösung @ItaloBorssatto ist perfekt. Aber bevor ich mir SO ansah, traf ich meine Entscheidung. Hier ist es :)
quelle
Meine Implementierung)
quelle
Die Demo http://jsfiddle.net/brandonzylstra/hjk9mvcy/ enthält einige Fehler, die von https://stackoverflow.com/users/241142/iconoclast erwähnt werden .
Fügen Sie in seiner Demo diesen Code hinzu:
quelle