HTML - как показать всплывающую подсказку ТОЛЬКО при активированном многоточии

У меня есть диапазон с динамическими данными на моей странице в стиле 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


person Spiderman    schedule 29.03.2011    source источник
comment
Имейте в виду, что text-overflow:ellipsis; вообще не работает в Firefox - см. Этот вопрос для получения дополнительной информации: stackoverflow.com/questions/4927257/   -  person Spudley    schedule 29.03.2011
comment
Мне просто нужно было сделать что-то подобное. Проверка, работает ли element.offsetWidth < element.scrollWidth согласно этому ответу.   -  person Martin Smith    schedule 18.04.2012
comment
Примечание для потомков: text-overflow:ellipsis; теперь работает в Firefox; он был добавлен в Firefox 7 (выпущен в сентябре 2011 г.).   -  person sleske    schedule 29.04.2016


Ответы (15)


Вот способ, который делает это с помощью встроенной настройки многоточия и добавляет атрибут title по запросу (с jQuery) на основе комментария Мартина Смита:

$('.mightOverflow').bind('mouseenter', function(){
    var $this = $(this);

    if(this.offsetWidth < this.scrollWidth && !$this.attr('title')){
        $this.attr('title', $this.text());
    }
});
person Jason Kleban    schedule 06.11.2012
comment
Спасибо, работает как шарм! Однако, если вы хотите сделать его более эффективным, вы можете подумать о замене bind () на on () следующим образом: $ (document) .on ('mouseenter', '.mightOverflow', function () {...}); - person Ziad; 29.01.2013
comment
Если вы хотите, чтобы всплывающая подсказка автоматически удалялась, если текст больше не переполняется, измените его на: $ (document) .on ('mouseenter', '.mightOverflow', function () {var $ t = $ (this); var title = $ t.attr ('title'); if (! title) {if (this.offsetWidth ‹this.scrollWidth) $ t.attr ('title', $ t.text ())} else {if (this.offsetWidth› = this.scrollWidth && title == $ t.text ()) $ t.removeAttr ('title')}}); - person Chris Janssen; 28.02.2013
comment
Может ли кто-нибудь опубликовать jsfiddle для этого решения? Я не совсем понимаю часть mouseenter. - person Kevin Meredith; 02.07.2013
comment
mouseenter - это событие, которое мы связываем или слушаем. На самом деле нам не нужно добавлять всплывающую подсказку к элементам, пока кто-то не наведет на них курсор мыши. Таким образом, мы откладываем добавление до этой точки мыши на любом из элементов DOM с классом mightoverflow. Своевременные всплывающие подсказки - person Jason Kleban; 02.07.2013
comment
"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 - person Adrien Be; 06.07.2014
comment
Это правильное решение? offsetWidth принимает во внимание границу, поэтому, если граница того же размера, что и переполнение, это предложение не сработает. (Это было показано как крайний случай для нас) clientWidth кажется, что это был бы лучший вариант. - person chris; 12.02.2015
comment
несомненно, этот код потребует корректировки в некоторых сценариях и будет принципиально неприемлемым для других. - person Jason Kleban; 12.02.2015
comment
Если вам нужно понять offsetWidth, scrollWidth и clientWidth, вот очень хорошее объяснение: stackoverflow.com/a/21064102/1815779 - person Linh Dam; 04.02.2016
comment
Он не работает в IE10 - offsetWidth идентичен scrollWidth, оба дают мне усеченную ширину. - person SsjCosty; 23.01.2017
comment
возможно, но убедитесь, что он / работает / работает для вас в других браузерах, или вы можете не указывать поведение на правильном элементе? Или поблизости используется неподдерживаемая IE10 функция, которая может мешать? - person Jason Kleban; 23.01.2017
comment
В IE ширина прокрутки на 1 пиксель больше, чем должна быть - person sms; 18.05.2018
comment
Спасибо, этот совет действительно изящный :) - person Blue Smith; 12.06.2018
comment
Мы используем многострочное многоточие, используя стратегию -webkit-line-clamp. Будет ли работать в таком случае это сравнение ширины смещения? У меня это не работает в том смысле, что ширина смещения и ширина прокрутки одинаковы, даже когда элемент показывает многоточие, поэтому я подумал, что проверю. Спасибо. - person AshD; 31.08.2018

