ユーザーがポップオーバーの外の場所をクリックすると、ブートストラップのポップオーバーを非表示にしようとしています。 (私は実際にBootstrapの作成者がこの機能を提供しない理由を確信していません)ポップオーバーの外側をクリックしたときにブートストラップのポップオーバーを非表示にする
私は次のコードon the webを見つけましたが、実際にはわかりません。
// Hide popover on click anywhere on the document except itself
$(document).click(function(e) {
// Check for click on the popup itself
$('.popover').click(function() {
return false; // Do nothing
});
// Clicking on document other than popup then hide the popup
$('.pop').popover('hide');
});
私が混乱する主なものは、ライン$('.popover').click(function() { return false; });
です。この行はclickイベントのイベントハンドラを追加しませんか?それによって、後に続くpopover('hide')
への呼び出しがポップオーバーを隠すのを防ぐことはできますか?
さらに優れた技術を見た人はいますか?
注:この質問のバリエーションはこれまでに質問されていますが、これらの質問に対する回答には、上記のコードよりも複雑なコードが含まれています。だから私の質問は、私は私のコメントで述べたようにうまくいけば、あなたの質問
例HTML
<div class="well>
<a class="btn" data-toggle="popover" data-content="content.">Popover</a>
<a class="btn btn-danger bad">Bad button</a>
</div>
JS
var $popover = $('[data-toggle=popover]').popover();
//first event handler for bad button
$('.bad').click(function() {
alert("clicked");
});
$(document).on("click", function (e) {
var $target = $(e.target),
isPopover = $(e.target).is('[data-toggle=popover]'),
inPopover = $(e.target).closest('.popover').length > 0
//Does nothing, only prints on console and wastes memory. BAD CODE, REMOVE IT
$('.bad').click(function() {
console.log('clicked');
return false;
});
//hide only if clicked on button or inside popover
if (!isPopover && !inPopover) $popover.popover('hide');
});
に答える私はhttp://jsfiddle.net/BcczZ/2/を作っ
これを読む:http:// stackoverflow。com/questions/1357118/event-preventdefault-vs-return-false – Icarus
@Icarus:ありがとうございますが、それは本当に私の質問に答えません。 falseを返すと処理が止まることはわかっていますが、クリックハンドラを追加すると、それに続く行の動作がどのように変わるのでしょうか?ポップオーバーが閉じられた後にクリックが機能しなくなるのはなぜですか? –
そのコードはあなたが記述したものとまったく同じです。誰かが文書のどこかをクリックするたびに(.popoverを含む)、絶対に何もしないイベントリスナーが追加されます。同じイベントのために同じ要素に多くのイベントリスナーが存在する可能性があるので、メモリを浪費します。 – Dogoku