ajax 后引导程序中的工具提示不起作用

Posted

技术标签:

【中文标题】ajax 后引导程序中的工具提示不起作用【英文标题】:the tooltip in bootstrap doesn't work after ajax 【发布时间】:2015-12-03 06:40:04 【问题描述】:

我有一个名为 index.php 的文件,其中包含另一个名为 file1.php 的文件(在 index.php 中,我包含了 jQuery、js 等所需的所有文件)。 在 file1.php 中,我有一个带有按钮的表格,每个按钮都打开一个模式。模式中的信息来自对 file2.php 的 ajax 调用。在 file2.php 我创建一个表。在表格中我有单元格:

<button class='btn btn-default tooltip-default' data-toggle='tooltip' data-trigger='hover' data-placement='top' data-content='content' data-original-title='Twitter Bootstrap Popover'>AAA</button>

而且,工具提示不起作用。 但是,当我将它复制到 file1.php 时,如下表所示,工具提示确实有效。

谁能帮我修复工具提示? 谢谢。

【问题讨论】:

【参考方案1】:

我认为您需要在新到达的数据上初始化工具提示,例如

$('[data-toggle="tooltip"]').tooltip();

在 DOM 操作之后将此代码放置到您的 AJAX 成功处理程序中。

【讨论】:

答案有效,但为了进一步澄清,我将以下代码放在返回的 AJAX 页面的末尾。 在 DOM 操作之后,我将代码添加到了我的 AJAX 成功处理程序中。它起作用了,然后它没有。我很困惑为什么它并不总是有效。我有一个表单,用户可以在其中选择多个过滤器、提交表单并获取结果......并重复过程。 AJAX 运行结果查询并显示它们。在结果中,我希望一条数据充当工具提示或弹出框。它可能适用于 1 或 2 个表单提交,然后它就不起作用了。我必须重新加载主页才能使其再次工作。 @Roberto,这可能是因为您的成功函数没有被调用,而您的 ajax 正在调用错误处理程序。在完整的处理程序中调用它应该更加一致。 为我工作。 tks. 我在 jquery 数据表上有工具提示,当在成功处理程序中重新初始化表之后放置时,这对我有用。谢谢。【参考方案2】:

我通过这样的位置设置我的工具提示:

function setUpToolTipHelpers() 
    $(".tip-top").tooltip(
        placement: 'top'
    );
    $(".tip-right").tooltip(
        placement: 'right'
    );
    $(".tip-bottom").tooltip(
        placement: 'bottom'
    );
    $(".tip-left").tooltip(
        placement: 'left'
    );

使用文档就绪调用对其进行初始化:

    $(document).ready(function () 
        setUpToolTipHelpers();
    );

这样我可以确定工具提示的位置,我只需要使用类和标题来分配提示:

<td class = "tip-top", title = "Some description">name</td>

然后我在我的成功 ajax 函数中调用“setUpToolTipHelpers()”。或者你也可以在完整的函数上调用它。这似乎对我很有效。

【讨论】:

【参考方案3】:

您必须将工具提示初始化放在 Ajax 回调函数中:

$.ajax(
    method: "POST",
    url: "some.php"
).done(function( msg ) 
    $('[data-toggle="tooltip"]').tooltip();
);

-或-

而不是将初始化代码放在每个 Ajax 回调函数中 您可以使用 ajaxComplete 事件全局实现它:

/* initializate the tooltips after ajax requests, if not already done */    
$( document ).ajaxComplete(function( event, request, settings ) 
    $('[data-toggle="tooltip"]').not( '[data-original-title]' ).tooltip();
);

此代码将为每个定义了 data-toggle="tooltip" 属性但没有属性 "data-original-title" 的节点初始化工具提示(即工具提示未初始化)。

【讨论】:

【参考方案4】:

您可以通过以下两种方式之一执行此操作:

    您可以编写一个ajaxComplete 函数,这样每次ajax 调用完成后它都会一遍又一遍地重新初始化工具提示。这在您的大多数页面中都有数据表并希望在每次 ajax 数据表调用后初始化工具提示时很有用:
$(document).ajaxComplete(function() 
    $("[data-toggle=tooltip]").tooltip();
);
    也可以在ajax成功回调后调用tooltip函数:
function tool_tip() 
    $('[data-toggle="tooltip"]').tooltip()


tool_tip();  // Call in document ready for elements already present

$.ajax(
    success : function(data) 
        tool_tip();  // Call function again for AJAX loaded content
    
)

【讨论】:

【参考方案5】:

我已经尝试了所有方法,但没有任何效果。 因此,我仔细查看了 click* 时的 tooltip,发现每次触发 shown.bs.tooltip 时都会出现一个 aria- describeby 属性,并且其值每次都会发生变化。

因此,我的方法(并且有效)是更改此动态元素的内容。

我得到了这个代码:

$('body').on('shown.bs.tooltip', function(e) 

    var $element = $(e.target);
    var url = $element.data('url');

    if (undefined === url || url.length === 0) 
        return true;
    

    var $describedByContent = $('#' + $element.attr('aria-describedby')).find('.tooltip-inner');

    if ($element.attr('title').length > 1) 
        $describedByContent.html($element.attr('title'));
        return true;
    

    $.ajax(
        url: url,
        method: 'GET',
        beforeSend: function () 
            $element.attr('title', 'Cargando... espere por favor.');
            $describedByContent.html($element.attr('title'));
        
    ).done(function (data) 
        $element.attr('title', JSON.stringify(data));
        $describedByContent.html($element.attr('title'));
    );

    return true;
);

在我的例子中,我的工具提示有一个 data-url 属性来获取标题的数据。 原来的标题是'-',我不想每次点击*元素时都调用ajax,只是第一次。

对我来说,每次都做一个 ajax 没用,因为我不希望数据变化那么快。

动态创建的元素有一个类为 .tooltip-inner 的元素,所以我们只需要替换它的内容即可。

希望这可能会有所帮助。

*click:我选择了 click 事件,因为默认悬停有时会使系统变得疯狂,并且 show.bs.tooltip 被永远触发,在默认值和新值之间切换。 p>

【讨论】:

【参考方案6】:

在像body这样的现有元素上使用选择器

$('body').tooltip(selector: '[data-toggle="tooltip"]');

【讨论】:

这工作得天衣无缝,在多次 ajax 调用后替换使用:$('[data-toggle="tooltip"]').tooltip()。 像魅力一样工作! 谢谢。出于某种原因,这行得通,汤姆的方法没有=/【参考方案7】:

效果很好。

$('body').tooltip(selector: '[data-toggle="tooltip"]');

【讨论】:

【参考方案8】:

运行

$('#ding_me_tooltip').tooltip('dispose');
$('#ding_me_tooltip').tooltip();

#ding_me_tooltip 是您的选择器的 ajax 之后

【讨论】:

以上是关于ajax 后引导程序中的工具提示不起作用的主要内容,如果未能解决你的问题,请参考以下文章

我正在使用引导程序,除工具提示外一切正常

错误处理程序上的引导验证器不起作用

表单验证在引导程序中不起作用

引导验证(成功)后,表单使用默认方法而不是 ajax 提交。 e.preventDefault() 不起作用?

包含 ajax 后如何初始化引导工具提示?

ajax 设置中的引导选择工具提示仅显示一次