2013-02-07 3 views
15

Следующий код Bootstrap дает мне «липкое» popover (чтобы пользователи могли взаимодействовать с содержимым внутри popover). Проблема в том, что при открытии popover другие popovers должны быть закрыты (скрыты). Любая идея, как я могу это реализовать?Twitter Bootstrap: скрыть другие popovers, когда один открыт

$("[rel=popover]").popover({placement:'bottom', trigger:'manual'}).hover(function(){ 
    $(this).popover('show'); 
    e.preventDefault(); 
}); 

ответ

15

Я был с пьесу о с этим и есть несколько других проблем, касающихся запуска вручную показать/скрыть, чтобы получить это, чтобы играть хорошо. Наведение на самом деле mousein и mouseout, и если вы не добавите дополнительные проверки, вы столкнетесь с проблемами, которые я только что сделал!

и я попытаюсь объяснить, что я сделал.

$(function() { 

    var overPopup = false; 

    $('[rel=popover]').popover({ 
     trigger: 'manual', 
     placement: 'bottom' 

    // replacing hover with mouseover and mouseout 
    }).mouseover(function (e) { 
     // when hovering over an element which has a popover, hide 
     // them all except the current one being hovered upon 
     $('[rel=popover]').not('#' + $(this).attr('id')).popover('hide'); 
     var $popover = $(this); 
     $popover.popover('show'); 

     // set a flag when you move from button to popover 
     // dirty but only way I could think of to prevent 
     // closing the popover when you are navigate across 
     // the white space between the two 
     $popover.data('popover').tip().mouseenter(function() { 
      overPopup = true; 
     }).mouseleave(function() { 
      overPopup = false; 
      $popover.popover('hide'); 
     }); 

    }).mouseout(function (e) { 
     // on mouse out of button, close the related popover 
     // in 200 milliseconds if you're not hovering over the popover 
     var $popover = $(this); 
     setTimeout(function() { 
      if (!overPopup) { 
       $popover.popover('hide'); 
      } 
     }, 200); 
    }); 
}); 

Это работало отлично для меня следующий HTML:

<a href="#" id="example1" class="btn large primary" rel="popover" data-content="Example 1!!!" data-original-title="Example 1 title">Button 1</a> 
<a href="#" id="example2" class="btn large primary" rel="popover" data-content="Example 2!!!" data-original-title="Example 2 title">Button 2</a> 
<a href="#" id="example3" class="btn large primary" rel="popover" data-content="Example 3!!!" data-original-title="Example 3 title">Button 3</a> 

Надежда, что сортирует вас :)

+0

Спасибо, это отлично работает. Можно ли настроить это так, чтобы popover ушел, когда вы нажимаете мышь в другом месте документа? Прямо сейчас в вашей версии, popover уходит, если вы наведите указатель мыши на другой элемент, но если вы уйдете куда-нибудь еще на странице, popover останется открытым. – farjam

+0

Немного смущает ... Значит, вы хотите, чтобы он был липким, пока вы не наведете и не выйдете из всплывающего окна? –

+0

Я хочу, чтобы он был липким все время, когда вы взаимодействуете внутри popover. Однако, если пользователь переходит к нижнему колонтитулу, например (не к другому элементу, включенному в popover), popover все еще остается открытым/активным. Это также происходит в вашей собственной демонстрационной версии, попробуйте mousing над последним элементом и продолжайте движение мыши вправо. Вы можете видеть, что поппер никогда не исчезает. – farjam

1

Я использовал функцию для моего содержания, так что я (в CoffeeScript) :

provideContentForPopover = (element) -> 
    $('.some-selector').not(element).popover 'hide' 
    "some content to be returned" 

$('.some-selector').popover 
    content: -> provideContentForPopover @ 
