1. ホーム
  2. twitter-bootstrap

[解決済み】Twitter Bootstrapのポップオーバーを外側のクリックで解除する方法は?

2022-04-16 18:49:08

質問

ポップオーバーをモーダルと同じように、ユーザーがクリックしたときに閉じるようにできますか?

残念ながら、ポップオーバーの代わりに本物のモーダルを使うことはできません。モーダルはposition:fixedを意味するので、ポップオーバーではなくなってしまうからです :(

どうすればいいですか?

更新してください。 もう少ししっかりした解決策を。 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で生成されたポップオーバーの場合 使用方法 '[data-original-title]' の代わりに '[data-toggle="popover"]'

注意事項 上記の解決策では、複数のポップオーバーを一度に開くことができます。

一度に1つのポップオーバーでお願いします。

更新してください。 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");
            }
        }
    });
});