Подтвердить что ты не робот

Bootstrap 3 Popover: отображение при наведении и на клик, ака. Привязать Popover

Создание popover с триггером зависания отлично работает.

Создание всплывающего окна с помощью click работает нормально.

Теперь, как я могу заставить popover появляться, когда запускающее изображение зависнет, но если пользователь нажимает на изображение, отмените наведение и инициируйте переключение на клик? Другими словами, зависание показывает popover и щелкает "штырьками" popover.

HTML довольно стандартный:

<li>User<span class="glyphicon glyphicon-user" rel="popover" data-trigger="click" data-container="body" data-placement="auto left" data-content="Body Text" data-original-title="Title Text"></span></li>

И инициализация popover, еще более скучная:

$(function () { 
    $("[rel=popover]").popover();   
});

Из того, что я видел до сих пор, кажется вероятным, что решение является хорошим сложным набором вызовов popover('show'), popover('hide') и popover('toggle'), но мой javascript/jQuery-foo не соответствует задаче.

EDIT:

Используя код, предоставленный @hajpoj в качестве базы, я добавил функцию, чтобы прослушать событие hidden.bs.popover, чтобы попытаться повторно активировать события mouseenter и mouseleave после запуска события click, но хотя это и делает "hover" снова, он убивает клик...

var $btn2 = $('#btn2');

    var enterShow = function() {
        $btn2.popover('show');
    };

    var exitHide = function() {
        $btn2.popover('hide');
    }

    $btn2.popover({trigger: 'manual'})
            .on('mouseenter', enterShow)
            .on('mouseleave', exitHide)
            .one('click', function() {
                   $btn2.off('mouseenter', enterShow)
                        .off('mouseleave', exitHide)
                        .on('click', function() {
                            $btn2.popover('toggle');
                        });
            });

$('#btn2').on('hidden.bs.popover', function () {
  $btn2.on('mouseenter', enterShow)
       .on('mouseleave', exitHide)
});
4b9b3361

Ответ 1

Edit:

Получает обновленные решения, основанные на ваших комментариях. Он не остается в состоянии 'click', но возвращается в состояние зависания.

jsfiddle: http://jsfiddle.net/hajpoj/JJQS9/15/

HTML:

<a href="#" id="btn2" class="btn btn-lg btn-danger" data-toggle="popover" title="" data-content="And here some amazing content. It very engaging. right?" data-original-title="A Title">Click to toggle popover</a>

JS:

var $btn2 = $('#btn2');
$btn2.data('state', 'hover');

var enterShow = function () {
    if ($btn2.data('state') === 'hover') {
        $btn2.popover('show');
    }
};
var exitHide = function () {
    if ($btn2.data('state') === 'hover') {
        $btn2.popover('hide');
    }
};

var clickToggle = function () {
    if ($btn2.data('state') === 'hover') {
        $btn2.data('state', 'pinned');
    } else {
        $btn2.data('state', 'hover')
        $btn.popover('hover');
    }
};

$btn2.popover({trigger: 'manual'})
    .on('mouseenter', enterShow)
    .on('mouseleave', exitHide)
    .on('click', clickToggle);

Старый:

Я считаю, что это то, что вы ищете:

http://jsfiddle.net/JJQS9/1/

HTML:

<a href="#" id="btn2" class="btn btn-lg btn-danger" data-toggle="popover" title="" data-content="And here some amazing content. It very engaging. right?" data-original-title="A Title">Click to toggle popover</a>

JS:

var $btn2 = $('#btn2');

var enterShow = function() {
    $btn2.popover('show');
};

var exitHide = function() {
    $btn2.popover('hide');
}

$btn2.popover({trigger: 'manual'})
        .on('mouseenter', enterShow)
        .on('mouseleave', exitHide)
        .one('click', function() {
            $btn2.off('mouseenter', enterShow)
                    .off('mouseleave', exitHide)
                    .on('click', function() {
                        $btn2.popover('toggle');
                    });
        });

В основном вы вручную открываете/закрываете popover в событиях mouseenter и mouseleave, но как только кто-то нажимает на popover в первый раз, вы удаляете эти обработчики событий и добавляете новый обработчик на click событие, которое переключает popover.

Edit: альтернативный js-код. более простой код, но при его использовании есть небольшой визуальный снимок: http://jsfiddle.net/hajpoj/r3Ckt/1/

var $btn2 = $('#btn2');

$btn2.popover({trigger: 'hover'})
    .one('click', function() {
        $btn2.popover('destroy')
            .popover({ trigger: 'click'})
            .popover('show');
    });

Ответ 2

Здесь представлен гибридный popover/tooltip, который может дать вам функциональность, которую вы ищете для обоих параметров, переключается на клик и наведение):

Гибридная скрипка/всплывающая подсказка

HTML:

<button id="tip1" type="button" class="btn btn-default" data-toggle="tooltip" data-placement="bottom" title='this text!'>What hidden?</button>

JS:

var $tip1 = $('#tip1');

$tip1.tooltip({trigger: 'hover'})
  .on('click', function() {
    $tip1.tooltip('toggle');
});

Ответ 3

Очень просто, добавьте hover в data-trigger следующим образом:

<span rel="popover" data-trigger="hover click" data-container="body" data-placement="auto" data-content="Body Text"></span>

Ответ 4

Здесь, как я выполнил функцию hover/pin, используя Bootstrap и JQuery:

$(function () {
    var clicked = false;

    var onLeave = function() {
        if (!clicked) { $(this).popover('hide'); }
    };

    var onEnter = function () {
        if (!clicked) { $(this).popover('show'); }
    };

    var clickToggle = function() {
        if (clicked) { $(this).popover('hide'); }
        clicked = !clicked;
    }
    $('.popover-div-class').popover({ trigger: "manual"})
        .on('mouseenter', onEnter)
        .on('mouseleave', onLeave)
        .on('click', clickToggle);
});

Я не уверен, что он будет работать во всех сценариях, но он работал на моем. Большой крик для @hajpoj и @Trevor для вдохновения.

JSFiddle: https://jsfiddle.net/5m2ob3yf/ (пока не работает, но вы можете получить суть).