В настоящее время я использую всплывающие окна с Twitter Bootstrap, инициированные так:
$('.popup-marker').popover({
html: true,
trigger: 'manual'
}).click(function(e) {
$(this).popover('toggle');
e.preventDefault();
});
Как вы можете видеть, они запускаются вручную, и нажатие на .popup-marker (который является div с фоновым изображением) переключает всплывающее окно. Это прекрасно работает, но я хотел бы также иметь возможность закрыть поповер щелчком в любом месте на странице (но не на самом поповере!).
Я пробовал несколько разных вещей, в том числе следующие, но без результатов, чтобы показать это:
$('body').click(function(e) {
$('.popup-marker').popover('hide');
});
Как закрыть поповер щелчком в любом месте на странице, но не нажатием на сам поповер?
javascript
jquery
twitter-bootstrap
Трэвис Норткатт
источник
источник
Ответы:
Предполагая, что только один поповер может быть виден в любое время, вы можете использовать набор флагов, чтобы пометить, когда есть поповер, и только потом скрыть их.
Если вы установите прослушиватель событий в теле документа, он будет срабатывать при нажатии на элемент, помеченный «popup-marker». Так что вам придется вызывать
stopPropagation()
объект события. И применить тот же трюк при нажатии на сам поповер.Ниже приведен рабочий код JavaScript, который делает это. Использует jQuery> = 1.7
http://jsfiddle.net/AFffL/539/
Единственное предостережение в том, что вы не сможете открывать 2 поповера одновременно. Но я думаю, что это будет сбивать пользователя с толку :-)
источник
Это еще проще:
источник
html
потому чтоe.stopPropagation();
вместо этого я использовал что-то вроде того,$('.popup-marker').on('show', function(event) { $('.popup-marker').filter(function(index, element) { return element != event.target; }).popover('hide'); });
что тоже отлично справилось (не знаю, есть ли разница в производительности)$(this).popover('toggle');
деталью. Затем, если у вас есть несколько объектов «всплывающих маркеров», щелчок по каждому из них закроет остальные.У меня была похожая потребность, и я нашел это отличное небольшое расширение Twitter Bootstrap Popover от Ли Кармайкла, названное BootstrapX - clickover . У него также есть несколько примеров использования здесь . В основном это изменит поповер на интерактивный компонент, который закроется, когда вы щелкнете в другом месте на странице или нажмете кнопку закрытия внутри всплывающего окна. Это также позволит одновременно открывать несколько всплывающих окон и множество других приятных функций.
Плагин можно найти здесь .
Пример использования
JavaScript:
источник
Принятое решение вызвало у меня некоторые проблемы (щелчок по элементу «.popup-marker» открытого всплывающего окна заставил всплывающие окна не работать впоследствии). Я придумал другое решение, которое идеально подходит для меня, и оно довольно простое (я использую Bootstrap 2.3.1):
ОБНОВЛЕНИЕ: Этот код работает и с Bootstrap 3!
источник
if (!$(e.target).is('.popup-marker') && !$(e.target).parents('.popover').length > 0)
этот способ, чтобы всплывающее окно не закрывалось, даже если в нем было html-содержимоеif (!$(e.target).is('.popup-marker') && $(e.target).closest('.popover').length === 0)
прочитайте "Уволить при следующем нажатии" здесь http://getbootstrap.com/javascript/#popovers
Вы можете использовать триггер фокусировки, чтобы отклонить всплывающие окна при следующем щелчке, но вы должны использовать
<a>
тег, а не<button>
тег, и вы также должны включитьtabindex
атрибут ...Пример:
источник
tooltip
, даже если это не указано явно в фактическом документе.Все существующие ответы довольно слабые, так как они основаны на захвате всех событий документа, затем на поиске активных всплывающих окон или изменении вызова
.popover()
.Гораздо лучший подход - слушать
show.bs.popover
события в теле документа, а затем реагировать соответствующим образом. Ниже приведен код, который будет закрывать всплывающие окна при щелчке или escнажатии документа, только привязывающие прослушиватели событий при отображении всплывающих окон:источник
$(event.target).data("bs.popover").inState.click = false;
в функцию onPopoverHide, чтобы вам не нужно было дважды щелкать, чтобы снова открыться после закрытия.https://github.com/lecar-red/bootstrapx-clickover
Это расширение твиттер-загрузчика и решит проблему очень просто.
источник
По какой-то причине ни одно из других решений здесь не сработало для меня. Тем не менее, после многих проблем, я наконец-то пришел к этому методу, который работает идеально (по крайней мере, для меня).
В моем случае я добавлял поповер к таблице и абсолютно позиционировал его выше / ниже того, на
td
котором был нажат. Выбор таблицы был обработан с помощью jQuery-UI Selectable, поэтому я не уверен, что это мешало. Однако всякий раз, когда я нажимал внутри всплывающего окна, мой обработчик щелчков, который предназначался,$('.popover')
никогда не работал, и обработка событий всегда делегировалась$(html)
обработчику щелчков. Я довольно новичок в JS, так что, может быть, я что-то упустил?В любом случае, я надеюсь, что это кому-то поможет!
источник
Я даю всем своим якорям поп-класса класс
activate_popover
. Я активирую их все одновременно$('body').popover({selector: '.activate-popover', html : true, container: 'body'})
чтобы получить работающую функцию щелчка мышью (в сценарии кофе):
Который прекрасно работает с начальной загрузкой 2.3.1
источник
.prev()
в первомif
пункте. Я использую Bootstrap 3.2.0.2, может есть разница? Кроме того, вы можете просто пропустить все второеif
предложение, если хотите иметь возможность открывать несколько всплывающих окон одновременно. Просто щелкните в любом месте, которое не является элементом, активирующим popover (класс «activ-popover» в этом примере), чтобы закрыть все открытые всплывающие окна. Прекрасно работает!Несмотря на то, что здесь есть много решений, я хотел бы предложить и мое, я не знаю, есть ли какое-то решение, которое решает все это, но я попробовал 3 из них, и у них были проблемы, такие как нажатие на поповере он сам скрывает, другие, что если бы я нажал на другую поповерную кнопку, оба / несколько всплывающих окон все равно появлялись бы (как в выбранном решении), как бы то ни было, этот исправил все
источник
Я бы установил фокус на только что созданное всплывающее окно и убрал его на размытие. Таким образом, нет необходимости проверять, какой элемент DOM был нажат, а также можно щелкнуть всплывающее окно и выбрать его: оно не потеряет фокус и не исчезнет.
Код:
источник
Вот решение, которое работало очень хорошо для меня, если оно может помочь:
источник
Вот мое решение, для чего оно стоит:
источник
У меня были некоторые проблемы, чтобы заставить его работать на начальной загрузке 2.3.2. Но я решил это так:
источник
немного подправил решение @David Wolever:
источник
Этот вопрос также задавался здесь, и мой ответ предоставляет не только способ понять методы обхода JQuery DOM, но и 2 варианта обработки закрытия всплывающих окон, нажав снаружи.
Открывайте одновременно несколько всплывающих окон или по одному поповеру за раз.
Плюс эти небольшие фрагменты кода могут обрабатывать закрытие кнопок, содержащих значки!
https://stackoverflow.com/a/14857326/1060487
источник
Этот работает как шарм, и я использую его.
Он откроет всплывающее окно, когда вы щелкнете, и если вы нажмете еще раз, он закроется, также, если вы щелкнете за пределами всплывающего окна, всплывающее окно будет закрыто.
Это также работает с более чем 1 поповер.
источник
Другое решение, это покрыло проблему, которую я имел с щелчком потомков поповера:
источник
Я делаю это, как показано ниже
Надеюсь это поможет!
источник
Если вы пытаетесь использовать Twitter-загрузчик с pjax, это работает для меня:
источник
@RayOnAir, у меня та же проблема с предыдущими решениями. Я тоже близок к решению @RayOnAir. Одна вещь, которая улучшается, это закрыть уже открытый поповер при нажатии на другой маркер поповера. Итак, мой код:
источник
Я обнаружил, что это модифицированное решение вышеупомянутого предложения pbaron, потому что его решение активировало popover ('hide') для всех элементов с классом 'popup-marker'. Однако, когда вы используете popover () для html-контента вместо data-content, как я делаю ниже, любые щелчки внутри этого html-всплывающего окна фактически активируют popover ('hide'), который сразу закрывает окно. Приведенный ниже метод выполняет итерацию по каждому элементу .popup-marker и сначала обнаруживает, связан ли родительский элемент с идентификатором .popup-marker, по которому был выполнен щелчок, и, если это так, не скрывает его. Все остальные элементы скрыты ...
источник
Я придумал это:
Мой сценарий включал в себя больше всплывающих окон на одной странице, и их скрытие просто делало их невидимыми, и поэтому щелкать по элементам позади поповера было невозможно. Идея состоит в том, чтобы пометить конкретную ссылку popover как «активную», и тогда вы можете просто «переключить» активный popover. Это полностью закроет поповер.
источник
Я пытался сделать простое решение для простой проблемы. Вышеупомянутые сообщения хороши, но так сложны для простого вопроса. Итак, я сделал простую вещь. Просто добавил кнопку закрытия. Это идеально подходит для меня.
источник
Мне нравится это, просто, но эффективно ..
источник
Добавьте
btn-popover
класс к вашей кнопке / ссылке на поповер, которая открывает поповер. Этот код закроет всплывающие окна при нажатии за его пределами.источник
Даже простое решение, просто перебрать все Popovers и шкурой , если не
this
.источник
Чтобы быть понятным, просто вызвать поповер
источник
Это должно работать в Bootstrap 4:
Объяснение:
источник
Попробуй
data-trigger="focus"
вместо"click"
.Это решило проблему для меня.
источник