Вот чистое решение CSS. Нет необходимости в jQuery. Он не отображает всплывающую подсказку, вместо этого он просто расширяет содержимое до его полной длины при наведении курсора.

Отлично работает, если у вас есть контент, который нужно заменить. Тогда вам не нужно каждый раз запускать функцию jQuery.

.might-overflow {
    text-overflow: ellipsis;
    overflow : hidden;
    white-space: nowrap;
}

.might-overflow:hover {
    text-overflow: clip;
    white-space: normal;
    word-break: break-all;
}
person Snæbjørn    schedule 29.10.2015
comment
Это не так хорошо, как всплывающая подсказка, потому что может нарушить макет. - person Alexander; 20.11.2015
comment
Проблема с подсказками в том, что они не работают на мобильных устройствах, по крайней мере, на данный момент. Этот ответ может (читай: вероятно, сломает) макет, но его можно адаптировать, например, для другого цвета фона для зависшего элемента. Это по-прежнему не будет работать на мобильных устройствах, но это еще один вариант для настольных компьютеров. - person trysis; 02.08.2016
comment
Спасибо за отличный ответ, который полностью удовлетворяет мои потребности. Используя некоторый JavaScript, мы могли бы представить, как сделать блок абсолютно позиционированным, чтобы он не нарушал макет. - person Niavlys; 02.03.2017
comment
Это хороший ответ, лучше, чем раздувание javascript по проблеме css. Ясно, что многоточие ДОЛЖНО иметь автоматическую опцию заголовка, способ ее реализации в настоящий момент не имеет смысла. Слишком плохо css не позволяет только: навести курсор, если последними символами являются '...' - person John; 22.09.2017

Вот два других решения на чистом CSS:

  1. Показать усеченный текст на месте:

.overflow {
  overflow: hidden;
  -ms-text-overflow: ellipsis;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.overflow:hover {
  overflow: visible;
}

.overflow:hover span {
  position: relative;
  background-color: white;

  box-shadow: 0 0 4px 0 black;
  border-radius: 1px;
}
<div>
  <span class="overflow" style="float: left; width: 50px">
    <span>Long text that might overflow.</span>
  </span>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad recusandae perspiciatis accusantium quas aut explicabo ab. Doloremque quam eos, alias dolore, iusto pariatur earum, ullam, quidem dolores deleniti perspiciatis omnis.
</div>

  1. Показать произвольный " подсказка ":

.wrap {
  position: relative;
}

.overflow {
  white-space: nowrap; 
  overflow: hidden;
  text-overflow: ellipsis;
  
  pointer-events:none;
}

.overflow:after {
  content:"";
  display: block;
  position: absolute;
  top: 0;
  right: 0;
  width: 20px;
  height: 15px;
  z-index: 1;
  border: 1px solid red; /* for visualization only */
  pointer-events:initial;

}

.overflow:hover:after{
  cursor: pointer;
}

.tooltip {
  /* visibility: hidden; */
  display: none;
  position: absolute;
  top: 10;
  left: 0;
  background-color: #fff;
  padding: 10px;
  -webkit-box-shadow: 0 0 50px 0 rgba(0,0,0,0.3);
  opacity: 0;
  transition: opacity 0.5s ease;
}


.overflow:hover + .tooltip {
  /*visibility: visible; */
  display: initial;
  transition: opacity 0.5s ease;
  opacity: 1;
}
<div>
  <span class="wrap">
    <span class="overflow" style="float: left; width: 50px">Long text that might overflow</span>
    <span class='tooltip'>Long text that might overflow.</span>
  </span>
  Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ad recusandae perspiciatis accusantium quas aut explicabo ab. Doloremque quam eos, alias dolore, iusto pariatur earum, ullam, quidem dolores deleniti perspiciatis omnis.
</div>

person Hannes    schedule 22.10.2018
comment
Это именно то, что я искал! - person Praneet Nadkar; 16.11.2018
comment
Отличное решение, именно то, что мне нужно. Спасибо ! - person Agu V; 08.04.2019

Ответ uosɐſ в основном правильный, но вы, вероятно, не захотите делать это в событии mouseenter. Это заставит его выполнять вычисления, чтобы определить, нужно ли это, каждый раз, когда вы наводите указатель мыши на элемент. Если размер элемента не меняется, нет причин для этого.

Было бы лучше просто вызвать этот код сразу после добавления элемента в DOM:

var $ele = $('#mightOverflow');
var ele = $ele.eq(0);
if (ele.offsetWidth < ele.scrollWidth)
    $ele.attr('title', $ele.text());

Или, если вы не знаете, когда именно он был добавлен, вызовите этот код после завершения загрузки страницы.

если у вас есть более одного элемента, с которым вам нужно это сделать, то вы можете дать им один и тот же класс (например, mightOverflow) и использовать этот код для обновления их всех:

$('.mightOverflow').each(function() {
    var $ele = $(this);
    if (this.offsetWidth < this.scrollWidth)
        $ele.attr('title', $ele.text());
});
person Elezar    schedule 10.12.2012
comment
+1, выполнение этого при загрузке страницы кажется проще, но также дает больше возможностей. т.е. вы можете захотеть стилизовать этот элемент, у которого есть всплывающая подсказка с пунктирным подчеркиванием, чтобы сигнализировать о всплывающей подсказке. например $(".mightOverflow").each(function() { if( $(this).offsetWidth < $(this).scrollWidth && !$(this).attr('title')){ $(this).attr('title', $(this).text()); $(this).css('border-bottom', '1px dotted #A8A8A8'); } }); - person Adrien Be; 06.07.2014
comment
'каждый раз, когда вы наводите указатель мыши' неверно (по крайней мере, теперь - я не знаю, обновлялся ли ответ). Он проверяет, был ли он ранее рассчитан '&&! $ this.attr (' title ')' - person Rune Jeppesen; 19.11.2014
comment
Нет, это просто не дает ему снова добавить атрибут title. Расчет, чтобы определить, нужно ли это, все еще выполняется. this.offsetWidth < this.scrollWidth и, возможно, даже проверка на !$this.attr('title') будет выполняться каждый раз, когда вы наводите курсор мыши на элемент. - person Elezar; 19.11.2014
comment
Проблема с этим методом заключается в том, что все элементы проверяются сразу (потенциальное влияние на производительность), и он рассчитывается только один раз, поэтому, если пользователь сжимает браузер, что приводит к усечению или расширению элементов, в результате чего они больше не усекаются, вы не можете обновить наличие всплывающей подсказки. При повторном присоединении кода к изменению размера окна возникнет проблема с производительностью, поскольку каждый элемент проверяет свой размер. Используя делегирование событий $ (document) .on ('mouseenter', '.mightOverflow', ... и откладывая проверку до тех пор, пока вы не наведете указатель мыши на элемент, вы можете обновлять на лету и проверять только 1 элемент за раз - person Chris Janssen; 23.04.2015
comment
Он не работает в IE10 - offsetWidth идентичен scrollWidth, оба дают мне усеченную ширину. - person SsjCosty; 23.01.2017
comment
@SsjCosty, я удалил свою виртуальную машину с IE10, так как Microsoft больше не поддерживает ее, поэтому сейчас я не могу это проверить. Однако я использую scrollWidth во многих местах, и все они были протестированы в IE10, когда он поддерживался. Возможно, вы обнаружили какую-то ошибку в IE10, но я думаю, что более вероятно, что с вашим кодом происходит что-то еще. Например, если у вас есть вложенные элементы, при попытке определить размеры легко посмотреть не на тот элемент. - person Elezar; 24.01.2017
comment
Может быть, хотя один и тот же код работает в IE11, Chrome и FF. С тех пор я нашел обходной путь, так что все в порядке. - person SsjCosty; 26.01.2017

Вот мой плагин jQuery:

(function($) {
    'use strict';
    $.fn.tooltipOnOverflow = function() {
        $(this).on("mouseenter", function() {
            if (this.offsetWidth < this.scrollWidth) {
                $(this).attr('title', $(this).text());
            } else {
                $(this).removeAttr("title");
            }
        });
    };
})(jQuery);

Использование:

$("td, th").tooltipOnOverflow();

Редактировать:

Я понял суть этого плагина. https://gist.github.com/UziTech/d45102cdffb1039d4415

person Tony Brix    schedule 14.07.2014
comment
Он не работает в IE10 - offsetWidth идентичен scrollWidth, оба дают мне усеченную ширину. - person SsjCosty; 23.01.2017
comment
@SsjCosty, почему вы тестируете IE 10? На данный момент никто не должен использовать IE 10, поскольку любой, кто может установить IE 10, может установить IE 11. - person Tony Brix; 23.01.2017
comment
Ну что ж, у нас есть политика компании, согласно которой наша минимальная поддерживаемая версия IE - 10. Также потому, что многие наши клиенты (некоторые банки и различные учреждения) все еще используют IE10. Ну что ж. - person SsjCosty; 26.01.2017
comment
@SsjCosty Да, это проблема крупных компаний. У ИТ-специалистов нет денег, чтобы избавиться от 5-летнего несовместимого браузера. Но не волнуйтесь, менеджмент получает много бонусов ... :-)) Немного не по теме, я знаю. - person Peter VARGA; 09.09.2020

