У меня есть диапазон с динамическими данными на моей странице, со ellipsis
стилем.
.my-class
{
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
width: 71px;
}
<span id="myId" class="my-class"></span>
document.getElementById('myId').innerText = "...";
Я хотел бы добавить к этому элементу всплывающую подсказку с тем же содержимым, но я хочу, чтобы он отображался только тогда, когда содержимое длинное и многоточие отображается на экране.
Есть ли способ сделать это?
Браузер выбрасывает событие при ellipsis
активации?
* Браузер: Internet Explorer
text-overflow:ellipsis;
в Firefox это вообще не работает - посмотрите этот вопрос подробнее: stackoverflow.com/questions/4927257/…element.offsetWidth < element.scrollWidth
согласно этому ответу пока что.text-overflow:ellipsis;
теперь работает в Firefox; он был добавлен в Firefox 7 (выпущен в сентябре 2011 года).Ответы:
Вот способ, который делает это, используя встроенный параметр многоточия, и добавляет
title
атрибут по требованию (с jQuery), основываясь на комментарии Мартина Смита:источник
"As of jQuery 1.7, the .on() method is the preferred method for attaching event handlers to a document"
для получения дополнительной информации см. api.jquery.com/bind и api.jquery.com/onВот чистое решение CSS. Нет необходимости в jQuery. Он не будет отображать всплывающую подсказку, а просто развернет содержимое до полной длины при наведении курсора.
Прекрасно работает, если у вас есть контент, который заменяется. Тогда вам не нужно каждый раз запускать функцию jQuery.
источник
Ответ uosɐſ в основном верен, но вы, вероятно, не хотите делать это в событии mouseenter. Это заставит его выполнять вычисления, чтобы определить, нужно ли это, каждый раз, когда вы наводите курсор мыши на элемент. Если размер элемента не меняется, нет причин делать это.
Было бы лучше просто вызвать этот код сразу после добавления элемента в DOM:
Или, если вы не знаете, когда именно он был добавлен, вызовите этот код после завершения загрузки страницы.
если у вас есть более одного элемента, с которым вам нужно это сделать, то вы можете присвоить им один и тот же класс (например, mightOverflow) и использовать этот код для их обновления:
источник
$(".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
и, возможно, даже проверка!$this.attr('title')
будет выполняться каждый раз, когда вы наводите курсор мыши на элемент.Вот два других чистых решения CSS:
источник
Вот мой плагин jQuery:
Использование:
Редактировать:
Я сделал суть для этого плагина. https://gist.github.com/UziTech/d45102cdffb1039d4415
источник
Нам нужно определить, действительно ли применен многоточие, а затем показать всплывающую подсказку, раскрывающую полный текст. Недостаточно только сравнивать "
this.offsetWidth < this.scrollWidth
", когда элемент почти удерживает свое содержимое, но не хватает только одного или двух пикселей в ширину, особенно для текста полноразмерных китайских / японских / корейских символов.Вот пример: http://jsfiddle.net/28r5D/5/
Я нашел способ улучшить обнаружение многоточия:
this.offsetWidth < this.scrollWidth
Сначала сравните " ", продолжите шаг № 2, если не удалосьВот мое улучшение: http://jsfiddle.net/28r5D/6/
источник
Я создал плагин jQuery, который использует всплывающую подсказку Bootstrap вместо встроенной подсказки браузера. Обратите внимание, что это не было проверено с более старым браузером.
JSFiddle: https://jsfiddle.net/0bhsoavy/4/
источник
Это то, что я сделал. Большинство сценариев подсказок требуют, чтобы вы выполняли функцию, которая хранит подсказки. Это пример jQuery:
Если вы не хотите проверять наличие многоточия css, вы можете упростить:
У меня есть «когда» вокруг, так что функция «setupTooltip» не выполняется, пока не будут обновлены все заголовки. Замените «setupTooltip» на функцию всплывающей подсказки, а * на элементы, которые вы хотите проверить. * пройдет через все, если вы оставите это.
Если вы просто хотите просто обновить атрибуты заголовка с помощью всплывающей подсказки браузера, вы можете упростить:
Или без проверки на многоточие:
источник
Если вы хотите сделать это исключительно с помощью JavaScript, я бы сделал следующее. Задайте для атрибута span атрибут id (чтобы его можно было легко извлечь из DOM) и поместите весь контент в атрибут с именем «content»:
Затем в своем javascript вы можете сделать следующее после того, как элемент был вставлен в DOM.
Конечно, если вы используете JavaScript для вставки диапазона в DOM, вы можете просто сохранить содержимое в переменной, прежде чем вставлять его. Таким образом, вам не нужен атрибут содержимого в промежутке.
Есть более элегантные решения, чем это, если вы хотите использовать jQuery.
источник
$("#myDataId").attr("title", function() { var innerText = $(this).text(); var content = $(this).attr("content"); if (innerText.length <= content.length) { return content; } return null; });
У меня есть класс CSS, который определяет, где поставить многоточие. Исходя из этого, я делаю следующее (набор элементов может быть другим, я пишу те, где используется многоточие, конечно, это может быть отдельный селектор классов):
источник
this
былоanchor
так, что я использовалthis.text()
вместоval()
Вот решение Vanilla JavaScript:
источник
Это было мое решение, работает как шарм!
источник
Ни одно из приведенных выше решений не помогло мне, но я нашел отличное решение. Самая большая ошибка, которую делают люди, - это все 3 свойства CSS, объявленные в элементе при загрузке страницы. Вы должны добавить эти стили + всплывающую подсказку динамически, ЕСЛИ и ТОЛЬКО ЕСЛИ диапазон, на котором вы хотите создать эллипсы, шире, чем его родитель.
источник
Вы могли бы окружить промежуток другим промежутком, а затем просто проверить, больше ли ширина исходного / внутреннего промежутка, чем ширина нового / внешнего пролета. Обратите внимание, что я говорю, возможно, - это примерно основано на моей ситуации, когда у меня была
span
внутренняя часть,td
поэтому я не знаю, будет ли она работать сspan
внутренней частьюspan
.Вот мой код для тех, кто может оказаться в положении, аналогичном моему; Я копирую / вставляю это без модификации, даже если это в угловом контексте, я не думаю, что это умаляет удобочитаемость и основную концепцию. Я кодировал его как метод обслуживания, потому что мне нужно было применять его более чем в одном месте. Селектор, который я передавал, был селектором класса, который будет соответствовать нескольким экземплярам.
источник