Javascript.RU

Простая всплывающая подсказка для существующих и динамически добавленых элементов на Jquery 1.4

Значит начну с CSS:

.tooltip {position: absolute;
z-index: 5000;/*эта штука не обязательна, но и не мешает :)*/
top: 0; left: 0;/*задаем начальную позицию*/
max-width: 220px;/*произвольная ширина подсказки не больше 220px*/
margin: 0; padding: 0;/*эт важная штука, поверте*/
display: none;/*и скрываем, она же должна появляться*/}


/*А далее настройки для тега внутри tooltip'а*/

.tooltip div {margin: 0; padding: 2px 5px; font-family: "Times New Roman"; font-size: 16px; font-weight: bolder; line-height: 1.08em; color: white/*вот этот тег можно менять как хочештся*/}

Далее скрипт производитель:

$(function(){

  $('<div class="tooltip"></div>').appendTo('body');/*Здесь создается DIV главный, в файле CSS он display:none вместе с его содержимым он не покажется раньше времени*/

  var eltooltip = $('.help'),/*тут выбираем все объекты в которых есть, заранее расставленый класс .help, не забудте также расставить TITLE с текстом подсказки (ниже будет пример тега, сами всё поймёте)*/

  tooltip = $('div.tooltip'),/*Заносим подсказку в перименную*/

  title;/*пустая переменная для текста подсказки(временного хранения)*/


  eltooltip.live('mouseenter', function(){/*при наведении мыши*/

      title = $(this).attr('title');/*Забираем у элемента TITLE*/
      $(this).attr('title','');/*Стираем текст из title*/
      tooltip.html('<div>'+title+'</div>').css('opacity', '0.7');/*Вставляем DIV с текстом подсказки*/

      $(this).mousemove(function(e){/*при движении мышки*/

          tooltip.show().css({left: e.pageX, top: e.pageY+25});/*появляется подсказка и позиционируется по местонахождению курсора мышки*/

      });

  });

  eltooltip.live('mouseleave', function(){/*передвигаем курсор за пределы курентного элемента*/

      tooltip.empty().hide();/*убираем подсказку*/
      $(this).attr('title', title);/* и возвращаем элементу текст из его TITLE*/

  });

/*И в дополнение*/
  eltooltip.live('click', function(){/*если кто кликнет на объект*/

    tooltip.fadeOut('slow');/*опять таки подсказка исчезает :)*/

  });

});

А теперь пример HTML элемента, при наведении на который, подсказка появится

<div class="help" title="Я подсказка, вот она я, ку-ку :)">Наведи на меня курсор</div>

Вот и всё!
Работает на всех популярных браузерах, на счёт IE6 и IE8 незнаю, а 7-я версия работает нормально.

+3

Автор: Илья Кантор, дата: 30 января, 2010 - 15:09
#permalink

Код слабо читаемый.. Поправить слабо?


Автор: sysya, дата: 30 января, 2010 - 19:36
#permalink

Подредактировал, сейчас читается лучше


Автор: PeaceCoder, дата: 30 января, 2010 - 19:33
#permalink

Вопрос на засыпку. Работает ли подсказка если title будет не в самом высоком элементе?

<div class="help" title="Я подсказка, вот она я, ку-ку :)">
  <div>Наведи на меня ку рсоp</div>
</div>

Автор: sysya, дата: 30 января, 2010 - 19:46
#permalink

Работает на всех тегах, в которых есть class="help" и title="с текстом". Или я не правильно понял вопрос


Автор: PeaceCoder, дата: 30 января, 2010 - 19:51
#permalink

Да, я уже сам прочитал как работает live. через closest()


Автор: sysya, дата: 1 февраля, 2010 - 11:50
#permalink

На счёт Apple Safari последнюю версию качнул для винды, если быстро мышку туда-сюда водить по тегам с подсказками, Сафари выпадает(выключается), остальные выдерживают интенсивную работу. А Опера держится как будто для всплывающих подсказок создана скрипт работает отлично...

