Twitter Bootstrap Popover/подсказка с мобильным телефоном?
Я работаю с Twitter Bootstrap и сталкивался с чем-то, что я не мог исправить при тестировании на iPad и iPhone. На мобильном устройстве (по крайней мере, на тех устройствах) вам нужно щелкнуть, чтобы задействовать подсказку или попкорн (как и ожидалось). Проблема в том, что вы никогда не сможете закрыть его, как только вы это сделаете. Я добавил слушателя, чтобы закрыть его, если вы снова нажмете его, но мне трудно поверить, что поведение по умолчанию не было бы нажатием, чтобы удалить его. Это ошибка в Bootstrap popover и всплывающей подсказке? Мой код ниже - он работает, но ТОЛЬКО, если вы нажмете тот же элемент, который создал подсказку или popover - нигде на странице (не мог заставить это работать).
Код для запуска:
$(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)">
Спасибо заранее!
Dennis
Ответы
Ответ 1
Я пробовал десятки решений, размещенных в stackoverflow и других различных уголках сети, а следующий - только, который работал у меня!
Объяснение
Как указано здесь, вы можете использовать CSS-директиву для того, чтобы сделать его сенсорным-кликабельным. Я не могу сказать вам, почему это работает или что происходит там, но, похоже, так оно и есть. Итак, я хочу сделать весь документ aka body
доступным для мобильных устройств, что позволит мне касаться куда угодно, чтобы отклонить popover.
Popover JS
$(function () {
$('[data-toggle="popover"]').popover({ trigger: "hover"}})
});
Направления
1. Установите Modernizr
Я использую рельсы, поэтому использовал gem.
gem 'modernizr-rails'
2. Создайте класс touch
с директивой css
Добавьте в свой CSS следующее:
.touch {
cursor: pointer
}
3. Только для сенсорных устройств добавьте класс touch
в body
Если вы хотите, чтобы другие элементы были доступны для кликабельности, вместо всего body
, добавьте к ним класс touch
.
if (Modernizr.touch) {
$( "body" ).addClass( "touch" );
}
Что это! Теперь вы можете использовать свой popover обычно на рабочем столе (даже с зависанием-триггером), и он будет чувствителен к ошибкам на мобильных устройствах.
Ответ 2
У меня была такая же проблема с моим 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();
}
});
Да, это небольшие накладные расходы для отправки события для всех всплывающих подсказок, но вы не можете определить, какую подсказку будет отображаться.
Ответ 3
Обратитесь к фрагменту кода, чтобы он работал:
$('[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');
}
});
});
Это самый простой способ обнаружения щелчков по телу и закрытия всех всплывающих подсказок на странице.
Вы можете проверить живой пример здесь
Ответ 4
Основная концепция заключается в том, что сделать popover вручную на мобильном устройстве
$(document).ready(function() {
if ('ontouchstart' in window) {
$('[data-toggle="popover"]').popover({
'trigger': 'manual'
});
}
});
Ответ 5
Решение этой 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>
Ответ 6
Bootstap-tooltip v3.3.7
Актуально: всплывающая подсказка при наведении не работает с сенсорными устройствами в нашем проекте
Решение: Подпишитесь на событие showt tooltip и вызовите 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);
}