Tooltipster не работает должным образом
Я пытаюсь кодировать расширение Chrome, которое выделяет определенные имена и дает вам дополнительную информацию об имени во всплывающей подсказке. По сути, у меня есть объект с именами и идентификаторами, как это:
var list = {
'Name1' : 'ID0001',
'Name2' : 'ID0002',
}
Затем я использую плагин выделения jQuery, чтобы выделить все вхождения ключей в документе, и назначаю элемент span с классом, соответствующим значению ключа (для примера ID0001), который работает нормально...
$.each(list, function(key, value) {
$("p").highlight(key, {caseSensitive: false, className: value });
});
и результаты в этом:
<span class="ID0001">Name_1</span>
Затем я пытаюсь выбрать каждый элемент с именем класса, содержащим первую часть идентификатора, и активировать Tooltipster:
$('span[class*=ID]').tooltipster({
interactive: true,
content: $(<p>Loading...</p>),
contentAsHTML: true,
functionBefore: function(origin, continueTooltip) {
continueTooltip();
// Below, I'm trying to get whole ID, without the
// 'tooltipstered' class, that Tooltipster assigned.
var id = $(this).attr('class').replace(' tooltipstered','');
$.getJSON(chrome.extension.getURL('db.json'), function(db) {
// Inside here, I'm using the ID to get information from a json
// file and store it in a variable called 'content', e.g.
var content = '<p>db[id].link</p>';
// Then I'm trying to update the content of the tooltip:
origin.tooltipster({
content: content,
contentAsHTML: true
});
}
});
Весь этот код внутри этого:
$(document).ready(function() { });
Теперь, если я наведу курсор мыши на диапазон с именем внутри, tooltipster ничего не сделает, и консоль Chrome скажет следующее:
Uncaught ReferenceError: content is not defined
Но я наведу на него курсор мыши во второй раз, и он покажет мне правильное содержание. Кроме того, если я наведу курсор на имя в первый раз и другое имя во второй раз, во всплывающей подсказке будет отображаться содержимое для имени.
Я довольно новичок в JS и jQuery и просто не могу понять, что я делаю здесь неправильно.
Я нашел несколько других тем о подобных проблемах, но ни одно из предложенных решений не помогло мне.
Вот "полный" обновленный код:
$(document).ready(function() {
$.each(list, function(key, value) {
$("p").highlight(key, {caseSensitive: false, className: value });
});
$('span[class*=ID]').tooltipster({
interactive: true,
contentAsHTML: true,
content: 'Loading...',
functionBefore: function(origin, continueTooltip) {
continueTooltip();
var id = $(this).attr('class').replace(' tooltipstered','');
var content = generate_content(id);
origin.tooltipster('content', content);
}
});
function generate_content(id) {
$.getJSON(chrome.extension.getURL('db.json'), function(db) {
// Getting information from the .sjon and storing it in "content"
});
return content;
}
});
1 ответ
Поскольку вызов $.getJSON является асинхронным, вы должны обновить содержимое всплывающей подсказки в завершенном обратном вызове $.getJSON. Вы можете использовать что-то вроде кода ниже -
$('span[class*=ID]').tooltipster({
interactive: true,
contentAsHTML: true,
content: 'Loading...',
functionBefore: function(origin, continueTooltip) {
continueTooltip();
var id = $(this).attr('class').replace(' tooltipstered','');
generate_content(id, origin);
}
});
function generate_content(id, origin) {
$.getJSON(chrome.extension.getURL('db.json'), function(db) {
// Getting information from the .sjon and storing it in "content"
var content - set the content here.
origin.tooltipster('content', content);
});
}
})