Как отклонить всплывающее окно Twitter Bootstrap, нажав снаружи?

290

Можем ли мы заставить всплывающие окна отклоняться так же, как модалы, т.е. закрыть их, когда пользователь щелкает где-то за их пределами?

К сожалению, я не могу просто использовать настоящий модальный вместо popover, потому что модальный означает position: fixed, и это больше не будет popover. :(

Анте Врли
источник
3
Аналогичный вопрос: stackoverflow.com/q/8947749/1478467
Шерброу
Попробуйте это stackoverflow.com/a/40661543/5823517 . Не включает в себя перебирание родителей
июня
data-trigger="hover"и data-trigger="focus"являются встроенной альтернативой для закрытия поповера, если вы не хотите использовать переключатель. На мой взгляд, data-trigger="hover"обеспечивает лучший пользовательский опыт ... нет необходимости писать дополнительный код .js ...
Hooman Bahreini

Ответы:

461

Обновление: чуть более надежное решение: http://jsfiddle.net/mattdlockyer/C5GBU/72/

Для кнопок, содержащих только текст:

$('body').on('click', function (e) {
    //did not click a popover toggle or popover
    if ($(e.target).data('toggle') !== 'popover'
        && $(e.target).parents('.popover.in').length === 0) { 
        $('[data-toggle="popover"]').popover('hide');
    }
});

Для кнопок, содержащих значки (этот код содержит ошибку в Bootstrap 3.3.6, см. Исправление ниже в этом ответе)

$('body').on('click', function (e) {
        //did not click a popover toggle, or icon in popover toggle, or popover
        if ($(e.target).data('toggle') !== 'popover'
            && $(e.target).parents('[data-toggle="popover"]').length === 0
            && $(e.target).parents('.popover.in').length === 0) { 
            $('[data-toggle="popover"]').popover('hide');
        }
    });

Для JS Generated Popovers Использование '[data-original-title]'вместо'[data-toggle="popover"]'

Предостережение . Решение, приведенное выше, позволяет открывать сразу несколько всплывающих окон.

Один поповер за раз, пожалуйста:

Обновление: Bootstrap 3.0.x, см. Код или скрипку http://jsfiddle.net/mattdlockyer/C5GBU/2/

$('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');
        }
    });
});

Это обрабатывает закрытие всплывающих окон, которые уже открыты и не нажаты, или их ссылки не были нажаты.


Обновление: Bootstrap 3.3.6, см. Скрипку

Исправлена ​​ошибка, из-за которой после закрытия требуется 2 клика для повторного открытия.

$(document).on('click', function (e) {
    $('[data-toggle="popover"],[data-original-title]').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').data('bs.popover')||{}).inState||{}).click = false  // fix for BS 3.3.6
        }

    });
});

Обновление: используя условное условие предыдущего улучшения, это решение было достигнуто. Исправьте проблему двойного щелчка и призрачного всплывающего окна:

$(document).on("shown.bs.popover",'[data-toggle="popover"]', function(){
    $(this).attr('someattr','1');
});
$(document).on("hidden.bs.popover",'[data-toggle="popover"]', function(){
    $(this).attr('someattr','0');
});
$(document).on('click', function (e) {
    $('[data-toggle="popover"],[data-original-title]').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) {
            if($(this).attr('someattr')=="1"){
                $(this).popover("toggle");
            }
        }
    });
});
mattdlockyer
источник
2
Я прикрепляю $(document)вместо, $('body')так как иногда bodyне распространяется на всю страницу.
Ясоп
6
После активации всплывающего окна (и последующего действия скрытия) всплывающее окно не полностью скрыто; это просто не видно Проблема заключается в том, что содержимое под невидимым, но присутствующим всплывающим окном нельзя щелкнуть или переместить. Проблема возникает в последней сборке Chrome, последней загрузочной версии 3 .js (также могут быть и другие браузеры, не может быть потрудился проверить, так как этот обходной путь должен быть необходим в любом случае)
ravb79
6
Вместо того '[data-toggle="popover"]', что не работает с сгенерированными JavaScript всплывающими окнами, я использовал '[data-original-title]'в качестве селектора.
Натан
4
Кто-нибудь знает, почему это решение не работает с последней версией загрузчика? Происходит следующее: нажмите кнопку, чтобы отобразить popover, затем щелкните тело, чтобы закрыть popover, затем нажмите кнопку, чтобы показать popover, и popover не отображается. После сбоя один раз, если вы нажмете на него еще раз, он показывает. Это очень странно
JTunney
3
@JTunney Я использую BS 3.3.6 и до сих пор наблюдаю такое поведение, когда требуется два щелчка, чтобы открыть всплывающее окно после того, как оно было отклонено.
sersun
65
$('html').on('mouseup', function(e) {
    if(!$(e.target).closest('.popover').length) {
        $('.popover').each(function(){
            $(this.previousSibling).popover('hide');
        });
    }
});

