Bootstrap工具提示 - 单击另一个工具提示时隐藏

时间:2013-06-24 11:14:47

标签: javascript jquery twitter-bootstrap tooltip

我希望有人可以提供帮助。

当我点击另一个工具提示图标时,我正试图隐藏工具提示。它有效,但当我决定再次点击最后一个工具提示时,它会“闪烁”工具提示。

var Hastooltip = $('.hastooltip');
HasTooltip.on('click', function(e) {
     e.preventDefault();
     HasTooltip.tooltip('hide');
}).tooltip({
     animation: true
}).parent().delegate('.close', 'click', function() {
     HasTooltip.tooltip('hide');
});

HTML

<a href="#" class="hastooltip" data-original-title="Lorem ipsum dolor sit amet, consectetur adipisicing elit.">
    <h3>Info 1</h3>
</a>

<a href="#" class="hastooltip" data-original-title="Lorem ipsum dolor sit amet, consectetur adipisicing elit.">
    <h3>Info 2</h3>
</a>

如果在用户点击按钮显示工具提示时,有助于将以下标记添加到DOM中。

<div class="tooltip"</div>

9 个答案:

答案 0 :(得分:51)

这可以比上面的答案更容易处理。您可以在show handler中使用一行javascript执行此操作:

$('.tooltip').not(this).hide();

这是一个完整的例子。更改“元素”以匹配您的选择器。

$(element).on('show.bs.tooltip', function() {
    // Only one tooltip should ever be open at a time
    $('.tooltip').not(this).hide();
});

建议使用相同的技术来关闭此SO线程中的弹出窗口:

How can I close a Twitter Bootstrap popover with a click from anywhere (else) on the page?

答案 1 :(得分:14)

您需要检查工具提示是否正在显示并手动切换其可见性。这是一种做法。

$(function() {
  var HasTooltip = $('.hastooltip');
  HasTooltip.on('click', function(e) {
    e.preventDefault();
    var isShowing = $(this).data('isShowing');
    HasTooltip.removeData('isShowing');
    if (isShowing !== 'true')
    {
      HasTooltip.not(this).tooltip('hide');
      $(this).data('isShowing', "true");
      $(this).tooltip('show');
    }
    else
    {
      $(this).tooltip('hide');
    }

  }).tooltip({
    animation: true,
    trigger: 'manual'
  });
});

答案 2 :(得分:4)

我略微修改了kiprainey的代码

const $tooltip = $('[data-toggle="tooltip"]');
 $tooltip.tooltip({
   html: true,
   trigger: 'click',
   placement: 'bottom',
 });
 $tooltip.on('show.bs.tooltip', () => {
   $('.tooltip').not(this).remove();
 });

我使用remove()而不是hide()

答案 3 :(得分:3)

我针对常规工具提示遇到了同样的问题。在iPhone上,点击身体(即其他地方)时它们不会消失。

我的解决方案是,当您点击工具提示本身时,它会隐藏。恕我直言,这应该集成在bootstrap发行版中,因为它代码很少,影响很大。

当您有权访问引导程序源时,请添加

this.tip().click($.proxy(this.hide, this))

作为文件tooltip.js中方法Tooltip.prototype.init的最后一行:

