web-dev-qa-db-ja.com

jQuery-Twitter Bootstrap-ボディの任意の要素のフォーカスにあるすべてのポップオーバーを閉じます

any body element(ポップオーバー自体ではない)is focused、が開いているときにpopoverを閉じようとしています。

私もです:

 $(document.body).on('focus focusout focusin', function(e) {
  if( e.target.classList.contains('popover') ){return false;}
  else{
    $('*').popover('hide');
  }
  // code to close the popover
});

これはChromeではうまく機能しますが、FFでは機能しません。FFではポップオーバーを閉じる前にfocusin and focusoutする必要があります。

これがクロムでのみ機能する私の例です: http://jsfiddle.net/CU5U5/4/

どうすればこれを修正できますか?

11
itsme

別の方法:

$(document).on('focus', ':not(.popover)', function(){
    $('.popover').popover('hide');
});

編集:

結局のところ、私の上記の答えは正しくありません。ポップオーバーがインスタンス化された要素で.popover( 'hide')を呼び出す必要があります.... popover自体ではありません。また、リンク上のクリックイベントの伝播を停止して(つまり、クリックハンドラーでfalseを返す)、ドキュメントルートにバブルアップしないようにする必要があります。答えについては、これを参照してください http://jsfiddle.net/aFacG/1/

HTML

<a data-content="a popover" id="mypopover" href="#">click me</a>

JS

$(document).ready(function(){
  $("#mypopover").popover();

  $(document).on('click', function(){
      $("#mypopover").popover('hide');
  });

  $('#mypopover').click(function(){
      return false;
  });
});
25
joeltine

現在受け入れられている回答の問題は、ツールチップ内をクリックしてもポップオーバーが非表示になることです(入力フィールドのように、ポップオーバー内で操作する要素がある場合は不適切です)。

ポップオーバーコンテナで stopPropagation メソッドを使用して、hideイベントがDOMをバブリングしないようにします。

UPDATE(ブートストラップURLが変更されました): http://jsfiddle.net/bNvX7/10/

$(document).ready(function(){

    //Initialize popover on element
    $("#mypopover").popover();

    //Attach click handler to document
    $(document).bind('click', function (e) {
        $("#mypopover").popover('hide');
    });

    //Dont hide when I click anything inside #container
    $('#container').bind('click', function(e) {
        e.stopPropagation();
    });
});
8
Jose Browne

非常に単純化する:

$('.popover').remove();
5
Samuel

これは、ハンドラーを1つだけ必要とし、トグル/リンクに属性data-rel = "popover"が含まれているすべてのポップオーバーで機能する、もう少し一般的なアプローチです。例:

HTML

<a href="#" data-rel="popover">toggle</a>

JS

  $(document).on('click', function(event) {
    var $clicked = $(event.target);

    if ($clicked.closest('[data-rel="popover"]').length) {
      return;
    } else if ($clicked.closest('.popover').length) {
      event.stopPropagation();
    } else {
      $('[data-rel="popover"]').popover('hide');
    }
  });
0
mynameistechno

呼び出し

$('.popover').popover('hide');

現在開いているすべてのポップオーバーを閉じます。

0
Sean Bradley

多分あなたはこれを試すことができます:

        // Part 1: initialize the popver
        var button = template.find(".itemInfo button");
        // add a class name to identify the target later.
        button.addClass("popover-toggle");

        var content = $("<div>test</div>");

        button.popover({
            container:"body",
            content: content,
            html:true,
            placement:"top",
            title:"Popover title",
            trigger:'click'
        });

        // Part 2: add click event listener 
        $(document).on("click", function(event){
            var target = $(event.target);
            $.each( $(".popover-toggle"), function(index, value){
                var _target = $(value);
                // not click on the button and not click on the popover it self
                if( !target.is( _target ) && target.closest(".popover").length == 0 ){
                    _target.popover("hide");
                }
            });
        });

ベストプラクティスではありませんが、ChromeとFFの両方で正常に機能します。

0
Kimi Chiu