Як я можу закрити поштовий завантажувач Twitter Bootstrap клацанням з будь-якого місця (ще) на сторінці?


154

Зараз я використовую Popovers із Twitter Bootstrap, ініційованим так:

$('.popup-marker').popover({
        html: true,
        trigger: 'manual'
    }).click(function(e) {
        $(this).popover('toggle');
        e.preventDefault();
    });

Як бачите, вони спрацьовують вручну, і натискання на .popup-маркер (який є дівом з фоновим зображенням) перемикає поповер. Це чудово працює, але я хотів би також мати можливість закрити попову одним клацанням у будь-якому іншому місці сторінки (але не на самому попурі!).

Я спробував кілька різних речей, включаючи наступне, але не маючи результатів для цього:

$('body').click(function(e) {
    $('.popup-marker').popover('hide');
});

Як я можу закрити переїзд одним клацанням у будь-якому іншому місці сторінки, а не натисканням самогоповерху?


Гм, я думаю, що це спрацює ... Ви маєте посилання на цей Інтернет випадково?
thatryan

Відповіді:


102

Припускаючи, що в будь-який час може бути видно лише один поповер, ви можете використовувати набір прапорів, щоб позначити, коли є попова, і лише потім приховати їх.

Якщо встановити слухач події на тілі документа, він запуститься, коли ви натиснете на елемент, позначений "спливаючим маркером". Тож вам доведеться зателефонувати stopPropagation()на об’єкт події. І застосуйте той самий трюк, натиснувши на саму попову.

Нижче представлений робочий код JavaScript, який робить це. Він використовує jQuery> = 1.7

jQuery(function() {
    var isVisible = false;

    var hideAllPopovers = function() {
       $('.popup-marker').each(function() {
            $(this).popover('hide');
        });  
    };

    $('.popup-marker').popover({
        html: true,
        trigger: 'manual'
    }).on('click', function(e) {
        // if any other popovers are visible, hide them
        if(isVisible) {
            hideAllPopovers();
        }

        $(this).popover('show');

        // handle clicking on the popover itself
        $('.popover').off('click').on('click', function(e) {
            e.stopPropagation(); // prevent event for bubbling up => will not get caught with document.onclick
        });

        isVisible = true;
        e.stopPropagation();
    });


    $(document).on('click', function(e) {
        hideAllPopovers();
        isVisible = false;
    });
});

http://jsfiddle.net/AFffL/539/

Єдине застереження - це те, що ви не зможете одночасно відкрити 2 перехожих. Але я думаю, що це було б бентежно для користувача :-)


1
Клацання на саму попу в тій jsfiddle змушує переховуватися, щоб поповершився - не зовсім те, про що попросив tnorthcutt.
Джонатан Хілл

1
@RaduCugut, це чудове рішення. Але в ньому є помилка. Клацніть один раз на zzzzz і з'явиться popover. Тепер клацніть один раз на білому тлі. Спливаюче вікно зникає. Тепер знову натисніть на білий фон. А тепер знову натисніть на zzzz, і він не працює. : - |
Хоуман

1
@Как ти маєш рацію, я змінив скрипку та відповідь, щоб це виправити. jsfiddle.net/AFffL/177
Раду Кугут

3
Чому б просто не запустити $ ('. Popup-marker'). Popover ('сховати') (щоб приховати їх усіх) перед $ (this) .popover ('show'), що знімає потребу в будь-яких змінних isVisible та click klikAway?
Натан Ханген

1
Це рішення викликало у мене деякі проблеми (натискання на елемент ".popup-marker" відкритого переїзду змусило поповес не працювати далі). Я придумав ще одне рішення (розміщене нижче), яке працювало на мене і здається більш простим (я використовую Bootstrap 2.3.1).
RayOnAir

76

Це ще простіше:

$('html').click(function(e) {
    $('.popup-marker').popover('hide');
});

$('.popup-marker').popover({
    html: true,
    trigger: 'manual'
}).click(function(e) {
    $(this).popover('toggle');
    e.stopPropagation();
});

