3

我正在尝试编写一个 chrome 扩展来突出显示某些名称,并在工具提示中为您提供有关该名称的其他信息。基本上,我有一个名称和 ID 如下的对象:

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>

接下来,我尝试选择每个类名包含 ID 第一部分的元素并激活 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;
}

});
4

1 回答 1

0

由于对 $.getJSON 的调用是异步的,因此您应该在 $.getJSON 的 done 回调中更新工具提示器的内容。您可以使用类似下面的代码 -

$('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);

    });
}

})

于 2015-06-06T22:20:26.017 回答