Нам нужно определить, действительно ли применено многоточие, а затем показать всплывающую подсказку для отображения полного текста. Недостаточно просто сравнить "this.offsetWidth < this.scrollWidth", когда элемент почти удерживает свое содержимое, но ему не хватает только одного или двух пикселей по ширине, особенно для текста с полноразмерными китайскими / японскими / корейскими символами.

Вот пример: http://jsfiddle.net/28r5D/5/

Я нашел способ улучшить обнаружение многоточия:

  1. Сначала сравните "this.offsetWidth < this.scrollWidth", в случае неудачи продолжите шаг 2.
  2. Временное переключение стиля css на {'overflow': 'visible', 'white-space': 'normal', 'word-break': 'break-all'}.
  3. Разрешить браузеру выполнить ретрансляцию. Если происходит перенос слов, высота элемента увеличивается, что также означает, что требуется многоточие.
  4. Восстановить стиль css.

Вот мое улучшение: http://jsfiddle.net/28r5D/6/

person Feng Dihai    schedule 27.05.2014

Я создал плагин jQuery, который использует всплывающую подсказку Bootstrap вместо встроенной всплывающей подсказки браузера. Обратите внимание, что это не было протестировано со старым браузером.

JSFiddle: https://jsfiddle.net/0bhsoavy/4/

$.fn.tooltipOnOverflow = function(options) {
    $(this).on("mouseenter", function() {
    if (this.offsetWidth < this.scrollWidth) {
        options = options || { placement: "auto"}
        options.title = $(this).text();
      $(this).tooltip(options);
      $(this).tooltip("show");
    } else {
      if ($(this).data("bs.tooltip")) {
        $tooltip.tooltip("hide");
        $tooltip.removeData("bs.tooltip");
      }
    }
  });
};
person Steven    schedule 13.07.2017
comment
Просто и гениально. Спасибо! - person GumZ; 08.09.2018

Вот решение Vanilla JavaScript:

(function init() {

  var cells = document.getElementsByClassName("cell");

  for(let index = 0; index < cells.length; ++index) {
    let cell = cells.item(index);
    cell.addEventListener('mouseenter', setTitleIfNecessary, false);
  }

  function setTitleIfNecessary() {
    if(this.offsetWidth < this.scrollWidth) {
      this.setAttribute('title', this.innerHTML);
    }
  }

})();
.cell {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  border: 1px;
  border-style: solid;
  width: 120px; 
}
<div class="cell">hello world!</div>
<div class="cell">hello mars! kind regards, world</div>

person wuarmin    schedule 11.06.2019

Если вы хотите сделать это исключительно с помощью javascript, я бы сделал следующее. Дайте диапазону атрибут id (чтобы его можно было легко извлечь из DOM) и поместите все содержимое в атрибут с именем content:

<span id='myDataId' style='text-overflow: ellipsis; overflow : hidden;
 white-space: nowrap; width: 71;' content='{$myData}'>${myData}</span>

Затем в вашем javascript вы можете сделать следующее после того, как элемент был вставлен в DOM.