Промежуточные итоги тестирования: FF, GChrome, Opera работают даже если дополнительных эффектов добавить, таких как в примере и ещё slideUp/slideDown и свои с помощью animate() (версии тестируемых браузеров последние)


Автор: PeaceCoder, дата: 1 февраля, 2010 - 19:02
#permalink

кстати, судя по алгоритму closest в jQuery то подсказка будет выводится только последняя

<div tittle="подсказка"><div title="подсказка2"></div></div>

Т.е. выведется подсказка2 (как для подсказок и задумано), но в других случаях .live будет не правильно отрабатывать механизм, задуманный для .live.


Автор: sysya, дата: 2 февраля, 2010 - 08:00
#permalink

Зачем такая конструкция тегов?
А если один див смещён относительно другово, всё отлично...
Но можно и так сделать:

$(function(){ var eltooltip = $('.help'), title, tooltip;
eltooltip.live('mouseenter', function(){
	tooltip = $('<div/>').attr('class', 'tooltip'); tooltip.appendTo('body');
	title = $(this).attr('title');
	$(this).removeAttr('title');
	tooltip.html('<div>'+title+'</div>').css('opacity', '0.7');
	$(this).mousemove(function(e){ tooltip.fadeIn(300).css({left: e.pageX, top: e.pageY+25}); });
});
eltooltip.live('mouseleave', function(){ tooltip.hide().remove(); $(this).attr('title', title); });
eltooltip.live('click', function(){ tooltip.hide().remove(); $(this).attr('title', title); });
});

Автор: viglim (не зарегистрирован), дата: 5 февраля, 2010 - 13:53
#permalink

Неплохо, но код написан как-то не в jquery стиле
Например вместо
$('

').appendTo('body');
можно бы
$("

").class("tooltip").appendTo("body");

итд.


Автор: sysya, дата: 5 февраля, 2010 - 14:09
#permalink

Всё без этого работает нормально, у каждого есть возможность, отталкиваясь от моей идеи, усовершенствовать код как угодно...


Автор: Гость (не зарегистрирован), дата: 13 марта, 2010 - 22:37
#permalink

Можно и так:
var offsetY = 10;
var offsetX = 7;
$(".check").hover(function(evt) {

$("

Текст подсказки

").css("top", evt.pageY+offsetY).css("left", evt.pageX+offsetX).appendTo("body");
}, function() {
$("#check_files_hint").remove();
});
$(".check").mousemove(function(evt) {
$("#check_files_hint").css("top", evt.pageY+offsetY).css("left", evt.pageX+offsetX);
});

CSS:
#check_files_hint{
width: 300px;
text-align: justify;
position: absolute;
padding: 0.5em;
background-color: #ffff80;
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
font-size: 12px;
}


Автор: sysya, дата: 14 марта, 2010 - 11:34
#permalink

Тогда придётся для каждого элемента писать такой код, а если подсказки нужны для 40-ка элементов?... или для всех подсказок один и тот же текст?
А про динамически добавленые элементы я вообще молчу...


Автор: sysya, дата: 29 июня, 2011 - 08:01
#permalink

Немного обновил код в части:

title = $(this).attr('title');/*Забираем у элемента TITLE*/
      $(this).attr('title','');/*Стираем текст из title*/
      tooltip.html('<div>'+title+'</div>').css('opacity', '0.7');/*Вставляем DIV с текстом подсказки*/

Вместо удаления атрибута, подсмотрел у одного разработчика, просто затираем его, чтоб текста не было в title


Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 01:14
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 12:55
#permalink

Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
2 + 15 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Другие записи этого автора
Больше записей нет. Прокомментируйте эту запись - может быть, тогда он что-нибудь еще хорошее напишет ;)
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Популярные таги
Последние комментарии
Последние темы на форуме
Forum