Я пытаюсь реализовать всплывающую подсказку с загрузкой 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);
});
Вот всплывающая подсказка при загрузке, на данный момент всплывающая подсказка соответствует области просмотра.

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

В этом случае, если бы он переместился над элементом всплывающей подсказки, он был бы полностью видим, однако даже если я позволю всплывающей подсказке исчезнуть, а затем снова переместить мышь, чтобы навести курсор, загрузив его из локального кеша всплывающих подсказок, он выиграет ' t репозиция.
Я изучил свойство position для всплывающей подсказки, однако, если возможно, я бы хотел избежать необходимости указывать его вручную и позволить плагину обрабатывать его автоматически.
Есть ли способ разместить всплывающую подсказку там, где большая ее часть будет видна после при загрузке ajax?
Обновлено:
Я попробовал решение @Stphane с положением {my: 'left top+15', at: 'left bottom', of: this, collision: 'flipfit'}, однако оно неправильно расположено, похоже, игнорирует часть top / bottom и вместо этого принимает сертификат, как показано здесь:
Заглянув в консоль, я вижу
Error: no such method 'instance' for tooltip widget instance
что, я думаю, может быть связано с тем, что мы все еще используем jQuery UI версии 1.10.4



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать свойство 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>Есть способ лучше, чем использование интервала. Я отредактировал свой ответ.
@MatteoTassinari, похоже, что раздел "альтернатива setInterval" в моем ответе не работает и с 1.10.4. Я потратил на это некоторое время, хочу, чтобы вы рассказали об ограничении версии раньше. Но мы найдем способ.
Вы абсолютно правы, и мне очень жаль, что я зря потратил ваше время, я не писал его, потому что был уверен, что использую последнюю версию, и только сообщение об ошибке в консоли заставило меня понять, что я был неправ
@MatteoTassinari В качестве обходного пути все, что вам нужно сделать, это напрямую искать HTMLDOMElement всплывающей подсказки вместо того, чтобы полагаться на экземпляр плагина всплывающей подсказки: я заменил этот this.tooltip('instance').bindings.filter('.ui-tooltip').position({ на $('.ui-tooltip').position({ (плюс скрипт и ссылка css на соответствующую версию). Проверьте мое обновление.
Спасибо за новый ввод, но разве $('.ui-tooltip') не выберет всплывающие подсказки все вместо только текущего?
Да, но похоже, что плагин обрабатывает всплывающие подсказки с помощью одного HTMLElement. Вы можете видеть, что код работает так. В противном случае нам нужно было бы найти, как плагин связывает всплывающую подсказку HTMLElement с конкретным узлом, чтобы выбрать правильный узел при установке позиции.
Позвольте нам продолжить обсуждение в чате.
Это может сработать, я попробую, как только смогу, мне просто нужно изменить код, чтобы он работал в зависимости от высоты, а не ширины, спасибо!