Это закрывает все всплывающие окна, если вы нажимаете в любом месте, кроме всплывающих окон

ОБНОВЛЕНИЕ для Bootstrap 4.1

$("html").on("mouseup", function (e) {
    var l = $(e.target);
    if (l[0].className.indexOf("popover") == -1) {
        $(".popover").each(function () {
            $(this).popover("hide");
        });
    }
});
user28490
источник
Я добавил класс к кнопке, которая запускает popover (pop-btn), чтобы он не включался ... if (! $ (E.target) .closest ('. Popover'). Length &&! $ (E. target) .closest ('. btn'). hasClass ('pop-btn'))
mozgras
2
с 3 кнопками popover этот код создает проблемы. в некоторых случаях я не могу нажать кнопку, и кнопки мигают.
OpenCode
1
Не удается заставить этот код работать ... проверьте эту скрипку и, пожалуйста, добавьте скрипту в свой ответ. jsfiddle.net/C5GBU/102
mattdlockyer
Отлично для меня. Другие ответы имели побочные эффекты, когда мой «внешний щелчок» открыл новый поповер.
Соотношение сторон
Это прекрасно работает, но должен иметь способ адаптировать его так, чтобы при щелчке по содержимому всплывающего окна он не закрывался. например, если вы нажмете на текст внутри тега <b> внутри всплывающего окна ...
Бен в CA
40

Самая простая, самая отказоустойчивая версия , работает с любой версией начальной загрузки.

Демо-версия: http://jsfiddle.net/guya/24mmM/

Демонстрация 2: Не отклонять при нажатии внутри всплывающего контента http://jsfiddle.net/guya/fjZja/

Демонстрация 3: Несколько поповеров: http://jsfiddle.net/guya/6YCjW/


Простое обращение к этой строке приведет к удалению всех всплывающих окон:

$('[data-original-title]').popover('hide');

Отключить все всплывающие окна при нажатии снаружи с этим кодом:

$('html').on('click', function(e) {
  if (typeof $(e.target).data('original-title') == 'undefined') {
    $('[data-original-title]').popover('hide');
  }
});

Фрагмент выше прикрепляет событие click к телу. Когда пользователь нажимает на поповер, он будет вести себя как обычно. Когда пользователь нажимает на что-то, что не является поповером, оно закрывает все всплывающие окна.

Он также будет работать с всплывающими окнами, инициированными с помощью Javascript, в отличие от некоторых других примеров, которые не будут работать. (см. демо)

Если вы не хотите отклоняться при нажатии внутри содержимого поповера, используйте этот код (см. Ссылку на 2-ую демонстрацию):

$('html').on('click', function(e) {
  if (typeof $(e.target).data('original-title') == 'undefined' && !$(e.target).parents().is('.popover.in')) {
    $('[data-original-title]').popover('hide');
  }
});
Guya
источник
3
Была похожая проблема, и это работало в Bootstrap 3.
wsams
Если вы приблизите всплывающие окна так, чтобы они перекрывались, при скрытии всплывающего окна, щелкая где-то снаружи, одна из ссылок перестает работать. Проверьте: jsfiddle.net/qjcuyksb/1
Сандип Гири
1
Последняя версия не работает при использовании bootstrap-datepicker во всплывающем окне.
dbinott
1
Мне больше всего понравилось это решение, потому что принятый ответ стал чем-то вроде ресурсной болячки с примерно 30 всплывающими окнами
Дэвид Дж
1
Возможно !$(e.target).closest('.popover.in').length, будет более эффективным, чем !$(e.target).parents().is('.popover.in').
Joeytwiddle
19

В bootstrap 2.3.2 вы можете установить триггер на «фокус», и он просто работает:

$('#el').popover({trigger:'focus'});
Periklis
источник
1
+1, но важное примечание: это не закрывает всплывающее окно, если вы снова нажмете на кнопку или привязку, пока принимается ответ.
Кристиан Голлхардт
18

Это в основном не очень сложно, но есть некоторые проверки, чтобы избежать глюков.

Демо (jsfiddle)

var $poped = $('someselector');

