I am trying to grab the HTML from a CSS truncated element and can't seem to get it right.
For example:
<span id=mySpan style=white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:50px>This is the contents of the span tag. It should truncate with an ellipsis if it is longer than 50px.</span>
If I use the standard jQuery way to grab the HTML, I get the full text, not the truncated version. I'm not sure if it is even possible.
html = jQuery('#mySpan').html(); text = jQuery('#mySpan').text();
Both return the full text. I'm stumped.
With line-clamp text can be truncated after multiple lines, whats even more interesting is you can truncate it by specifying the line number where you want to truncate it. eg: -webkit-line-clamp: 3; will truncate start truncating the text from the third line.
We can check if a piece of text is truncated with the CSS text-overflow property by checking whether the offsetWidth of the element is less than its scrollWidth .
text-overflow: ellipsis; white-space: nowrap; overflow: hidden; in CSS (or hard-code the style, but CSS is cleaner). If you want to completely cut the text off, use clip instead of ellipsis . Or better, see MDN since w3schools often has outright incorrect information.
You can compute it :
$.fn.renderedText = function(){ var o = s = this.text(); while (s.length && (this[0].scrollWidth>this.innerWidth())){ s = s.slice(0,-1); this.text(s+"…"); } this.text(o); return s; } var renderedText = $("#mySpan").renderedText(); // this is your visible string
Demonstration
Of course this only works for an element with overflow:hidden;text-overflow:ellipsis
but it's easy to adapt when there's no text-overflow:ellipsis
: just remove the +"…"
.
Note that this is compatible with all browsers and gives the exact result (the w3.org specifies that the …
character is to be used by the browser).
@dystroy has given a nice answer, here is another (more future-friendly) way to do this though.
We can use document.caretPositionFromPoint
. This is almost a FF only function, but most other browsers provide the same thing under their own function name and API. No I don't know what browsers have against devs but oh well...
Our method works like this:
textContent
propertyHere is a quick demo (should work properly in Webkit and Gecko):
function getRenderedText (el) { var pos = el.getBoundingClientRect(); var offset, range; if (document.caretRangeFromPoint) { range = document.caretRangeFromPoint(pos.right, pos.top); offset = range.endOffset - 3; } else if (document.caretPositionFromPoint) { range = document.caretPositionFromPoint(pos.right, pos.top); offset = range.offset - 3; } else { console.error('Your browser is not supported yet :('); } return el.textContent.slice(0, offset); } console.log(getRenderedText(el));
span { text-overflow: ellipsis; width: 40px; white-space: nowrap; display: block; overflow: hidden; }
<span id="el">foo bar is so much awesome it is almost the bestest thing in the world. devs love foo bar. foo bar all the things!</span>
I have seen an error of maximum 1 character in some cases (weird fonts or edge cases), but most of the time, it works fine.
Hope that helps!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With