Tooltip.prototype.init = function (type, element, options) {
this.enabled  = true
this.type     = type
this.$element = $(element)
this.options  = this.getOptions(options)

var triggers = this.options.trigger.split(' ')

for (var i = triggers.length; i--;) {
  var trigger = triggers[i]

  if (trigger == 'click') {
    this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
  } else if (trigger != 'manual') {
    var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focus'
    var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'

    this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
    this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
  }
}

this.options.selector ?
  (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
  this.fixTitle()

 // Hide tooltip when clicking on it. Useful for mobile devices like iPhone where eventOut
 // (see above) on $element is not triggered and you don't get rid of the tooltip anymore.
 this.tip().click($.proxy(this.hide, this))
  }

如果您手头没有相关资源,可以通过以下方式获得相同的效果:

    $(function()
    {
        // Apply tooltips
        var hasTooltip = $("[data-toggle='tooltip']").tooltip();

        // Loop over all elements having a tooltip now.
        hasTooltip.each(function()
           {
               // Get the tooltip itself, i.e. the Javascript object
               var $tooltip = $(this).data('bs.tooltip');

               // Hide tooltip when clicking on it
               $tooltip.tip().click($.proxy($tooltip.hide, $tooltip))
           }
        );
    });

对我来说,这可以在iPhone上获得良好的用户体验:点击元素以查看工具提示。点击它消失的工具提示。

答案 4 :(得分:1)

我也在寻找这个问题的解决方案,在我看来$('.tooltip').not(this).hide();会绕过任何引导程序showshownhide或{{1您可能已附加到触发器元素的事件。经过一番思考后,我提出了以下代码,可以更加透明地处理附加事件。

注意:仅在firefox和chrome上测试过,但理论上应该可以正常工作。

&#13;
&#13;
hidden
&#13;
$(document).ready(function() {

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


  $(document).on('show.bs.popover', function(event) {
    // could use [data-toggle="popover"] instead
    // using a different selector allows to have different sets of single instance popovers.
    $('[data-popover-type="singleton"]').not(event.target).each(function(key, el) {
      $(el).popover('hide'); // this way everything gets propagated properly
    });
  });

  $(document).on('click', function(event) {
    // choose to close all popovers if clicking on anything but a popover element.
    if (!($(event.target).data('toggle') === "popover" /* the trigger buttons */ 
          || $(event.target).hasClass('popover') /* the popup menu */
          || $(event.target).parents('.popover[role="tooltip"]').length /* this one is a bit fiddly but also catches child elements of the popup menu. */ )) {
      
      $('[data-toggle="popover"]').popover('hide');
    }
  });


});
&#13;
&#13;
&#13;

这里的小提琴示例:http://jsfiddle.net/ketwaroo/x6k1h7j4/

答案 5 :(得分:1)

$('[data-toggle=tooltip],[rel=tooltip]').tooltip({ 
        container: 'body' }).click(function () {
        $('.tooltip').not(this).hide();
    });

答案 6 :(得分:1)

关于kiprainey’s answer,存在一个问题,一旦隐藏了工具提示,就需要单击两次以再次显示。我通过使用tooltip('hide')而不是hide()解决了这个问题:

$(element).on('show.bs.tooltip', function() {
    // Only one tooltip should ever be open at a time
    $('.tooltip').not(this).tooltip('hide');
});

答案 7 :(得分:0)

感谢Jochen为“Iphone”点击工具提示以关闭解决方案,正是我所寻找的。

至于原始请求(当你被要求实施点击工具提示而不是翻转工具提示时,防止多个工具提示功能显然是需要的),这是我的看法:

, show: function () {之后添加:

  // HACK BEGIN
  // Quick fix. Only one tooltip should be visible at all time.
  // prototype level property are accessible to all instances so we use one to track last opened tooltip (ie. current this).
  if ( (Tooltip.prototype.currentlyShownTooltip != null) || (Tooltip.prototype.currentlyShownTooltip != undefined) ) {
    // Close previously opened tooltip.
    if (Tooltip.prototype.currentlyShownTooltip != this) { // Conflict with toggle func. Re-show.
        Tooltip.prototype.currentlyShownTooltip.hide();
        Tooltip.prototype.currentlyShownTooltip = null
    }
  }
  // Keep track of the currently opened tooltip.
  Tooltip.prototype.currentlyShownTooltip = this
  // HACK END

答案 8 :(得分:0)

我会给你一个很好的解决方案,外加奖金

        //save the tooltip in variable (change the selector to suit your tooltip)
        var $tooltips = $('a[data-toggle="tooltip"]');
        
        //initialise the tooltip with 'click' trigger  
        $tooltips.tooltip({
            animated: 'fade',
            placement: 'top',
            trigger: 'click',
            delay: { "show": 100, "hide": 100 }
        });
        
        //Here is the juicy bit: when a tooltip is opened it 
        //it creates an 'aria-describedby' with the id of the tooltip
        //opened we can leverage this to turn off all others but current

        $tooltips.on('click', function () {
            var toolTipId = $(this).attr('aria-describedby');
            $('.tooltip').not('#'+ toolTipId).tooltip('hide');
        });

        //But wait theres more! if you call now we chuck in a free close on X seconds event!
        $tooltips.on('shown.bs.tooltip', function (e) {
            //Auto hide after 7 seconds
            setTimeout(function () {
                $(e.target).tooltip('hide');
            }, 7000);
        });

        //call now! XD