// Trigger for the popover
$poped.each(function() {
    var $this = $(this);
    $this.on('hover',function() {
            var popover = $this.data('popover');
            var shown = popover && popover.tip().is(':visible');
            if(shown) return;        // Avoids flashing
            $this.popover('show');
    });
});

// Trigger for the hiding
 $('html').on('click.popover.data-api',function() {
    $poped.popover('hide');
});
Sherbrow
источник
2
это отклоняет
модал,
Возможно ли сделать это с помощью popover()нажатия, а не при наведении курсора?
Заки Азиз
3
Конечно, но вам нужно вызвать stopPropagation()событие, переданное обработчику щелчка (если нет, скрывающий обработчик сразу скрывает всплывающее окно). Демонстрация (jsfiddle)
Шербров
У меня та же функциональность ниже в гораздо меньшем количестве кода. Этот ответ раздутый и немного нелепый для вопроса ... Все, что он хочет, - это закрывать всплывающие окна, когда вы щелкаете снаружи ... Это излишне и ужасно!
mattdlockyer
2
Поправка, я считаю, что у меня ЛУЧШЕ функционала в FAR меньше кода. Предполагается, что вы хотите видеть только одно всплывающее окно за раз. Если вам это нравится, пожалуйста, подпишите мой ответ ниже: jsfiddle.net/P3qRK/1 answer: stackoverflow.com/a/14857326/1060487
mattdlockyer
17

Ни одно из предполагаемых решений с высоким рейтингом не сработало для меня правильно. Каждый из них приводит к ошибке, когда после открытия и закрытия (при нажатии на другие элементы) всплывающее окно в первый раз не открывается снова, пока вы не сделаете два щелчка по инициирующей ссылке вместо одного.

Так что я немного изменил это:

$(document).on('click', function (e) {
    var
        $popover,
        $target = $(e.target);

    //do nothing if there was a click on popover content
    if ($target.hasClass('popover') || $target.closest('.popover').length) {
        return;
    }

    $('[data-toggle="popover"]').each(function () {
        $popover = $(this);

        if (!$popover.is(e.target) &&
            $popover.has(e.target).length === 0 &&
            $('.popover').has(e.target).length === 0)
        {
            $popover.popover('hide');
        } else {
            //fixes issue described above
            $popover.popover('toggle');
        }
    });
})
Антон Сергеев
источник
1
Хорошо, это работает для меня. Кстати, вы забыли); в конце вашего кода после последнего}
Merlin
1
Была такая же проблема, связанная со вторым кликом. Это должен быть отказоустойчивый ответ!
Фелипе Леан
Я также попробовал предыдущие решения выше, но в качестве руководства для тех, кто также ищет решение с 2016 года, это лучшее решение.
Дариру
топ ответ, работает как рекламируется. как отмечалось, другие нет. это должен быть главный ответ
duggi
Работает отлично, за исключением того, что я не использовал data-toggel = "popover". Но вы можете указать любой селектор, который соответствует вашим элементам запуска поповера. Хорошее решение и единственное, которое решило проблему двух щелчков для меня.
shock_gone_wild
11

Я сделал jsfiddle, чтобы показать вам, как это сделать:

http://jsfiddle.net/3yHTH/

Идея состоит в том, чтобы показывать всплывающее окно при нажатии кнопки и скрывать всплывающее окно при нажатии вне кнопки.

HTML

<a id="button" href="#" class="btn btn-danger">Click for popover</a>

JS

$('#button').popover({
    trigger: 'manual',
    position: 'bottom',
    title: 'Example',
    content: 'Popover example for SO'
}).click(function(evt) {
    evt.stopPropagation();
    $(this).popover('show');
});

$('html').click(function() {
    $('#button').popover('hide');
});
Pigueiras
источник
хорошая демонстрация Мне интересно, как вы могли бы вызвать popover для объекта Jquery, popover - это плагин начальной загрузки js, но вы не включили туда файл начальной загрузки js?
bingjie2680
В jsfiddle есть файл js. Посмотрите на левый столбец -> Управление ресурсами.
Pigueiras
Хорошо, я вижу, что есть загрузчик JS. но это не проверено, это все еще работает?
bingjie2680
Да, это работает. Во всяком случае, я искал в Google: jsfiddle bootstrapи он дал мне скелет начальной загрузки css + js в jsfiddle.
Pigueiras
2
Моя единственная проблема с этим заключается в том, что вы скрываете поповер при нажатии на него. Можно просто использовать всплывающую подсказку.
NoBrainer
7