0
$('.allThePopovers').click(function() { 
    if ($(this).hasClass('popoverIsOpen')) { 
     $(this).removeClass('popoverIsOpen'); 
    } else { 
     $('.popoverIsOpen').popover('hide'); 
     $('.allThePopovers').removeClass('popoverIsOpen'); 
     $(this).addClass('popoverIsOpen'); 
}); 

Просто замените нажмите с помощью мыши или мыши, чтобы удовлетворить ваши потребности.

+0

Может ли downvoter объяснить мне, что не так с этим решением? На этом сайте оценивается конструктивная критика. – friggle

0

Это прекрасно работает, если вы хотите иметь только один поповер открыл сразу, открывается и закрывается нажатием (курсор-позиция не имеет значения):

$('[data-toggle="popover"]').popover({ html: true }).bind("click", function(){ 

    if(!$(this).parent().children("a").first().is(":hover")) 
    $('[data-toggle="popover"]').popover("hide"); 
    else 
    $('[data-toggle="popover"]').not($(this).parent().children("a").first()).popover("hide"); 

return false; 
}); 

Важно, чтобы каждый поповер имеет индивидуальный родительский , как

<ul> <li> <popover> </li> <li> <popover> </li> </ul> 

HTML:

<li> 
    <a id="quickmenu-i-305" data-toggle="popover" data-placement="bottom" data-title="Title" data-content='<h2>Plesk Login</h2>' href="Plesk Login">Ihr Kundenbereich</a> 
</li> 
0

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

<script> 
$(function() { 
    $('[rel=popover]').popover({ 
    }).click(function (e) { 
     $('[rel=popover]').not('#friend_' + $(this).attr('id')).popover('hide'); 
    }); 
}); 
</script> 
22

Там в very simple solution здесь (не мое решение, но прекрасно работает):

$('.link-popover').click(function(){ 
    $('.link-popover').not(this).popover('hide'); //all but this 
}); 
+0

Невозможно получить эту работу без появления ошибок. Для других, рассматривающих простое решение, подобное этому, я добавил следующий код в «Show Popover event» в моем решении, которое просто закрывает все остальные popovers $ ('. Popover'). Not (this) .hide(); –

+0

Вы прибивали его :), вы можете кэшировать ссылку-popover, 'var $ link = $ ('. Link-popover')', а затем использовать кэшированную переменную '$ link.click ...'. – topless

+2

демо ссылка не работает. Что такое '.link-popover'? - это триггерная ссылка или контейнер для погрузки? – chovy

4

решение Simpiet закрыть все Popovers. Это может быть добавлено к любому событию, когда появится всплывающая такие как щелчок/парение и т.д. Просто, прежде чем показать поповер пасту в следующем коде:

$('.popover').not(this).hide(); //Hides all other popovers 

Это удалит весь Popovers на странице, кроме текущей

+0

как преобразовать его в coffe – andi

+0

Я никогда не использовал CoffeeJS, но я использовал онлайн-конвертер http://js2coffee.org/, который выводит это как перевод? $ ('Поповер') нет (это) .hide(). // Скрывает все остальные popovers –

+0

Прекрасно работает с этим [link] (http://stackoverflow.com/questions/1403615/use-jquery-to-hide-a-div-when-the-user-clicks-outside -of-it). – cabaji99

0

более простой способ, чтобы сделать работу:

$('[rel=popover]').popover({ 
    trigger: 'manual', 
    placement: 'bottom' 
}).click(function(e) { 
    $('[rel=popover]').not('#' + $(this).attr('id')).popover('hide'); 
    var $popover = $(this); 
    $popover.popover('toggle'); 
}); 

просто убедитесь, что ваш поповер имеет уникальный идентификатор;] ваш поповер будет вести себя, как это делает по умолчанию, только один поповер сразу.

7

Использование Bootstrap 3's event callbacks вы можете сделать:

$(document).on('show.bs.popover', function() { 
    $('.popover').not(this).popover('hide'); 
}); 

и в CoffeeScript

$(document).on 'show.bs.popover', -> 
    $('.popover').not(this).popover('hide') 
+1

Вводит ошибку двойного щелчка. Вы должны нажать два раза, чтобы открыть другие popovers. – JPeG

11

В соответствии с начальной загрузки документации: Use the focus trigger to dismiss popovers on the next click that the user makes.

