Стилизованные подсказки с использованием jQuery - PullRequest
0 голосов
/ 17 апреля 2020

A в то время как go Я использовал код по ссылке http://www.jquerybyexample.net/2012/09/tutorial-for-creating-simple-stylized-tooltip-using-jquery.html, чтобы создать подсказку, которая следует за мышью при наведении курсора на виджет, для которого включена подсказка. Это было до того, как действительно вышло HTML5, которое поддерживает всплывающие подсказки, но не совсем так, как я хочу.

В любом случае, код имеет смещения x и y от мыши, жестко запрограммированные, так что x- смещение на 20 пикселей вправо, а смещение по оси y на 10 пикселей выше от мыши и следует за мышью над виджетом. Обычно это нормально, но когда виджет находится справа от окна, это может быть проблемой. Конечно, хотя я могу жестко запрограммировать любые значения, я хочу иметь возможность указывать смещения в коде HTML.

Я в процессе обновления своего веб-сайта и размещения его на новом сервере. Исходная страница по-прежнему находится по ссылке http://cs-cubed.com: 8080 / и использует эту функцию (во избежание коллизии портов она теперь находится на порте 8080). Вы можете навести курсор мыши на элементы ниже зеленой линии, чтобы увидеть это. Зеленый счетчик посещений не работает, и эта страница больше не поддерживается.

Новая страница находится по ссылке https://cs-cubed.com/ (обратите внимание, что сертификат SSL еще не установлен) использует модифицированный код jQuery:

$(function() {
  $('.tool-tip').hover(function(event) {
    var toolTip = $(this).attr('tlp');
    var offy = $(this).attr('offy');             // Line added
    var offx = $(this).attr('offx');             // Line added
    if (typeof offy === 'undefined') offy = -10; // If no offset is given use this default
    if (typeof offx === 'undefined') offx = 20;  // If no offset is given use this default
    $('<span class="tooltip"></span>').text(toolTip)
      .appendTo('body')
      .css('top', (event.pageY + offy) + 'px')   // Replace the hard code by offy
      .css('left', (event.pageX + offx) + 'px')  // Replace the hard code by offx
      .fadeIn('slow');
   }, function() {
      $('.tooltip').remove();
   }).mousemove(function(event) {
     $('.tooltip')
       .css('top', (event.pageY + offy) + 'px')  // Replace the hard code by offy
       .css('left', (event.pageX + offx) + 'px');// Replace the hard code by offx
  });
});

Затем, например, для всплывающей подсказки для кнопки «Обновить журнал» в правом нижнем углу на новой странице у меня есть следующий код HTML:

<div class="box j">
  <input id="update-log" class="btn tool-tip" tlp="Click on this button to see the update log. If the last
    update in the log does not match the date at the bottom here, you may need to refresh your browser by
    entering cs-cubed.com/update-log.html and refrshing the browser."
    type="button" value="Update Log" />
</div>

с использованием модифицированного кода jQuery. Это все еще работает до тех пор, пока я не добавлю offx и offy в качестве атрибутов в коде HTML, поэтому они не определены в коде jQuery и используются значения по умолчанию. Однако подсказка не следует за мышью, когда она перемещается над виджетом.

Гораздо серьезнее то, что попытки включить атрибуты offx и / или offy в код HTML не работают. Например, я хочу что-то вроде:

<div class="box j">
  <input id="update-log" class="btn tool-tip" offx="-20" offy="5" tlp="Click on this ..."
    type="button" value="Update Log" />
</div>

для всплывающей подсказки для кнопки, со смещениями, заданными как атрибуты offx и offy, но либо ничего не отображается, либо подсказка появляется в совершенно другой части страницы.

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

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

ОК, большое спасибо, действительно, после некоторой дополнительной игры вокруг, я заставил это работать. Полный код выглядит следующим образом:

$('.tool-tip').hover(function(event) {
  var toolTip = $(this).attr('tlp');
  var offy = $(this).attr('offy');
  var offx = $(this).attr('offx');
  offy = (typeof offy === 'undefined') ? -10 : parseInt(offy);  // If offy isn't given use this default
  offx = (typeof offx === 'undefined') ?  20 : parseInt(offx);  // If offx isn't given use this default
  $('<span class="tooltip"></span>').text(toolTip)
    .appendTo('body')
    .css('top', (event.pageY + offy) + 'px')
    .css('left', (event.pageX + offx) + 'px')
    .fadeIn('slow');
}, function() {
  $('.tooltip').remove();
}).mousemove(function(event) {
  var offy = $(this).attr('offy');
  var offx = $(this).attr('offx');
  offy = (typeof offy === 'undefined') ? -10 : parseInt(offy); // If offy isn't given use this default
  offx = (typeof offx === 'undefined') ?  20 : parseInt(offx); // If offx isn't given use this default
  $('.tooltip')
    .css('top', (event.pageY + offy) + 'px')
    .css('left', (event.pageX + offx) + 'px');
});

, где я убрал код с помощью третичного оператора.

Однако есть ловушка, которую вы должны искать. Ни в коем случае подсказка инструмента не может закрывать то место, куда указывает мышь, иначе она не будет отображаться. Это объясняет, почему значения по умолчанию смещений x и y в исходном коде равны 20 и -10 соответственно, так что верхний левый угол окна подсказки инструмента находится справа и немного выше того места, куда указывает мышь, например, что первая строка текста подсказки выровнена с помощью мыши по горизонтали. Обычно это нормально, за исключением случаев, когда виджет находится справа от окна браузера, что вызвало проблемы, упомянутые ранее.

Если значение x-offset установлено на ноль или отрицательное значение, подсказка рискует бегать туда, куда указывает мышь. Если в то же время смещение по оси y установлено на отрицательное значение, так что верхний левый угол окна подсказки инструмента находится значительно выше виджета, подсказка инструмента может остаться без движения над положением мыши, но если нет При наличии достаточного пространства между мышью и правой частью окна браузера текст в подсказке перетекает на несколько строк и может привести к тому, что нижняя часть подсказки инструмента переместится туда, куда указывает мышь. Чтобы избежать этого, следует использовать либо большое отрицательное смещение по оси Y, либо предпочтительно использовать достаточно большое положительное смещение по оси Y. В последнем случае, когда окно всплывающей подсказки увеличивается вниз, если его текст простирается на большее количество строк, оно будет оставаться в стороне от мыши.

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

0 голосов
/ 18 апреля 2020

Вам не хватает извлечения значений смещения в вашем mousemove() обратном вызове функции

.mousemove(function(event) {
    var offy = $(this).attr('offy');
    var offx = $(this).attr('offx');

    if (typeof offy === 'undefined') offy = -10;  // If offy isn't given use this default

    if (typeof offx === 'undefined') offx = 20;   // If offx isn't given use this default

    $('.tooltip')
        .css('top', (event.pageY + offy) + 'px')
        .css('left', (event.pageX + offx) + 'px');
});

ОБНОВЛЕНИЕ

Это всего лишь одна из причуд JS, поскольку сами атрибуты являются строковыми, как offy="20", поэтому, когда вы делаете event.pageY + offy, он принимает значение «720» + «20» = «72020». Вам нужно преобразовать значение атрибута в число, а затем использовать его так:

$('.tool-tip').hover(function(event) {
       var toolTip = $(this).attr('tlp');
       var offy = $(this).attr('offy');
       offy = parseInt(offy);
       var offx = $(this).attr('offx');
       offx = parseInt(offx);

       //...

    }, function() {
        $('.tooltip').remove();
    }).mousemove(function(event) {
       var offy = $(this).attr('offy');
       offy = parseInt(offy);
       var offx = $(this).attr('offx');
       offx = parseInt(offx);

       //...

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...