HTML text-обнаружение многоточия переполнения
У меня есть коллекция блочных элементов на странице. Все они имеют правила CSS пробел, переполнение, текст-переполнение набор, так что переполнение текста обрезается и используется многоточие.
однако, не все элементы переполнения.
есть ли в любом случае я могу использовать javascript, чтобы определить, какие элементы переполнены?
спасибо.
добавлено: пример структуры HTML, с которой я работаю.
<td><span>Normal text</span></td>
<td><span>Long text that will be trimmed text</span></td>
элементы пролета всегда помещаются в ячейки, они имеют правило многоточия применяется. Я хочу определить, когда многоточие применяется к текстовому содержимому диапазона.
11 ответов:
когда-то мне нужно было это сделать, и единственным надежным решением для кросс-браузера, с которым я столкнулся, была hack job. Я не самый большой поклонник таких решений, но это, безусловно, дает правильный результат снова и снова.
идея заключается в том, что вы клонируете элемент, удаляете любую ограничивающую ширину и проверяете, является ли клонированный элемент шире оригинала. Если это так, вы знаете, что он будет усечен.
например, с помощью jQuery:
var $element = $('#element-to-test'); var $c = $element .clone() .css({display: 'inline', width: 'auto', visibility: 'hidden'}) .appendTo('body'); if( $c.width() > $element.width() ) { // text was truncated. // do what you need to do } $c.remove();
Я сделал jsFiddle, чтобы продемонстрировать это,http://jsfiddle.net/cgzW8/2/
вы даже можете создать свой собственный псевдо-селектор для jQuery:
$.expr[':'].truncated = function(obj) { var $this = $(obj); var $c = $this .clone() .css({display: 'inline', width: 'auto', visibility: 'hidden'}) .appendTo('body'); var c_width = $c.width(); $c.remove(); if ( c_width > $this.width() ) return true; else return false; };
затем используйте его, чтобы найти элементы
$truncated_elements = $('.my-selector:truncated');
демо: http://jsfiddle.net/cgzW8/293/
надеюсь, это поможет, хаки, как это.
попробуйте эту функцию JS, передавая элемент span в качестве аргумента:
function isEllipsisActive(e) { return (e.offsetWidth < e.scrollWidth); }
добавление к ответу итало, вы также можете сделать это с помощью jQuery.
function isEllipsisActive($jQueryObject) { return ($jQueryObject.width() < $jQueryObject[0].scrollWidth); }
кроме того, как указал Смоки, вы можете использовать jQuery outerWidth() вместо width().
function isEllipsisActive($jQueryObject) { return ($jQueryObject.outerWidth() < $jQueryObject[0].scrollWidth); }
elem.offsetWdith VS ele.scrollWidth Это работа для меня! https://jsfiddle.net/gustavojuan/210to9p1/
$(function() { $('.endtext').each(function(index, elem) { debugger; if(elem.offsetWidth !== elem.scrollWidth){ $(this).css({color: '#FF0000'}) } }); });
этот пример показывает всплывающую подсказку на таблице ячеек с усеченным текстом. Является динамическим на основе ширины таблицы:
$.expr[':'].truncated = function (obj) { var element = $(obj); return (element[0].scrollHeight > (element.innerHeight() + 1)) || (element[0].scrollWidth > (element.innerWidth() + 1)); }; $(document).ready(function () { $("td").mouseenter(function () { var cella = $(this); var isTruncated = cella.filter(":truncated").length > 0; if (isTruncated) cella.attr("title", cella.text()); else cella.attr("title", null); }); });
Demo:https://jsfiddle.net/t4qs3tqs/
он работает на всех версиях jQuery
самое простое (и кросс-браузерное) решение на самом деле сравнивает scrollWidth с clientWidth
рабочий код здесь:https://stackoverflow.com/a/19156627/1213445
для тех, кто использует (или планирует использовать) принятый ответ от Christian Varga, пожалуйста, имейте в виду проблемы с производительностью.
клонирование / манипулирование DOM таким образом вызывает DOM Reflow (см. объяснение на DOM reflow здесь), что является чрезвычайно ресурсоемким.
использование решения Кристиана Варги на 100 + элементах на странице вызвало 4-секундную задержку оплавления, во время которой поток JS заблокирован. Учитывая, что JS-это однопоточный это означает значительную задержку UX для конечного пользователя.
Итало Borssatto это ответ должен быть принят, он был примерно в 10 раз быстрее во время моего профиля.
ответ итало очень хорошо! Однако позвольте мне уточнить немного:
function isEllipsisActive(e) { var tolerance = 2; // In px. Depends on the font you are using return e.offsetWidth + tolerance < e.scrollWidth; }
Кросс-браузер совместимости
если, на самом деле, вы попробуете приведенный выше код и использовать
console.log
чтобы вывести значенияe.offsetWidth
иe.scrollWidth
, вы заметите, на IE, что, даже если у вас нет усечения текста, разница значений1px
или2px
- это опытные.Итак, в зависимости от размера шрифта, который вы используете, разрешите определенный допуск!
Я думаю, что лучший способ обнаружить это использовать
getClientRects()
, Кажется, что каждая прямая имеет одинаковую высоту, поэтому мы можем вычислить число строк с числом разныхtop
значение.
getClientRects
работы как этойfunction getRowRects(element) { var rects = [], clientRects = element.getClientRects(), len = clientRects.length, clientRect, top, rectsLen, rect, i; for(i=0; i<len; i++) { has = false; rectsLen = rects.length; clientRect = clientRects[i]; top = clientRect.top; while(rectsLen--) { rect = rects[rectsLen]; if (rect.top == top) { has = true; break; } } if(has) { rect.right = rect.right > clientRect.right ? rect.right : clientRect.right; rect.width = rect.right - rect.left; } else { rects.push({ top: clientRect.top, right: clientRect.right, bottom: clientRect.bottom, left: clientRect.left, width: clientRect.width, height: clientRect.height }); } } return rects; }
getRowRects
работы как этойвы можете обнаружить, как этой
все решения на самом деле не работают для меня, что сделал работа была сравнить элементы
scrollWidth
доscrollWidth
его родителя (или ребенка, в зависимости от того, какой элемент имеет триггер).для детей
scrollWidth
выше своих родителей, значит.text-ellipsis
активна.
, когда
event
является родительским для элементаfunction isEllipsisActive(event) { let el = event.currentTarget; let width = el.offsetWidth; let widthChild = el.firstChild.offsetWidth; return (widthChild >= width); }
, когда
event
ребенок элементfunction isEllipsisActive(event) { let el = event.currentTarget; let width = el.offsetWidth; let widthParent = el.parentElement.scrollWidth; return (width >= widthParent); }