Домовились. І принаймні для мене це правильний спосіб зробити це. Перший варіант, здається, "швидке виправлення".
Денис Лінс

4
Хотіли використати це, але чомусь не вийшло. У кліки ніколи не досягли htmlз - за e.stopPropagation();Натомість я використовував що - щось подібне , $('.popup-marker').on('show', function(event) { $('.popup-marker').filter(function(index, element) { return element != event.target; }).popover('hide'); });які зробили роботу теж добре (не знаю, чи є різниця в продуктивності , хоча)
Корнеліс

1
Це найкраща відповідь ІМО.
Loolooii

1
Компіляція відповідей @pbaron і @Cornelis працює найкраще. Що я додав, це код Корнеліса всередині другої функції "клацання" (безпосередньо перед $(this).popover('toggle');частиною. Потім, якщо у вас є кілька об'єктів "маркера", натискання кожного закриє інші.
alekwisnia

2
Єдина проблема в цьому полягає в тому, що попова все ще є, просто прихована. Так, наприклад, якщо у вас є посилання в popover, ви можете навести курсор на місце, де він був, і все-таки отримати курсор зміни цих посилань.
Glacials

48

У мене була подібна потреба, і я знайшов це чудове розширення Twitter Bootstrap Popover від Лі Кармайкл, яке називається BootstrapX - кліковер . Він також має деякі приклади використання тут . В основному це перетворить поповер на інтерактивний компонент, який закриється при натисканні в іншому місці сторінки або на кнопку закриття в межах попову. Це також дозволить відкрити декілька потужностей одночасно та купу інших приємних функцій.

Плагін можна знайти тут .

Приклад використання

<button rel="clickover" data-content="Show something here. 
    <button data-dismiss='clickover'
    >Close Clickover</button>"
>Show clickover</button>

javascript:

// load click overs using 'rel' attribute
$('[rel="clickover"]').clickover();

1
Це справді чудово. Супер легко.
Дуг

Відмінний плагін! Дякуємо за посилання
Метт Вілсон

1
Просто дав йому зняти, і це чудово працює. Це було так само просто, як просто змінити існуючий репорт Popover з "popover" на "clickkover".
Dmase05

Запуск на Bootstrap v2.3.1, без проблем.
Кевін Дювальт

37

Прийняте рішення дало мені деякі проблеми (натискання на елемент ".popup-marker" відкритого переїзду змусило поповес не працювати далі). Я придумав це інше рішення, яке чудово працює для мене, і воно досить просте (я використовую Bootstrap 2.3.1):

$('.popup-marker').popover({
    html: true,
    trigger: 'manual'
}).click(function(e) {
    $('.popup-marker').not(this).popover('hide');
    $(this).popover('toggle');
});
$(document).click(function(e) {
    if (!$(e.target).is('.popup-marker, .popover-title, .popover-content')) {
        $('.popup-marker').popover('hide');
    }
});

ОНОВЛЕННЯ: Цей код працює і з Bootstrap 3!


1
Це чудове рішення. Дякую.
Гевін

1
Гарне рішення. Чому б ти не скористався if (!$(e.target).is('.popup-marker') && !$(e.target).parents('.popover').length > 0)таким чином, спливаюче вікно не закриється, навіть якщо у ньому є вміст html
гаразд, зазначає Відновити Моніку

2
Або ще кращеif (!$(e.target).is('.popup-marker') && $(e.target).closest('.popover').length === 0)
fabdouglas

19

читайте "Відхилити при наступному натисканні" тут http://getbootstrap.com/javascript/#popovers

Ви можете використовувати тригер фокусування, щоб відкинути перехоплення при наступному натисканні, але ви повинні використовувати <a>тег, а не <button>тег, і ви також повинні включати tabindexатрибут ...

Приклад:

<a href="#" tabindex="0" class="btn btn-lg btn-danger"
  data-toggle="popover" data-trigger="focus" title="Dismissible popover"
  data-content="And here's some amazing content. It's very engaging. Right?">
  Dismissible popover
</a>

2
У запитанні було зазначено, що він не хоче, щоб його відхиляли, якщо натискання було на поповері. Це відхиляє його будь-яким клацанням де завгодно.
Фред

1
Додавання даних-Trigger = "фокус" зупинило запуск моїх переживань, поки я не прочитав цю публікацію і не додав атрибут tabindex. Тепер це працює!
PixelGraph

2
Для інформації це також працює tooltip, навіть якщо це не чітко зазначено у фактичному документі.
AlexB

7

Усі існуючі відповіді є досить слабкими, оскільки вони покладаються на обробку всіх подій документа, а потім на пошук активних переходів або на зміну виклику .popover().

Набагато кращий підхід - слухати show.bs.popoverподії на тілі документа, а потім реагувати відповідно. Нижче наведено код, який закриє popovers при натисканні на документ або escнатисканні, лише прив'язуючі слухачі подій, коли показані перехоплення:

function closePopoversOnDocumentEvents() {
  var visiblePopovers = [];

  var $body = $("body");

  function hideVisiblePopovers() {
    $.each(visiblePopovers, function() {
      $(this).popover("hide");
    });
  }

  function onBodyClick(event) {
    if (event.isDefaultPrevented())
      return;

    var $target = $(event.target);
    if ($target.data("bs.popover"))
      return;

    if ($target.parents(".popover").length)
      return;

    hideVisiblePopovers();
  }

  function onBodyKeyup(event) {
    if (event.isDefaultPrevented())
      return;

    if (event.keyCode != 27) // esc
      return;

    hideVisiblePopovers();
    event.preventDefault();
  }

  function onPopoverShow(event) {
    if (!visiblePopovers.length) {
      $body.on("click", onBodyClick);
      $body.on("keyup", onBodyKeyup);
    }
    visiblePopovers.push(event.target);
  }

  function onPopoverHide(event) {
    var target = event.target;
    var index = visiblePopovers.indexOf(target);
    if (index > -1) {
      visiblePopovers.splice(index, 1);
    }
    if (visiblePopovers.length == 0) {
      $body.off("click", onBodyClick);
      $body.off("keyup", onBodyKeyup);
    }
  }

  $body.on("show.bs.popover", onPopoverShow);
  $body.on("hide.bs.popover", onPopoverHide);
}

+1 Це найчистіше і найширше рішення. Якщо ви також використовуєте таку основу, як магістральна система, просто скиньте це у свій код ініціалізації, і він подбає про обробку перехожих.
JohnP

Ця відповідь також викликає занепокоєння щодо продуктивності, що дозволяє обробляти складніші HTML в межах попову.
Рікардо

Прекрасне рішення; вдалося досить легко впустити його в метод реагування. Одні пропозиції, додайте $(event.target).data("bs.popover").inState.click = false;до функції onPopoverHide, щоб не потрібно двічі клацнути, щоб повторно відкритись після закриття.
sco_tt

Цікаво, якби ви могли скласти загадку про це з двома спливаючими вікнами. У моїй програмі, коли я реалізував ваш код, я зміг натиснути спливаюче вікно, щоб з'явитись, і кілька разів з’явилося, а потім натисканням кнопки «Тіло» видалено лише останній відображений.
Террі


2

Чомусь жодне з інших рішень тут не працювало на мене. Однак після безлічі усунень неполадок я нарешті дійшов до цього методу, який прекрасно працює (як мінімум для мене).

$('html').click(function(e) {
  if( !$(e.target).parents().hasClass('popover') ) {
    $('#popover_parent').popover('destroy');
  }
});

У моєму випадку я додав перехід до таблиці і абсолютно розміщував його вище / нижче того, на tdщо натискали. Вибір таблиці обробляв jQuery-UI Selectable, тому я не впевнений, що це заважало. Однак кожен раз, коли я натискав всередині Popover, мій обробник кліків, який націлений $('.popover')ніколи не працював, і обробку подій завжди делегували $(html)обробнику кліків. Я досить новачок у JS, тож, можливо, мені просто щось не вистачає?

У будь-якому випадку, я сподіваюся, що це комусь допоможе!


BTW Я не впевнений, чи це має значення, але я використав цей метод для Bootstrap 2. Я припускаю, що він буде працювати для Bootstrap 3, але не підтвердив.
moollaza

2

Я віддаю всі свої сили на якір activate_popover. Я активую їх відразу при завантаженні

$('body').popover({selector: '.activate-popover', html : true, container: 'body'})

щоб отримати функціональну функцію клацання миші (у сценарії кави):

$(document).on('click', (e) ->
  clickedOnActivate = ($(e.target).parents().hasClass("activate-popover") || $(e.target).hasClass("activate-popover"))
  clickedAway = !($(e.target).parents().hasClass("popover") || $(e.target).hasClass("popover"))
if clickedAway && !clickedOnActivate
  $(".popover.in").prev().popover('hide')
if clickedOnActivate 
  $(".popover.in").prev().each () ->
    if !$(this).is($(e.target).closest('.activate-popover'))
      $(this).popover('hide')
)

Що прекрасно працює з завантажувачем 2.3.1


Це працювало для мене, за винятком того, що мені довелося позбутися .prev()в першому ifпункті. Я використовую Bootstrap 3.2.0.2, можливо, є різниця? Крім того, ви можете просто залишити весь другий ifпункт, якщо ви хочете мати можливість відкрити кілька спливаючих вікон одночасно. Просто натисніть будь-де, що не є елементом, що активує popover (клас "activate-popover" у цьому прикладі), щоб закрити всі відкриті переїзди. Чудово працює!
Ендрю Свіхарт

2

Незважаючи на те, що тут є багато рішень, я також хотів би запропонувати моє, але я не знаю, чи є якесь рішення, яке все це вирішує, але я спробував 3 з них, і у них виникли проблеми, такі як натискання на пиріг це сам робить це приховати, інші , що якщо я мав інший кнопки поповеров клацнув і / кілька Popovers все одно з'являються (наприклад , в обраному розчині), як завжди, це один фіксований все це

var curr_popover_btn = null;
// Hide popovers function
function hide_popovers(e)
{
    var container = $(".popover.in");
    if (!container.is(e.target) // if the target of the click isn't the container...
        && container.has(e.target).length === 0) // ... nor a descendant of the container
    {
        if( curr_popover_btn != null )
        {
            $(curr_popover_btn).popover('hide');
            curr_popover_btn = null;
        }
        container.hide();
    }
}
// Hide popovers when out of focus
$('html').click(function(e) {
    hide_popovers(e);
});
$('.popover-marker').popover({
    trigger: 'manual'
}).click(function(e) {
    hide_popovers(e);
    var $popover_btns = $('.popover-marker');
    curr_popover_btn = this;
    var $other_popover_btns = jQuery.grep($($popover_btns), function(popover_btn){
                return ( popover_btn !== curr_popover_btn );
            });
    $($other_popover_btns).popover('hide');
    $(this).popover('toggle');
    e.stopPropagation();
});

2

Я б поставив фокус на щойно створений спливаючий екран і видалив його на розмиття. Таким чином, не потрібно перевіряти, на який елемент DOM було натиснуто, а на спливаючому вікні можна натиснути і вибрати також: він не втратить фокус і не зникне.

Код:

    $('.popup-marker').popover({
       html: true,
       trigger: 'manual'
    }).click(function(e) {
       $(this).popover('toggle');
       // set the focus on the popover itself 
       jQuery(".popover").attr("tabindex",-1).focus();
       e.preventDefault();
    });

    // live event, will delete the popover by clicking any part of the page
    $('body').on('blur','.popover',function(){
       $('.popup-marker').popover('hide');
    });

1

Ось рішення, яке для мене спрацювало чудово, якщо воно може допомогти:

/**
* Add the equals method to the jquery objects
*/
$.fn.equals = function(compareTo) {
  if (!compareTo || this.length !== compareTo.length) {
    return false;
  }
  for (var i = 0; i < this.length; ++i) {
    if (this[i] !== compareTo[i]) {
      return false;
    }
  }
  return true;
};

/**
 * Activate popover message for all concerned fields
 */
var popoverOpened = null;
$(function() { 
    $('span.btn').popover();
    $('span.btn').unbind("click");
    $('span.btn').bind("click", function(e) {
        e.stopPropagation();
        if($(this).equals(popoverOpened)) return;
        if(popoverOpened !== null) {
            popoverOpened.popover("hide");            
        }
        $(this).popover('show');
        popoverOpened = $(this);
        e.preventDefault();
    });

    $(document).click(function(e) {
        if(popoverOpened !== null) {
            popoverOpened.popover("hide");   
            popoverOpened = null;
        }        
    });
});

1

Ось моє рішення, для чого це варто:

// Listen for clicks or touches on the page
$("html").on("click.popover.data-api touchend.popover.data-api", function(e) {

  // Loop through each popover on the page
  $("[data-toggle=popover]").each(function() {

    // Hide this popover if it's visible and if the user clicked outside of it
    if ($(this).next('div.popover:visible').length && $(".popover").has(e.target).length === 0) {
      $(this).popover("hide");
    }

  });
});

1

У мене виникла проблема з тим, щоб він працював на завантажувальній версії 2.3.2. Але я вирізав це так:

$(function () {
  $(document).mouseup(function (e) {
        if(($('.popover').length > 0) && !$(e.target).hasClass('popInfo')) {
            $('.popover').each(function(){
                $(this).prev('.popInfo').popover('hide');
            });
        }
    });

    $('.popInfo').popover({
        trigger: 'click',
        html: true
    });
});

1

Режим @David Wolever трохи налаштовано:

function closePopoversOnDocumentEvents() {
  var visiblePopovers = [];

  var $body = $("body");

  function hideVisiblePopovers() {
    /* this was giving problems and had a bit of overhead
      $.each(visiblePopovers, function() {
        $(this).popover("hide");
      });
    */
    while (visiblePopovers.length !== 0) {
       $(visiblePopovers.pop()).popover("hide");
    }
  }

  function onBodyClick(event) {
    if (event.isDefaultPrevented())
      return;

    var $target = $(event.target);
    if ($target.data("bs.popover"))
      return;

    if ($target.parents(".popover").length)
      return;

    hideVisiblePopovers();
  }

  function onBodyKeyup(event) {
    if (event.isDefaultPrevented())
      return;

    if (event.keyCode != 27) // esc
      return;

    hideVisiblePopovers();
    event.preventDefault();
  }

  function onPopoverShow(event) {
    if (!visiblePopovers.length) {
      $body.on("click", onBodyClick);
      $body.on("keyup", onBodyKeyup);
    }
    visiblePopovers.push(event.target);
  }

  function onPopoverHide(event) {
    var target = event.target;
    var index = visiblePopovers.indexOf(target);
    if (index > -1) {
      visiblePopovers.splice(index, 1);
    }
    if (visiblePopovers.length == 0) {
      $body.off("click", onBodyClick);
      $body.off("keyup", onBodyKeyup);
    }
  }

  $body.on("show.bs.popover", onPopoverShow);
  $body.on("hide.bs.popover", onPopoverHide);
}

1

Це питання також було задано тут, і моя відповідь надає не лише спосіб зрозуміти методи переходу jQuery DOM, але і 2 варіанти обробки закриття переїздів, натиснувши назовні.

Відкрийте одночасно декілька перехожих або один потенціал.

Плюс ці маленькі фрагменти коду можуть працювати з закриттям кнопок, що містять піктограми!

https://stackoverflow.com/a/14857326/1060487


1

Цей працює як шарм, і я його використовую.

Він відкриє Popover, коли ви клацнете, і якщо ви знову натиснете, він закриється, також, якщо ви натиснете за межами Popover, попова буде закрита.

Це також працює з більш ніж 1 переходом.

    function hideAllPopovers(){
    $('[data-toggle="popover"]').each(function() {
        if ($(this).data("showing") == "true"){
            $(this).data("showing", "false");
            $(this).popover('hide');                
        }
    });
}
$('[data-toggle="popover"]').each(function() {
        $(this).popover({
            html: true,
            trigger: 'manual'
        }).click(function(e) {
            if ($(this).data("showing") !=  "true"){
                hideAllPopovers();
                $(this).data("showing", "true");
                $(this).popover('show');
            }else{
                hideAllPopovers();
            }
            e.stopPropagation();
        });
});

$(document).click(function(e) {
    hideAllPopovers();
});

Це єдиний, хто працював на мене. Запуск 3.20. Спасибі.
Telegard

1

Ще одне рішення, воно охоплювало проблему, яку я мав із натисканням нащадків попови:

$(document).mouseup(function (e) {
    // The target is not popover or popover descendants
    if (!$(".popover").is(e.target) && 0 === $(".popover").has(e.target).length) {
        $("[data-toggle=popover]").popover('hide');
    }
});

0

Я роблю це як нижче

$("a[rel=popover]").click(function(event){
    if(event.which == 1)
    {   
        $thisPopOver = $(this);
        $thisPopOver.popover('toggle');
        $thisPopOver.parent("li").click(function(event){
            event.stopPropagation();
            $("html").click(function(){
                $thisPopOver.popover('hide');
            });
        });
    }
});

Сподіваюся, це допомагає!


0

Якщо ви намагаєтесь використовувати twitter bootstrap popover з pjax, це працювало для мене:

App.Utils.Popover = {

  enableAll: function() {
    $('.pk-popover').popover(
      {
        trigger: 'click',
        html : true,
        container: 'body',
        placement: 'right',
      }
    );
  },

  bindDocumentClickEvent: function(documentObj) {
    $(documentObj).click(function(event) {
      if( !$(event.target).hasClass('pk-popover') ) {
        $('.pk-popover').popover('hide');
      }
    });
  }

};

$(document).on('ready pjax:end', function() {
  App.Utils.Popover.enableAll();
  App.Utils.Popover.bindDocumentClickEvent(this);
});

0

@RayOnAir, у мене те саме питання з попередніми рішеннями. Я також наближаюся до рішення @RayOnAir. Одне, що покращилося, це закрити вже відкритий поповер при натисканні на інший поповий маркер. Тож мій код такий:

var clicked_popover_marker = null;
var popover_marker = '#pricing i';

$(popover_marker).popover({
  html: true,
  trigger: 'manual'
}).click(function (e) {
  clicked_popover_marker = this;

  $(popover_marker).not(clicked_popover_marker).popover('hide');
  $(clicked_popover_marker).popover('toggle');
});

$(document).click(function (e) {
  if (e.target != clicked_popover_marker) {
    $(popover_marker).popover('hide');
    clicked_popover_marker = null;
  }
});

0

Я виявив це модифікованим рішенням пропозиції pbaron вище, тому що його рішення активувало popover ('приховати') на всіх елементах класом 'popup-marker'. Однак, коли ви використовуєте popover () для вмісту html замість вмісту даних, як я це роблю нижче, будь-які клацання всередині цього спливаючого вікна html фактично активують popover ('приховати'), що негайно закриває вікно. Цей метод нижче перебирає кожен елемент .popup-маркера та виявляє спочатку, якщо батьківський зв’язок пов’язаний з ідентифікатором .popup-маркера, на який було натиснуто, і якщо так, то не приховує його. Усі інші діви приховані ...

        $(function(){
            $('html').click(function(e) {
                // this is my departure from pbaron's code above
                // $('.popup-marker').popover('hide');
                $('.popup-marker').each(function() {
                    if ($(e.target).parents().children('.popup-marker').attr('id')!=($(this).attr('id'))) {
                        $(this).popover('hide');
                    }
                });
            });

            $('.popup-marker').popover({
                html: true,
                // this is where I'm setting the html for content from a nearby hidden div with id="html-"+clicked_div_id
                content: function() { return $('#html-'+$(this).attr('id')).html(); },
                trigger: 'manual'
            }).click(function(e) {
                $(this).popover('toggle');
                e.stopPropagation();
            });
        });

0

Я придумав це:

Мій сценарій включав більше поїздів на одній сторінці, а їх приховування просто зробило їх непомітними, і тому натискання на елементи, що стоять за переходом, було неможливим. Ідея полягає в тому, щоб позначити конкретне поповер-посилання як "активне", і тоді ви можете просто "переключити" активний поповер. Це дозволить повністю закрити попову.

$('.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"

0

Я намагався зробити просте рішення для простого питання. Наведені вище повідомлення хороші, але такі складні для простого питання. Тому я зробив просту річ. Просто додали кнопку закриття. Це ідеально для мене.

            $(".popover-link").click(function(){
                $(".mypopover").hide();
                $(this).parent().find(".mypopover").show();
        })
        $('.close').click(function(){
    $(this).parents('.mypopover').css('display','none');
});



          <div class="popover-content">
        <i class="fa fa-times close"></i>
    <h3 class="popover-title">Title here</h3>
your other content here
        </div>


   .popover-content {
    position:relative;
    }
    .close {
        position:absolute;
        color:#CCC;
        right:5px;
        top:5px;
        cursor:pointer;
    }

0

Мені це подобається, простий, але ефективний ..

var openPopup;

$('[data-toggle="popover"]').on('click',function(){
    if(openPopup){
        $(openPopup).popover('hide');

    }
    openPopup=this;
});

0

Додайте btn-popoverклас до кнопки / посилання, що відкриває поповер. Цей код закриє Popovers при натисканні поза ним.

$('body').on('click', function(event) {
  if (!$(event.target).closest('.btn-popover, .popover').length) {
    $('.popover').popover('hide');
  }
});

0

Ще простіше рішення, просто перегляньте всі перехоплення та прихойте, якщо ні this.

$(document).on('click', '.popup-marker', function() {
    $(this).popover('toggle')
})

$(document).bind('click touchstart', function(e) {
    var target = $(e.target)[0];
    $('.popup-marker').each(function () {
        // hide any open popovers except for the one we've clicked
        if (!$(this).is(target)) {
            $(this).popover('hide');
        }
    });
});

0
$('.popForm').popover();

$('.conteneurPopForm').on("click",".fermePopover",function(){
    $(".popForm").trigger("click");
});

Щоб було зрозуміло, просто запустіть поповер


0

Це має працювати в Bootstrap 4:

$("#my-popover-trigger").popover({
  template: '<div class="popover my-popover-content" role="tooltip"><div class="arrow"></div><div class="popover-body"></div></div>',
  trigger: "manual"
})

$(document).click(function(e) {
  if ($(e.target).closest($("#my-popover-trigger")).length > 0) {
    $("#my-popover-trigger").popover("toggle")
  } else if (!$(e.target).closest($(".my-popover-content")).length > 0) {
    $("#my-popover-trigger").popover("hide")
  }
})

Пояснення:

  • Перший розділ запускає Popover згідно з документами: https://getbootstrap.com/docs/4.0/components/popovers/
  • Перший "якщо" у другому розділі перевіряє, чи натиснутий елемент є нащадком # my-popover-trigger. Якщо це правда, він перемикає перемикач (він обробляє натискання на тригер).
  • Другий "якщо" у другому розділі перевіряє, чи клацнув елемент, є нащадком класу вмісту переповненого, який був визначений у шаблоні init. Якщо це не так, це означає, що клацання не було всередині вмісту перепони, а поповер можна приховати.

Чи можете ви детальніше розкрити свій код? Додайте пояснення до того, що ви робите?
Вальс смерті

@DeathWaltz Я щойно додав пояснення у відповідь.
Барт Бласт

-1

Спробуйте data-trigger="focus"замість цього "click".

Це вирішило для мене проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.