ページのどこからでも(他の場所から)クリックしてTwitter Bootstrapポップオーバーを閉じるにはどうすればよいですか?


155

私は現在、次のように開始された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');
});

ポップオーバー自体をクリックするのではなく、ページの他の場所をクリックしてポップオーバーを閉じるにはどうすればよいですか?


うーん、私はそれがうまくいくと思います...偶然このオンラインへのリンクがありますか?
thatryan 2012年

回答:


102

いつでも表示できるポップオーバーは1つだけであると想定すると、フラグのセットを使用して、ポップオーバーが表示されていることをマークし、その後のみ非表示にすることができます。

ドキュメントボディにイベントリスナーを設定すると、「popup-marker」でマークされた要素をクリックしたときにトリガーされます。したがって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でポップオーバー自体をクリックすると、ポップオーバーが非表示になります。
Jonathon Hill

1
@RaduCugutそれは素晴らしい解決策です。しかし、バグがあります。zzzzzを1回クリックすると、ポップオーバーが表示されます。白い背景を1回クリックします。ポップアップが消えます。白い背景をもう一度クリックします。そして、zzzzをもう一度クリックすると、機能しません。:-|
Houman 2012

1
@Kaveあなたが正しい、私はこれを修正するためにフィドルと答えを変更しました。jsfiddle.net/AFffL/177
Radu Cugut 2012

3
$(this).popover( 'show')の前に$( '。popup-marker')。popover( 'hide')(それらをすべて非表示にする)を実行して、isVisible変数やclickedAway変数の必要性をなくすのはなぜですか?
Nathan Hangen、2013年

1
この解決策にはいくつかの問題がありました(開いたポップオーバーの「.popup-marker」要素をクリックすると、その後ポップオーバーが機能しなくなりました)。私のために機能し、より簡単に見える(Bootstrap 2.3.1を使用している)さらに別の解決策(以下に掲載)を思いつきました。
RayOnAir 2013年

76

これはさらに簡単です:

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

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

同意した。そして、少なくとも私にとって、それはそれを行う正しい方法です。最初のオプションは「迅速な修正」のようです。
Denis Lins 2013年

4
これを使いたいが、何らかの理由でうまくいかなかった。代わりにhtml、クリックイベントは到達しませんでした。e.stopPropagation();代わりに$('.popup-marker').on('show', function(event) { $('.popup-marker').filter(function(index, element) { return element != event.target; }).popover('hide'); });、うまく機能するようなものを使用しました(ただし、パフォーマンスの違いがあるかどうかはわかりません)
Cornelis

1
これがIMOの最良の回答です。
Loolooii 2013年

