提问者:小点点

如何通过点击外部来解除Twitter引导弹出?


我们能不能让popover像情态动词一样被解雇。当用户单击它们之外的某个地方时关闭它们?

不幸的是,我不能只使用真实的模态而不是popover,因为模态意味着位置:固定的,那将不再是popover。:(


共1个答案

匿名用户

更新:稍微更健壮的解决方案:http://jsfidle.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中有一个bug,请参阅以下答案中的修补程序)

$('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生成的弹出窗口,使用'[data-original-title]'代替'[data-toggle=“popover”]'

警告:上面的解决方案允许一次打开多个弹出窗口。

请一次送一张:

更新:Bootstrap 3.0.x,请参阅code或fiddle http://jsfidle.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,参见fiddle

修正关闭后需要点击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
        }

    });
});

更新:利用前面改进的条件,实现了这个解决方案。修复双击和ghost弹出的问题:

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