我希望有人可以提供帮助。
当我点击另一个工具提示图标时,我正试图隐藏工具提示。它有效,但当我决定再次点击最后一个工具提示时,它会“闪烁”工具提示。
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>
答案 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();
会绕过任何引导程序show
,shown
,hide
或{{1您可能已附加到触发器元素的事件。经过一番思考后,我提出了以下代码,可以更加透明地处理附加事件。
注意:仅在firefox和chrome上测试过,但理论上应该可以正常工作。
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;
答案 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”点击工具提示以关闭解决方案,正是我所寻找的。 p>
至于原始请求(当你被要求实施点击工具提示而不是翻转工具提示时,防止多个工具提示功能显然是需要的),这是我的看法:
在, 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