<a href="#" tabindex="0" class="btn btn-lg btn-danger" role="button" 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> 
+1

Самое простое и эффективное решение не получает голосов вообще? Один от меня! – Klaaz

+0

он применит только к Bootstrap 3. –

+0

Также фокус не работает на мобильном телефоне по какой-то причине –

0

я обнаружил, что есть некоторые проблемы с динамическим popovers, поэтому здесь 2 soluti Дополнения для статической и динамической Popovers:

первого решения заключается в использовании опции поповера triger:'focus' , но этот вариант не будет работать на некоторых устройствах Android

и вторые один:

$('body').popover({ 
    html: true, 
    //this is for static and dynamic popovers 
    selector: '[data-toggle="popover"]', 
    trigger: 'click', 
    content: function() { 
     //i am using predefined content for popovers. replace with your code or remove at all 
     return $($(this).data('templateselector') + ' .content').html(); 
    }, 
    title: function() { 
     return $($(this).data('templateselector') + ' .title').html(); 
    }, 
    container: 'body' 
}).on('show.bs.popover', function (e) { 
    // i've found that showed popovers has aria-describedby 
    // and $('[data-toggle="popover"]).not(this) not working for dynamic popovers so i came with this: 
    $('[data-toggle="popover"][aria-describedby]').popover('hide'); 
    var trigger = $(e.target); 
    // this is for adding custom class for popover container 
    // just remove it if you dont need 
    trigger.data('bs.popover').tip().addClass($(trigger).data('class')); 
}); 
0

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

три четыре

$(document).ready(function(){  
    $('.btnPopover').mouseover(function(){  
    $(this).popover({ 
     html: true, 
     trigger: 'manual' 
    }).popover('show'); 
     $('.btnPopover').not(this).popover('hide'); 
    }); 
}); 

Убедитесь, что вы добавить bootstrap.js и bootstrap.css к вам странице. Надеюсь, это поможет.

Cheers !! Suraj Kumar

+0

one
two
three
four HTML для приведенных выше коды – user3815534

0

Для совместимости вы должны использовать якорный тэг <a>.

Мои Fiddle:https://jsfiddle.net/oneflame/pnb8Ltj3/

Bootstrap Link - http://getbootstrap.com/javascript/#dismiss-on-next-click

<div id="FragmentText1"> 
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, est laborum. 
</div> 

$(document).ready(function(){    
    $('a.LexicalEntry').popover({ 
    html : true,  
    content: function() { 
     return getLexicalDefinition($(this).text()); 
    } , 
    trigger: 'focus', 
    placement: 'auto', 
    html: true, 
    container: 'body' 
    }); 
}); 

// *** Injects HTML into raw text. 
// *** Splits the content string using a whitespace regular expression. 
$('#FragmentText1').each(function() { 

    // var words = $.trim($(this).text()).split(/\s+/g); 

    var $this = $(this); 
    $this.html(
     $this.text().trim().replace(/\b(\w+)\b/g, 
      "<a tabindex='0' class='LexicalEntry'' role='button' title='Definition: $1'>$1</a>" 
     )); 

}); 
3
$('li').popover({ 
    title: 'My title', 
    content: 'My content' 
}) 
.on('show.bs.popover', function() { 
    if (window._bsPopover) { 
     $(window._bsPopover).popover('hide') 
    } 
    window._bsPopover= this; 
}) 
.on('hide.bs.popover', function() { 
    window._bsPopover= null; // see Peter Jacoby's comment 
}); 
+0

Чтобы избежать проблем, когда поповер не будет снова открыт после закрытия вы можете добавить это, чтобы сбросить параметр: .on ('hide.bs.popover', function() {window.activePopover = null;}) –

1

Я использовал функцию для моего содержания, и это будет работать должным образом.

$(function() {      
    $('[data-toggle="popover"]').click(function(){ 
     $(this).popover('toggle'); 
     $('[data-toggle="popover"]').not(this).popover('hide'); //all but this 
    }); 
}) 
Смежные вопросы