1
@pbaronと@Cornelisの回答をまとめたものが最適です。私が追加したことは(ちょうど前に、2番目の「クリック」機能内部コルネリスコードで$(this).popover('toggle');一部次に、あなたが複数の「ポップアップマーカー」オブジェクトを持っている場合は、それぞれのいずれかをクリックすると、他の人を閉じます。。
alekwisnia

2
これに伴う1つの問題は、ポップオーバーがまだ存在し、隠れていることです。したがって、たとえば、ポップオーバーにリンクがある場合は、カーソルを以前の場所に置いて、それらのリンク上でカーソルを変更できます。
Glacials 2013年

48

私も同様のニーズを持っていて、BootstrapX-clickoverと呼ばれる、リーカーマイケルによるTwitter Bootstrap Popoverのこの小さな拡張機能を見つけました。また、ここにはいくつかの使用例があります。基本的に、それはポップオーバーをインタラクティブなコンポーネントに変更し、ページの他の場所をクリックしたり、ポップオーバー内の閉じるボタンをクリックしたりすると閉じます。これにより、一度に複数のポップオーバーを開くことができ、他の多くの便利な機能も利用できます。

プラグインはここにあります

使用例

<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
これは本当に素晴らしいです。超簡単。
Doug

優れたプラグイン!リンクをありがとう。
Matt Wilson、

1
ちょうどそれを試してみて、それは素晴らしい働きをします。既存のポップオーバーのrelを「ポップオーバー」から「クリックオーバー」に変更するのと同じくらい簡単でした。
Dmase05

Bootstrap v2.3.1で実行しても問題ありません。
Kevin Dewalt 2013

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コンテンツがある
ykayが復活モニカ言う

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
質問は、クリックがポップオーバー上にある場合、それを却下したくないと述べました。これにより、任意の場所でクリックすることでそれを閉じます。
Fred

1
data-trigger = "focus"を追加すると、この投稿を読んでtabindex属性を追加するまで、ポップオーバーが起動しなくなりました。今ではうまくいきます!
PixelGraph

2
詳細についてtooltipは、実際のドキュメントで明確に言及されていなくても、これはでも機能します。
AlexB

7

すべての既存の回答は、すべてのドキュメントイベントをキャプチャしてからアクティブなポップオーバーを見つけるか、への呼び出しを変更することに依存しているため、かなり弱いもの.popover()です。

はるかに優れたアプローチはshow.bs.popover、ドキュメントの本体でイベントをリッスンし、それに応じて反応することです。以下は、ドキュメントがクリックまたは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 14

この回答はパフォーマンスの問題も追加し、ポップオーバー内でより複雑なHTMLを処理できるようにします。
Ricardo

素晴らしいソリューション。非常に簡単に反応メソッドにドロップすることができました。1つの提案は$(event.target).data("bs.popover").inState.click = false;、onPopoverHide関数に追加して、閉じた後に再度開くために2回クリックする必要がないようにします。
sco_tt 2018年

2つのポップアップでこれをいじることができるかどうか興味があります。私のアプリケーションでコードを実装したとき、ポップアップをクリックしてポップアップを表示することができ、「body」をクリックしても最後に表示されたものだけが削除されました。
テリー


2

何らかの理由で、ここでの他の解決策はどれも私にとってうまくいきませんでした。しかし、多くのトラブルシューティングの後、私はようやく(少なくとも私にとっては)完全に機能するこの方法にたどり着きました。

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

私の場合、テーブルにポップオーバーを追加し、tdクリックされたテーブルの上/下に絶対に配置しました。テーブルの選択はjQuery-UI Selectableによって処理されたため、それが干渉しているかどうかはわかりません。ただし、ポップオーバー内をクリックしたときはいつでも、対象とするクリックハンドラー$('.popover')は機能せず、イベント処理は常に$(html)クリックハンドラーに委任されました。私はJSにかなり慣れていないので、おそらく何かが足りないのでしょうか?

とにかくこれが誰かを助けることを願っています!


ところで、問題かどうかはわかりませんが、この方法をBootstrap 2に使用しました。Bootstrap3でも機能すると想定していますが、確認していません。
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同時に複数のポップアップを開くことができるようにする場合は、2番目の句全体を省略できます。popover-activating-element(この例ではクラス 'activate-popover')以外の場所をクリックするだけで、開いているすべてのポップオーバーを閉じます。よく働く!
Andrew Swihart 2014年

2

ここにはたくさんの解決策がありますが、私も提案したいと思います、それをすべて解決する解決策がそこにあるかどうかわかりませんが、そのうちの3つを試しましたが、クリックなどの問題がありましたポップオーバーでは、それ自体がそれを非表示にします。別のポップオーバーボタンをクリックした場合、両方または複数のポップオーバーが引き続き表示されます(選択したソリューションのように)。ただし、これですべてが修正されました

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つのオプションを提供します。

一度に複数のポップオーバーを開くか、一度に1つのポップオーバーを開きます。

さらに、これらの小さなコードスニペットは、アイコンを含むボタンのクローズを処理できます。

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


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 2014年

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

あなたがpjaxでtwitterブートストラップポップオーバーを使用しようとしているなら、これは私にとってうまくいきました:

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ソリューションに近づきます。改善された1つの点は、他のポップオーバーマーカーをクリックしたときに、既に開いているポップオーバーを閉じることです。だから私のコードは:

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の提案の修正されたソリューションであることがわかりました。彼のソリューションは、クラス 'popup-marker'を持つすべての要素のpopover( 'hide')をアクティブ化したためです。ただし、データコンテンツではなくHTMLコンテンツにpopover()を使用している場合、以下のように、そのHTMLポップアップ内をクリックすると、実際にpopover( 'hide')がアクティブになり、ウィンドウがすぐに閉じます。以下のこのメソッドは、各.popup-marker要素を反復処理し、親がクリックされた.popup-markerのIDに関連付けられているかどうかを最初に検出し、関連付けられている場合は非表示にしません。他のすべてのdivは非表示です...

        $(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ポップオーバーを開くポップオーバーボタン/リンクにクラスを追加します。このコードは、その外側をクリックするとポップオーバーを閉じます。

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

説明:

  • 最初のセクションはドキュメントに従ってポップオーバーを開始します: ます https //getbootstrap.com/docs/4.0/components/popovers/
  • 2番目のセクションの最初の「if」は、クリックされた要素が#my-popover-triggerの子孫であるかどうかを確認します。これがtrueの場合は、ポップオーバーを切り替えます(トリガーのクリックを処理します)。
  • 2番目のセクションの2番目の「if」は、クリックされた要素が、initテンプレートで定義されたポップオーバーコンテンツクラスの子孫であるかどうかをチェックします。そうでない場合、これはクリックがポップオーバーのコンテンツ内でなく、ポップオーバーを非表示にできることを意味します。

コードについて詳しく説明していただけませんか?何をしているのか説明を追加しますか?
死のワルツ

@DeathWaltz私は答えに説明を追加しました。
Bart Blast

-1

data-trigger="focus"代わりに試してください"click"

これで問題は解決しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.