15

我正在使用 Twitter Bootstrap 并在 iPad 和 iPhone 上进行测试时遇到了一些我无法修复的问题。在移动设备(至少是那些设备)上,您需要单击以启用提示或弹出窗口(如预期的那样)。问题是一旦你关闭它就永远无法关闭。如果您再次单击它,我添加了一个侦听器以将其关闭,但我很难相信默认行为不会是单击以将其删除。这是 Bootstrap 弹出框和工具提示中的错误吗?我的代码在下面 - 它似乎有效,但只有当您单击创建提示或弹出框的同一项目时 - 不在页面上的任何位置(无法使其工作)。

触发代码:

$(function () {
    //Remove the title bar (adjust the template)
    $(".Example").popover({ 
        offset: 10,
        animate: false,
        html: true,
        placement: 'top',
        template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><div class="popover-content"><p></p></div></div></div>'
        //<h3 class="popover-title"></h3>
        //Need to have this click check since the tooltip will not close on mobile
        }).click(function(e) {
            jQuery(document).one("click", function() {
                $('.Example').popover('hide')
        });   
    });
});

HTML:

<a href="javascript:void(0);" class="Example" rel="popover" data-content="This is the Data Content" data-original-title="This is the title (hidden in this example)">

提前致谢!

丹尼斯

4

6 回答 6

8

我尝试了数十种发布到 stackoverflow 和网络其他各个角落的解决方案,以下是唯一对我有用的解决方案!

解释

如此处所述,您可以对元素使用 CSS 指令,以使其可触摸设备点击。我不能告诉你为什么会这样或者那里发生了什么,但似乎就是这样。所以,我想让整个文档也可以body在移动设备上点击,这将允许我触摸任何地方来关闭弹出框。

弹出框 JS

$(function () {
  $('[data-toggle="popover"]').popover({ trigger: "hover"}})
});

方向

1. 安装 Modernizr

我正在使用 rails,所以我使用了gem

gem 'modernizr-rails'

2. 使用 css-directive 创建一个touch

将以下内容添加到您的 CSS 中:

.touch {
  cursor: pointer
}

3. 仅在触摸设备上,将touch类添加到body

如果您希望其他元素是可点击的,而不是整个body,请将touch类添加到它们。

if (Modernizr.touch) {
  $( "body" ).addClass( "touch" );
}

而已!现在,您可以在桌面上正常使用弹出框(即使使用悬停触发器),并且在移动设备上可以触摸关闭。

于 2015-11-03T17:38:10.450 回答
4

我的 iPad 也有同样的问题。但在浏览器中它工作正常。我的解决方案是为我可以隐藏工具提示的所有可能元素添加侦听器:

$('*').bind('touchend', function(e){
   if ($(e.target).attr('rel') !== 'tooltip' && ($('div.tooltip.in').length > 0)){
     $('[rel=tooltip]').mouseleave();
     e.stopPropagation();
   } else {
     $(e.target).mouseenter();
   }
});

是的,为所有工具提示发送事件的开销很小,但您无法定义显示哪个元素工具提示。

于 2012-10-03T18:59:41.360 回答
2

主要概念是在移动设备上手动制作弹出框

$(document).ready(function() {
    if ('ontouchstart' in window) {
        $('[data-toggle="popover"]').popover({
            'trigger': 'manual'
        });            
    }
});
于 2015-08-30T09:10:32.167 回答
1

请参阅以下代码片段以使其正常工作:

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

$('body').on('click', function (e) {
  $('[data-toggle="popover"]').each(function () {
    //the 'is' for buttons that trigger popups
    //the 'has' for icons within a button that triggers a popup
    if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
      $(this).popover('hide');
    }
  });
});

这是检测主体点击并关闭页面上所有工具提示的最简单方法。

您可以在此处查看实时示例

于 2014-05-13T04:43:06.140 回答
1

对此jsfiddle的解决方案,在 iOS(iPad 和 iPhone)、Android 和 Windows 上进行测试。

$(document).ready(function(){

    var toolOptions;
    var toolOptions2;
    var isOS = /iPad|iPhone|iPod/.test(navigator.platform);
    var isAndroid = /(android)/i.test(navigator.userAgent);

    ///////////////////////////////////////// if OS
    if (isOS){

        toolOptions = {
            animation: false,
            placement:"bottom",
            container:"body"
        };
        $('.customtooltip').tooltip(toolOptions);

        $('.customtooltip').css( 'cursor', 'pointer' );
         $('body').on("touchstart", function(e){
            $(".customtooltip").each(function () {
                // hide any open tooltips when the anywhere else in the body is clicked
                if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.tooltip').has(e.target).length === 0) {
                    $(this).tooltip('hide');
                }////end if
            });
        });

    ///////////////////////////////////////// if Android
    } else if(isAndroid){
        toolOptions = {
            animation: false,
            placement:"bottom",
            container:"body"
        };
        toolOptions2 = {
            animation: false,
            placement:"left",
            container:"body"
        };
        $('.c_tool1').tooltip(toolOptions);
        $('.c_tool2').tooltip(toolOptions);
        $('.c_tool3').tooltip(toolOptions2);

    ///////////////////////////////////////// if another system
    } else {
        toolOptions = {
            animation: true,
            placement:"bottom",
            container:"body"
        };
        $('.customtooltip').tooltip(toolOptions);

    }//end if system

    document.getElementById("demo").innerHTML = "Sys: "+navigator.platform+" - isOS: "+isOS+" - isAndroid: "+isAndroid;

});
<h6>
    first <a href="#!" title="" class="customtooltip c_tool1" data-original-title="data del toolltip numero 1">tooltip</a> 
    Second <a href="#!" title="" class="customtooltip c_tool2" data-original-title="data del toolltip numero 2">tooltip</a> 
    third <a href="#!" title="" class="customtooltip c_tool3" data-original-title="data del toolltip numero 3">tooltip</a>
</h6>

<p id="demo"></p>
于 2015-10-07T16:45:41.693 回答
1

引导工具提示v3.3.7

实际:悬停时的工具提示不适用于我们项目中的触摸设备

解决方案:订阅tooltip的show事件并调用mouseenter

$body = $('body');

$body.tooltip({selector: '.js-tooltip'});

// fix for touch device.
if (Modernizr.touch) { // to detect you can use https://modernizr.com
  var hideTooltip = function(e) {
    tooltipClicked = !!$(e.target).closest('.tooltip').length;
    if (tooltipClicked) { return; }

    $('.js-tooltip').tooltip('hide');
  }
  var emulateClickOnTooltip = function(e) {
    tooltipsVisible = !!$('.tooltip.in').length;
    if (tooltipsVisible) { return; }

    $(e.target).mouseenter();
  }
  var onTooltipShow = function(e) {
    tooltipClicked = !!$(e.target).closest('.tooltip').length;
    if (tooltipClicked) { return; }

    $body.on('touchend', hideTooltip); 
  }
  var onTooltipHide = function() {
    $body.off('touchend', hideTooltip);
  }

  $body
    .on('touchend', '.js-tooltip', emulateClickOnTooltip)
    .on('show.bs.tooltip', onTooltipShow)
    .on('hide.bs.tooltip', onTooltipHide);
}
于 2016-08-08T16:06:14.110 回答