просто добавьте этот атрибут с элементом

data-trigger="focus"
Сирадж К
источник
Первоначально это не работало для меня с Bootstrap 3.3.7, но затем я прочитал документы, и у них есть некоторые рекомендации, которые стоит упомянуть здесь. Из примера всплывающего окна Dismissible в документации "Для правильного кросс-браузерного и межплатформенного поведения вы должны использовать тег <a>, а не тег <button>, а также включить атрибуты role =" button "и tabindex «.
Джефф
3

Это было задано раньше здесь . Тот же самый ответ, который я дал тогда, все еще применяется:

У меня была похожая потребность, и я нашел это отличное небольшое расширение Twitter Bootstrap Popover от Ли Кармайкла, названное BootstrapX - clickover . У него также есть несколько примеров использования здесь . В основном это изменит поповер на интерактивный компонент, который закроется, когда вы щелкнете в другом месте на странице или нажмете кнопку закрытия внутри всплывающего окна. Это также позволит одновременно открывать несколько всплывающих окон и множество других приятных функций.

Миика Л.
источник
3

Уже поздно на вечеринку ... но я решил поделиться этим. Я люблю поповер, но у него так мало встроенной функциональности. Я написал расширение начальной загрузки .bubble (), это все, что я хотел бы, чтобы popover был. Четыре способа уволить. Нажмите снаружи, переключитесь на ссылку, нажмите X и нажмите escape.

Он позиционируется автоматически, поэтому он никогда не уходит со страницы.

https://github.com/Itumac/bootstrap-bubble

Это не бесплатная самореклама ... Я так много раз в своей жизни брал чужой код, что хотел предложить свои собственные усилия. Повернись и посмотри, сработает ли это для тебя.

Itumac
источник
3

Согласно http://getbootstrap.com/javascript/#popovers ,

<button type="button" class="popover-dismiss" data-toggle="popover" title="Dismissible popover" data-content="Popover Content">Dismissible popover</button>

Используйте триггер фокусировки, чтобы отклонить всплывающие окна при следующем щелчке, который делает пользователь.

$('.popover-dismiss').popover({
    trigger: 'focus'
})
EFFE
источник
2
Не работает в браузерах Mac, которые следуют собственному поведению OS X (которое не фокусирует и не размывает кнопки при нажатии). К ним относятся Firefox и Safari. Парни из Bootstrap совершили здесь большую ошибку, так как эти поповеры нельзя даже открыть, не говоря уже об увольнении.
Анте Врли
2
@AnteVrli Возможно, этого еще не было в документации, когда вы писали свой комментарий, но теперь в документах говорится: «Для правильного кросс-браузерного и кроссплатформенного поведения вы должны использовать <a>тег, а не <button>тег, и вы также должны включить role="button"и tabindexатрибуты «. Вы пробовали это с этими спецификациями?
Луи
3
Ну, там есть проблема с этим ответом, который не имеет ничего общего с совместимостью платформы: нажатием кнопки мыши внутри в пироге уволит поповер , потому что элемент , который вызывает поповер потеряет фокус. Забудьте, что пользователи могут копировать и вставлять из всплывающих окон: как только кнопка мыши нажата, всплывающее окно закрывается. Если у вас есть выпадающие элементы (кнопки, ссылки), пользователи не смогут их использовать.
Луи
Так много для «кроссплатформенности», потому что в начальной загрузке 4.0.0-бета и 4.0.0-бета.2 я не могу заставить это работать на Mac в Chrome :(
rmcsharry
3

Изменено принятое решение. Что я испытал, так это то, что после того, как некоторые поповеры были скрыты, их нужно было дважды щелкнуть, чтобы снова появиться. Вот что я сделал для того, чтобы popover («hide») не вызывался на уже скрытых popovers.

$('body').on('click', function (e) {
    $('[data-original-title]').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) {
            var popoverElement = $(this).data('bs.popover').tip();
            var popoverWasVisible = popoverElement.is(':visible');

            if (popoverWasVisible) {
                $(this).popover('hide');
                $(this).click(); // double clicking required to reshow the popover if it was open, so perform one click now
            }
        }
    });
});
Чисом Даниэль Мба
источник
3

Это решение отлично работает:

$("body")   .on('click'     ,'[data-toggle="popover"]', function(e) { 
    e.stopPropagation();
});

$("body")   .on('click'     ,'.popover' , function(e) { 
     e.stopPropagation();
});

