Сделайте изменение положения всплывающей подсказки пользовательского интерфейса jQuery после загрузки Ajax

Я пытаюсь реализовать всплывающую подсказку с загрузкой ajax, которая должна содержать таблицу HTML.

Сначала всплывающая подсказка отображает текст «загрузка ...» во время выполнения вызова ajax, а затем, когда данные HTML получены, они используются в качестве содержимого всплывающей подсказки.

Проблема в том, что положение всплывающей подсказки, кажется, вычисляется только в начале, когда отображается «загрузка ...», а не снова, когда содержимое всплывающей подсказки изменяется.

Всплывающие подсказки инициализируются следующим кодом:

$('.my_tooltip').each(function() {
    var $this = $(this),
        tooltip_url = $this.data('tooltip-url'),
        cache_id = tooltip_url || '',
        opts = $.extend({}, {
            content: function(done) {
                if (tooltip.cache[cache_id]) {
                    return tooltip.cache[cache_id];
                }

                if (tooltip_url) {
                    Ajax.get($this.data('tooltip-url'), {}, {
                        dataType: 'html',
                        success: function(data) {
                            tooltip.cache[cache_id] = data;
                            done(tooltip.cache[cache_id]);
                        },
                        error: function() {
                            done('Error while loading data!');
                        }
                    });

                    return 'Loading...';
                }

                return $this.attr('title');
            },
            items: $this,
            tooltipClass: $this.data('tooltip-class') || ('age-tooltip' + (!tooltip_id && !tooltip_url ? '-auto' : ''))
        }, options);

    $this.tooltip(opts);
});

Вот всплывающая подсказка при загрузке, на данный момент всплывающая подсказка соответствует области просмотра. Сделайте изменение положения всплывающей подсказки пользовательского интерфейса jQuery после загрузки Ajax

И вот как это выглядит после загрузки: вы видите, что всплывающая подсказка не изменилась автоматически, поэтому вы можете увидеть менее половины ее. Сделайте изменение положения всплывающей подсказки пользовательского интерфейса jQuery после загрузки Ajax

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

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

Есть ли способ разместить всплывающую подсказку там, где большая ее часть будет видна после при загрузке ajax?

Обновлено:

Я попробовал решение @Stphane с положением {my: 'left top+15', at: 'left bottom', of: this, collision: 'flipfit'}, однако оно неправильно расположено, похоже, игнорирует часть top / bottom и вместо этого принимает сертификат, как показано здесь:

Сделайте изменение положения всплывающей подсказки пользовательского интерфейса jQuery после загрузки Ajax

Заглянув в консоль, я вижу

Error: no such method 'instance' for tooltip widget instance

что, я думаю, может быть связано с тем, что мы все еще используем jQuery UI версии 1.10.4

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
732
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать свойство using (являющееся обратным вызовом / ловушкой), задокументированное на метод позиционирования пользовательского интерфейса jQuery

When specified, the actual property setting is delegated to this callback.

Более чистый подход

… Использовать геттер экземпляра tooltip, чтобы как можно скорее применить правильную позицию:

var tooltip = {cache: []},
    posSetter = function () {
        // 1.10.4 code
        $('.ui-tooltip').position({
        // 1.12.1
        // this.tooltip('instance').bindings.filter('.ui-tooltip').position({
            // Put the values that fit your need
            my: 'left top+15', at: 'left bottom', of: this, collision: "flip fit"
          })
        ;
    };

$('.my_tooltip').each(function() {
  var $this = $(this),
    ownPosSetter = posSetter.bind($this),
    tooltip_url = $this.data('tooltip-url'),
    cache_id = tooltip_url || '',
    opts = $.extend({}, {
      content: function(done) {
        if (tooltip.cache[cache_id]) {
          return tooltip.cache[cache_id];
        }

        if (tooltip_url) {
          setTimeout(() => {
            let content = "<div style='height:200px;width:300px'>Content Loaded!</div>";
            tooltip.cache[cache_id] = content;
            done(content);
            setTimeout(ownPosSetter, 100);
          }, 2000);
          return 'Loading...';
        }

        return $this.attr('title');
      },
      items: $this,
      tooltipClass: 'age-tooltip-auto'
    }, {position: {using: ownPosSetter}});

  $this.tooltip(opts);
});
div.contents {
  min-height: 50px;
  margin-top: 10px;
  border: 1px solid black
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href = "https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.10.4/css/jquery-ui.min.css" rel = "stylesheet" />
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js">
<!-- 
< link href = "https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css" rel = "stylesheet" / >
< script src = "https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js" >
-->
</script>
<div class = "contents"></div>
<div class = "contents"></div>
<div class = "contents"></div>
<div class = "contents"></div>
<div class = "contents"></div>
<div class = "contents"></div>
<div class = "contents"></div>
<div class = "contents my_tooltip" title = "Some content" data-tooltip-url = "//somewhere.com">Has tooltip</div>
<div class = "contents my_tooltip" title = "Some content" data-tooltip-url = "//somewhereelse.com">Has tooltip</div>
<div class = "contents" id = "log"></div>
<div class = "contents"></div>
<div class = "contents"></div>
<div class = "contents"></div>
<div class = "contents"></div>

Это может сработать, я попробую, как только смогу, мне просто нужно изменить код, чтобы он работал в зависимости от высоты, а не ширины, спасибо!

Matteo Tassinari 10.03.2018 17:08

Есть способ лучше, чем использование интервала. Я отредактировал свой ответ.

Stphane 11.03.2018 13:29

@MatteoTassinari, похоже, что раздел "альтернатива setInterval" в моем ответе не работает и с 1.10.4. Я потратил на это некоторое время, хочу, чтобы вы рассказали об ограничении версии раньше. Но мы найдем способ.

Stphane 12.03.2018 10:49

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

Matteo Tassinari 12.03.2018 10:54

@MatteoTassinari В качестве обходного пути все, что вам нужно сделать, это напрямую искать HTMLDOMElement всплывающей подсказки вместо того, чтобы полагаться на экземпляр плагина всплывающей подсказки: я заменил этот this.tooltip('instance').bindings.filter('.ui-tooltip').posi‌​tion({ на $('.ui-tooltip').position({ (плюс скрипт и ссылка css на соответствующую версию). Проверьте мое обновление.

Stphane 12.03.2018 11:16

Спасибо за новый ввод, но разве $('.ui-tooltip') не выберет всплывающие подсказки все вместо только текущего?

Matteo Tassinari 12.03.2018 11:20

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

Stphane 12.03.2018 11:25

Позвольте нам продолжить обсуждение в чате.

Matteo Tassinari 12.03.2018 11:40

Другие вопросы по теме