var elemInnerText, elemContent;
elemInnerText = document.getElementById("myDataId").innerText;
elemContent = document.getElementById("myDataId").getAttribute('content')
if(elemInnerText.length <= elemContent.length)
{
   document.getElementById("myDataId").setAttribute('title', elemContent); 
}

Конечно, если вы используете javascript для вставки диапазона в DOM, вы можете просто сохранить содержимое в переменной перед его вставкой. Таким образом, вам не нужен атрибут содержимого в диапазоне.

Если вы хотите использовать jQuery, есть более элегантные решения.

person Mark Costello    schedule 29.03.2011
comment
Отлично. Поскольку я использую JQuery в другой части этой страницы - что такое элегантное решение JQuery? - person Spiderman; 29.03.2011
comment
Я попробовал ваше первое предложение с чистым javascript - не работает. свойство 'innerText' сохраняет полную длину текста, даже если он не отображается полностью на экране, поэтому всегда: elemInnerText.length == elemContent.length !! - person Spiderman; 30.03.2011
comment
Стиль вашего диапазона - ширина 71. Почему бы не проверить, длиннее ли ширина строки? Если вы хотите сделать что-то действительно необычное, вы можете добавить скрытый элемент без набора текста-переполнения: многоточие и сравнить ширину обоих. Если скрытый шире, чем не скрытый, добавьте атрибут заголовка к видимому. - person Mark Costello; 30.03.2011

Это было мое решение, работает как амулет!

    $(document).on('mouseover', 'input, span', function() {
      var needEllipsis = $(this).css('text-overflow') && (this.offsetWidth < this.scrollWidth);
      var hasNotTitleAttr = typeof $(this).attr('title') === 'undefined';
      if (needEllipsis === true) {
          if(hasNotTitleAttr === true){
            $(this).attr('title', $(this).val());
          }
      }
      if(needEllipsis === false && hasNotTitleAttr == false){
        $(this).removeAttr('title');
      }
  });
person FarukT    schedule 03.07.2019
comment
Привет @FarukT, ваше решение отлично работает для меня, большое спасибо. Я хочу спросить, есть ли у меня два тега html, предполагающие input и span, и я хочу одновременно вычислить offsetWidth обоих этих тегов, чтобы выполнить некоторые арифметические вычисления с использованием этих offsetWidth. Как бы я это сделал? - person Kunal Tyagi; 19.05.2020
comment
Привет, @KunalTyagi, вы можете использовать две отдельные функции, я написал только одну с вводом и диапазоном, но вы можете воспроизвести эту функцию 2 раза, например, первую функцию только с вводом, а во второй функции - только диапазон. вот так: $ (document) .on ('mouseover', 'input', function () {...}); и второй $ (document) .on ('mouseover', 'span', function () {...}); - person FarukT; 19.05.2020

Вот что я сделал. Большинство сценариев всплывающих подсказок требуют, чтобы вы выполнили функцию, которая хранит всплывающие подсказки. Это пример jQuery:

$.when($('*').filter(function() {
   return $(this).css('text-overflow') == 'ellipsis';
}).each(function() {
   if (this.offsetWidth < this.scrollWidth && !$(this).attr('title')) {
      $(this).attr('title', $(this).text());
   }
})).done(function(){ 
   setupTooltip();
});

Если вы не хотите проверять многоточие css, вы можете упростить, например:

$.when($('*').filter(function() {
   return (this.offsetWidth < this.scrollWidth && !$(this).attr('title'));
}).each(function() {
   $(this).attr('title', $(this).text());
})).done(function(){ 
   setupTooltip();
});

У меня есть «когда», так что функция «setupTooltip» не выполняется, пока не будут обновлены все заголовки. Замените «setupTooltip» своей функцией всплывающей подсказки, а * - элементами, которые вы хотите проверить. * пройдёт через все, если вы оставите это.

Если вы просто хотите просто обновить атрибуты заголовка с помощью всплывающей подсказки браузера, вы можете упростить, например:

$('*').filter(function() {
   return $(this).css('text-overflow') == 'ellipsis';
}).each(function() {
   if (this.offsetWidth < this.scrollWidth && !$(this).attr('title')) {
      $(this).attr('title', $(this).text());
   }
});