$("body")   .on('click'  , function(e) {
        $('[data-toggle="popover"]').popover('hide');
});
Л.Н.
источник
2
jQuery("#menu").click(function(){ return false; });
jQuery(document).one("click", function() { jQuery("#menu").fadeOut(); });
hienbt88
источник
2

Вы также можете использовать всплывающее окно событий, чтобы удалить всплывающее окно из DOM. Это немного грязно, но работает нормально.

$('body').on('click touchstart', '.popover-close', function(e) {
  return $(this).parents('.popover').remove();
});

В своем html добавьте класс .popover-close к содержимому внутри поповера, который должен закрывать поповер.

Хендрик
источник
2

Кажется, метод 'hide' не работает, если вы создаете всплывающее окно с делегированием селектора, вместо этого должен использоваться 'destroy'.

Я сделал это так:

$('body').popover({
    selector: '[data-toggle="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('destroy');
        }
    });
});

JSfiddle здесь

Владимир Димчев
источник
2

Мы обнаружили, что у нас возникла проблема с решением @mattdlockyer (спасибо за решение!). При использовании свойства селектора для конструктора popover, как это ...

$(document.body').popover({selector: '[data-toggle=popover]'});

... предлагаемое решение для BS3 не будет работать. Вместо этого он создает второй экземпляр popover, локальный для него $(this). Вот наше решение, чтобы предотвратить это:

$(document.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) {
            var bsPopover = $(this).data('bs.popover'); // Here's where the magic happens
            if (bsPopover) bsPopover.hide();
        }
    });
});

Как уже упоминалось, $(this).popover('hide');будет создан второй экземпляр из-за делегированного слушателя. Предоставленное решение скрывает только всплывающие окна, которые уже созданы.

Надеюсь, я смогу сэкономить вам время.

ядро
источник
2

Bootstrap изначально поддерживает это :

JS Bin Demo

Специальная разметка, необходимая для отклонения при следующем нажатии

Для правильного кросс-браузер и поведение кросс-платформенной, вы должны использовать <a>тег, не<button> тегов, и вы также должны включать в себя role="button"и tabindexатрибуты.

Таннер Перриен
источник
В начальной загрузке 4.0.0-бета и 4.0.0-бета.2 я не могу заставить это работать на Mac в Chrome :(
rmcsharry
Щелчок в любом месте закрывает этот поповер, спрашивающему требуется «щелкнуть снаружи, когда поповер закрывает его», что отличается.
Филв
2

это решение избавляет от надоедливого 2-го щелчка при показе поповера во второй раз

протестировано с Bootstrap v3.3.7

$('body').on('click', function (e) {
    $('.popover').each(function () {
        var popover = $(this).data('bs.popover');
        if (!popover.$element.is(e.target)) {
            popover.inState.click = false;
            popover.hide();                
        }
    });
});
Nik
источник
2

Я пробовал многие из предыдущих ответов, на самом деле у меня ничего не работает, но это решение сработало:

https://getbootstrap.com/docs/3.3/javascript/#dismiss-on-next-click

Они рекомендуют использовать тег привязки, а не кнопку, и позаботиться о атрибутах role = "button" + data-trigger = "focus" + tabindex = "0".

Пример:

<a tabindex="0" class="btn btn-lg btn-danger" role="button" data-toggle="popover" 
data-trigger="focus" title="Dismissible popover" data-content="amazing content">
Dismissible popover</a>
Ахмед Эль Дамаси
источник
попробуйте эту ссылку тоже: stackoverflow.com/questions/20466903/…
Ахмед Эль Дамаси
1

Я придумал это: мой сценарий включал в себя больше всплывающих окон на той же странице, и скрытие их просто делало их невидимыми, и поэтому щелкать по элементам позади поповера было невозможно. Идея состоит в том, чтобы пометить конкретную ссылку popover как «активную», и тогда вы можете просто «переключить» активный popover. Это полностью закроет popover $ ('. Popover-link'). Popover ({html: true, container: 'body'})

$('.popover-link').popover().on 'shown.bs.popover', ->
  $(this).addClass('toggled')

$('.popover-link').popover().on 'hidden.bs.popover', ->
  $(this).removeClass('toggled')

$("body").on "click", (e) ->
  $openedPopoverLink = $(".popover-link.toggled")
  if $openedPopoverLink.has(e.target).length == 0
    $openedPopoverLink.popover "toggle"
    $openedPopoverLink.removeClass "toggled"
Ади Нистор
источник
1

Я просто удаляю другие активные всплывающие окна до того, как будет показан новый поповер (начальная загрузка 3):

$(".my-popover").popover();

$(".my-popover").on('show.bs.popover',function () {
    $('.popover.in').remove();
});              
andrearonsen
источник
1

протестирован с 3.3.6 и второй клик в порядке

        $('[data-toggle="popover"]').popover()
            .click(function () {
            $(this).popover('toggle');
        });;

        $(document).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');
                }
            });
        });
