带有手动触发和选择器选项的引导工具提示

Posted

技术标签:

【中文标题】带有手动触发和选择器选项的引导工具提示【英文标题】:Bootstrap Tooltip with manual trigger and selector option 【发布时间】:2014-09-18 08:15:46 【问题描述】:

我有一个动态表,加载了 ajax。当我将鼠标悬停在 row 上时,我想显示一个工具提示,但我希望工具提示出现在某个 cell(类 .name)而不是上方整行。

另外,使用 title 函数,我需要能够获取最接近的行 ID 并返回自定义模板。

这是我的代码

<table class="table" id="myTable">
    <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Country</th>
            <th>Statistics</th>
        </tr>
    </thead>
    <tbody>
        <tr id="1">
            <td >1</td>
            <td class="name">Name #1</td>
            <td>United States of America</td>
            <td>100%</td>
        </tr>
        <tr id="2">
            <td >2</td>
            <td class="name">Name #2</td>
            <td>United States of America</td>
            <td>50%</td>
        </tr>
    </tbody>
</table>

初始化

$('#myTable').tooltip(
    container: 'body',
    html: true,
    selector: 'td.name',
    trigger: 'manual',
    title: function() 
        // here will be custom template
        var id = $(this).parent().atrr('id');
        return id;
    
);

尝试一:Demo in jsFiddle

$('#myTable')
    .on('mouseenter focusin', 'tbody > tr', function() 
        $(this).find('td.name').tooltip('show');
    )
    .on('mouseleave focusout', 'tbody > tr', function() 
        $(this).find('td.name').tooltip('hide');
    );

尝试二:Demo in jsFiddle

var tip;
$('#myTable')
    .on('mouseenter focusin', 'tbody > tr', function() 
        tip = $(this).find('.offer-name');
        tip.tooltip(hereAllTooltipOptions);
        tip.tooltip('show');
    )
    .on('mouseleave focusout', 'tbody > tr', function() 
        tip.tooltip('hide');
    );

但我非常想知道这种解决方案的性能。那么,问题是如何做到并做得更好?

【问题讨论】:

【参考方案1】:

这里的问题是当trigger 设置为manual 时,您不能使用selector 选项。 selector is used for delegation when bootstrap is handling the trigger events,但你已经明确表示你将是处理委托的人,所以它是ignores the selector setting。

这意味着我们从使用如下代码进行预初始化获得任何东西

$('.parent').tooltip(
    selector: '.child',
    trigger: 'manual'
)

它只是说我想在 .child 元素上设置工具提示,但不要对此做任何事情,因为我稍后会处理它。

这很好,这就是我们在使用manual 时想要做的。我们将决定何时显示或隐藏工具提示。

让我们看看一个简单的例子:

$('#myTable').on(
    'mouseenter': function() 
        $(this).find('td.name').tooltip('show');
    ,
    'mouseleave': function() 
        $(this).find('td.name').tooltip('hide');
    
,'tbody > tr');

Demo in js Fiddle

但是,这在这种情况下不起作用,因为我们想要动态生成工具提示。当我们在特定元素上调用.tooltip('show') 时,bootstrap 会查看该元素以查看它是否已被初始化或具有标题。上面的例子是可行的,因为我已经硬编码了一个标题,但是如果我们想先初始化这个工具提示,我们将如何使用它呢?

在显示工具提示之前即时初始化,如下所示:

$('#myTable').on(
    'mouseenter': function() 
        $(this).find('td.name')
            .tooltip(
                container: 'body',
                html: true,
                trigger: 'manual',
                title: function() 
                    return this.parentNode.id;
                
            ).tooltip('show');
    ,
    'mouseleave': function() 
        $(this).find('td.name').tooltip('hide');
    
,'tbody > tr');

因此您不会在每次悬停时产生初始化成本,您可以将初始化包装在一个 if 语句中,以 check if it has already been initialized 如下所示:

var $cell = $(this).find('td.name');
if (!$cell.data("bs.tooltip")) 
    $cell.tooltip( /* options */ );

$cell.tooltip('show');

Demo in jsFiddle

【讨论】:

谢谢!!这正是我需要的:)。另外,刚刚发现我可以使用$cell.data('bs.tooltip')检查工具提示是否已初始化。 “选择器”上的引导文档非常模糊。我完全忽略了使用 tooltip() 函数和选项本身可以简单地动态生成动态工具提示的可能性。谢谢! 感谢这段代码,我也可以将它用于弹出窗口。另外提醒一下:我打算在不注明出处的情况下使用此代码,因为您似乎是免费提供的。 @KyleMit 感谢您的周到回复。对我来说,归因并跟上它们只是一件麻烦事。实际上,我通常会在我的源代码中保留一个指向问题的链接,但通常就是这样。如果我自己理解代码,我可能不会这样做。我曾经问过这个问题(meta.***.com/questions/253618/…)。无论如何,我相信您合法地保留版权,并且如果您愿意,可以允许其他人在不注明出处的情况下使用。目前,我假设您不希望这样做,这是完全可以接受的。 非常感谢@KyleMit。哈,我想我可以看出你一定觉得它很有趣,因为这个数字从 95 上升到了 96 :)。是的,请随意删除。保重

以上是关于带有手动触发和选择器选项的引导工具提示的主要内容,如果未能解决你的问题,请参考以下文章

Bootstrap.js 抛出选择器选项错误:在 windows.document 对象上初始化工具提示时必须指定选择器选项

嵌入式持久引导日期选择器

引导日期选择器的覆盖选项

带有手动输入和动态最小日期的 jQuery UI 日期选择器

带有引导日期选择器的 Laravel 4

如何在引导选择选择器中为选项(下拉菜单)设置固定宽度