Или без проверки на многоточие:

$.when($('*').filter(function() {
   return (this.offsetWidth < this.scrollWidth && !$(this).attr('title'));
}).each(function() {
   $(this).attr('title', $(this).text());
});
person fanfavorite    schedule 30.05.2013
comment
Почему голос против? Прокомментируйте, если вы это делаете, чтобы люди знали, в чем проблема. Спасибо. - person fanfavorite; 03.11.2016

У меня есть класс CSS, который определяет, где поставить многоточие. Исходя из этого, я делаю следующее (набор элементов может быть другим, я пишу те, где используется многоточие, конечно, это может быть отдельный селектор классов):

$(document).on('mouseover', 'input, td, th', function() {
    if ($(this).css('text-overflow') && typeof $(this).attr('title') === 'undefined') {
        $(this).attr('title', $(this).val());
    }
});
person Alexander    schedule 20.11.2015
comment
в моем случае this был anchor, поэтому я использовал this.text() вместо val() - person Basheer AL-MOMANI; 08.03.2017

Это то, что я в итоге сделал на основе https://stackoverflow.com/a/13259660/1714951 и добавления удаления атрибута title, когда элемент больше не переполняется. Это чистый JS (ES6), использует делегирование событий для повышения производительности (при использовании нескольких элементов с одним и тем же классом) и защитные предложения для удобства чтения:

// You may want to change document by an element closer to your target
// so that the handler is not executed as much
document.addEventListener( 'mouseenter', event => {
    let eventTarget = event.target;
    // This could be easily applied to text-truncate instead of my-class if you use bootstrap
    if ( !eventTarget.classList?.contains( 'my-class' ) ) {
        return;
    }
    if ( eventTarget.offsetWidth < eventTarget.scrollWidth ) {
        eventTarget.setAttribute( 'title', eventTarget.innerText );
        return;
    }
    eventTarget.removeAttribute( 'title' );
}, true );
person Miguel Sánchez Villafán    schedule 22.05.2021

Ни одно из вышеперечисленных решений не помогло мне, но я нашел отличное решение. Самая большая ошибка, которую делают люди, - это то, что все 3 свойства CSS объявлены в элементе при загрузке страницы. Вы должны добавить эти стили + всплывающую подсказку динамически, ЕСЛИ и ТОЛЬКО ЕСЛИ диапазон, на котором вы хотите использовать эллипсы, шире, чем его родительский.

    $('table').each(function(){
        var content = $(this).find('span').text();
        var span = $(this).find('span');
        var td = $(this).find('td');
        var styles = {
            'text-overflow':'ellipsis',
            'white-space':'nowrap',
            'overflow':'hidden',
            'display':'block',
            'width': 'auto'
        };
        if (span.width() > td.width()){
            span.css(styles)
                .tooltip({
                trigger: 'hover',
                html: true,
                title: content,
                placement: 'bottom'
            });
        }
    });
person Brian Gabriel    schedule 15.11.2013

Вы могли бы окружить промежуток другим промежутком, а затем просто проверить, больше ли ширина исходного / внутреннего промежутка, чем ширина нового / внешнего промежутка. Обратите внимание, что я говорю «возможно» - это примерно основано на моей ситуации, когда у меня был span внутри td, поэтому я на самом деле не знаю, будет ли он работать с span внутри span.

Вот мой кодекс для других, которые могут оказаться в положении, аналогичном моему; Я копирую / вставляю его без изменений, даже если он находится в контексте Angular, я не думаю, что это умаляет удобочитаемость и основную концепцию. Я закодировал его как метод обслуживания, потому что мне нужно было применить его в более чем одном месте. Селектор, который я передал, был селектором класса, который будет соответствовать нескольким экземплярам.

CaseService.applyTooltip = function(selector) {
    angular.element(selector).on('mouseenter', function(){
        var td = $(this)
        var span = td.find('span');

        if (!span.attr('tooltip-computed')) {
            //compute just once
            span.attr('tooltip-computed','1');

            if (span.width() > td.width()){
                span.attr('data-toggle','tooltip');
                span.attr('data-placement','right');
                span.attr('title', span.html());
            }
        }
    });
}
person Dexygen    schedule 07.01.2016