Sungwook Ji
источник
0

демо: http://jsfiddle.net/nessajtr/yxpM5/1/

var clickOver = clickOver || {};
clickOver.uniqueId = $.now();

clickOver.ClickOver = function (selector, options) {
    var self = this;

    //default values
    var isVisible, clickedAway = false;

    var callbackMethod = options.content;
var uniqueDiv = document.createElement("div");
var divId = uniqueDiv.id = ++clickOver.uniqueId;
uniqueDiv.innerHTML = options.loadingContent();

options.trigger = 'manual';
options.animation = false;
options.content = uniqueDiv;

self.onClose = function () {
    $("#" + divId).html(options.loadingContent());
    $(selector).popover('hide')
    isVisible = clickedAway = false;
};
self.onCallback = function (result) {
    $("#" + divId).html(result);
};

$(selector).popover(options);

//events
$(selector).bind("click", function (e) {
    $(selector).filter(function (f) {
        return $(selector)[f] != e.target;
    }).popover('hide');

    $(selector).popover("show");
    callbackMethod(self.onCallback);

    isVisible = !(clickedAway = false);
});

$(document).bind("click", function (e) {
    if (isVisible && clickedAway && $(e.target).parents(".popover").length == 0) {
        self.onClose();
        isVisible = clickedAway = false;
    } else clickedAway = true;
});

}

это мое решение для этого.

Огужан Топчу
источник
0

Этот подход гарантирует, что вы можете закрыть всплывающее окно, нажав в любом месте на странице. Если вы нажмете на другую кликабельную сущность, она скрывает все другие всплывающие окна. Анимация: ложь требуется, иначе вы получите ошибку jquery .remove в вашей консоли.

$('.clickable').popover({
 trigger: 'manual',
 animation: false
 }).click (evt) ->
  $('.clickable').popover('hide')
  evt.stopPropagation()
  $(this).popover('show')

$('html').on 'click', (evt) ->
  $('.clickable').popover('hide')
Ариджит Лахири
источник
0

Хорошо, это моя первая попытка ответить на что-то о stackoverflow, так что здесь ничего не идет: P

Похоже, что не совсем ясно, что эта функция на самом деле работает из коробки на последней загрузке (ну, если вы готовы пойти на компромисс, где пользователь может щелкнуть. Я не уверен, нужно ли вам нажимать hover 'per se, но на iPad щелчок работает как переключатель.

Конечным результатом является то, что на рабочем столе вы можете зависать или нажимать (большинство пользователей будут зависать). На сенсорном устройстве прикосновение к элементу вызовет его подъем, а прикосновение к нему снова приведет к его снятию. Конечно, это небольшой компромисс с вашим первоначальным требованием, но, по крайней мере, ваш код стал чище :)

$ (". my-popover"). popover ({trigger: 'click hover'});

Иван Португалия
источник
0

Взяв код Мэтта Локьера, я сделал простой сброс, чтобы dom не скрывался элементом hide.

Код Мэтта: http://mattlockyer.com/2013/04/08/close-a-twitter-bootstrap-popover-when-clicking-outside/

Скрипка: http://jsfiddle.net/mrsmith/Wd2qS/

    $('body').on('click', function (e) {
    //hide popover from dom to prevent covering elements
    $('.popover').css('display', 'none');
    //bring popover back if trigger element is clicked
    $('[data-toggle="popover"]').each(function () {
        if ($(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
            $('.popover').css('display', 'block');
        }
    });
    //hide popover with .popover method
    $('[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');
        }
    });
});
user14174
источник
0

Попробуйте, это будет скрыто, нажав снаружи.

$('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');
    }
    });
});
Ракеш Ваднал
источник
0

У меня были проблемы с решением mattdlockyer, потому что я динамически настраивал ссылки для всплывающих окон, используя такой код:

$('body').popover({
        selector : '[rel="popover"]'
});

Поэтому мне пришлось изменить это так. Это исправило много проблем для меня:

$('html').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('destroy');
    }
  });
});

Помните, что destroy избавляет от элемента, поэтому часть селектора важна при инициализации всплывающих окон.

bryanjj
источник