2012-11-18 15 views
28

私はTwitterのブートストラップポップオーバーが表示されているかどうかを確認する方法は?

<div id="anElement" data-original-title="my title" data-trigger="manual" data-content="my content" rel="popover"></div> 

のように、付属の潜在的なポップオーバーを持つ要素$('#anElement')を持っている私はちょうどポップオーバーが見えるかどうかを確認する方法を知りたいのです:これはjQueryを使って達成することができますか?

+3

マークアップをさらに進めてください。 –

+2

@bram - 通常の状況では、私はあなたに全面的に同意するでしょう。しかし、この場合、マークアップは標準の(twitter)ブートストラップマークアップです。 – Lix

+1

@Lixブートストラップに慣れていない人にとっては、マークアップのようなアイデアを持っていると便利でしょう –

答えて

43

この機能は、使用しているフレームワークに組み込まれていない場合(それはもはやですtwitterブートストラップ、ちょうどbootstrap)、この機能を作成するために生成/変更されたHTMLを調べなければなりません。

popupver documentationをご覧ください。あなたが実際にそれを見るのに使うことができるボタンがあります。これは、シーンの背後にあるHTML要素を調べるのに最適な場所です。

クローム開発ツールやfirebug(firefox)を開けて、どうなっているのか見てみましょう。

<div class="popover fade right in" style="... /> 

あなたがしなければならないだろうすべては、その要素の存在のためのチェックです - 単にボタンの後に挿入されている<div>があるように見えます。あなたのマークアップが書かれている方法に応じて、あなたはこのようなものを使用することができます -

if ($("#popoverTrigger").next('div.popover:visible').length){ 
    // popover is visible 
} 

#popoverTriggerは、ポップオーバーが最初の場所で表示されるようにすることをトリガー要素であり、我々は上記気づいたように、ブートストラップは、単に後のポップオーバーのdiv要素を追加します素子。

+0

これはIE8以下では機能しません。 – hofnarwillie

+0

@hof - おそらくブートストラップはIE8を別の方法で扱います... – Lix

+0

ええ、多分。正しくデバッグできないようです。 IE8モードでIE9デバッガを使用していますが、ポップオーバーが表示されている間にDOMに加えられた変更は表示されません。 – hofnarwillie

4

これは、指定したdivが表示されているかどうかを確認します。

if ($('#div:visible').length > 0) 

または

if ($('#div').is(':visible')) 
25

あなたはそれを回避する方法を見つける必要があるので、ブートストラップのポップオーバーのプラグインで明示的に実装方法はありません。プラグインが表示されているかどうかをtrueまたはfalseで返すハックがあります。

var isVisible = $('#anElement').data('bs.popover').tip().hasClass('in'); 
console.log(isVisible); // true or false 

それは、実際にPopoverオブジェクトであるポップオーバープラグインによって保存されたデータにアクセスするチップエレメントをフェッチする責任があり、その後、返された要素は、クラスinを有しているかどうかを確認するオブジェクトのtip()メソッドを呼び出しその要素に添付されているポップオーバーが可視であることを示します。


あなたがtip()メソッドを呼び出すことができますことを確認するために添付ポップオーバーがある場合にも、チェックするべきではない:

if ($('#anElement').data('bs.popover') instanceof Popover) { 
    // do your popover visibility check here 
} 
+17

BOOTSTRAP 3注:BS3では、ポップオーバーの代わりにbs.popoverに変更しました。例: '$( '#anElement')。data( 'bs.popover')' – Kyle

+0

このソリューションをありがとうございますが、これはまだハックです。 hideがHTML DOMをきれいに掃除しないので、私はこの必要に迫ります。 –

3

現在のバージョンのBootstrapでは、要素にaria-describedbyが設定されているかどうかを確認できます。属性の値は実際のポップオーバーのidです。

あなたが目に見えるポップオーバーの内容を変更したいのであれば、たとえば、あなたが行うことができます:

var popoverId = $('#myElement').attr('aria-describedby'); 
$('#myElement').next(popoverid, '.popover-content').html('my new content'); 
-1

をブートストラップ4、先端(とポップオーバーを使用する)はもはや機能していないようです。以下に示すよう

if ($('#element').data('bs.popover')._activeTrigger.click == true){ 
...do something 
} 
+0

アンダースコアのプロパティは内部実装の詳細です。それらはそのように扱われ、いつでも変更される可能性があります。つまり、小さなコードスニペット(将来のある時点では、変更ログやAPIの非推奨警告など)を無作為に破ることができます。 –

1

はおそらく、最も信頼性の高いオプションは、示さ/隠しイベントのリスニングすることになります。これは、ポップオーバーは、それをクリックし、アクティブになってきた基本的には場合は、有効になっているかどうかを確認するための一つの方法です。これにより、エラーが発生しやすいDOMを深く掘り下げる必要がなくなります。

var isMyPopoverVisible = false;//assuming popovers are hidden by default 

$("#myPopoverElement").on('shown.bs.popover',function(){ 
isMyPopoverVisible = true; 
}); 

$("#myPopoverElement").on('hidden.bs.popover',function(){ 
isMyPopoverVisible = false; 
}); 

これらのイベントは、ユーザーの操作なしでプログラムによってポップオーバーを表示/非表示/非表示にしてもトリガーされるようです。

P. S. BS3で試験した。

関連する問題