2012-03-19 1 views
2

イメージビューアを作っています。画像をクリックすると、内部の画像で「オーバーレイ」Divがフェードインされます。しかし、以下のコードでは、画像をクリックするとdivがフェードインしますが、再クリックすることなくすぐにフェードアウトします。私のコードで何が間違っていますか?jQueryでは、体のどこかをクリックしてオーバーレイされたdivをフェードアウトするにはどうすればよいですか?

内部にの最初の機能はありますが動作しません。オーバーレイがフェードインした後でのみ、この「ボディクリック」が発生するようにするにはどうすればよいですか?

ありがとうございます。

$('.pic').click(function(){ 
     $('#overlay').html("<img class='enlarged_pic' src='" + (this).src + "'>").fadeIn(); 
     }); 

$('body').click(function(){ 
     $('#overlay').fadeOut(); 
     });  

答えて

3

最初のハンドラにe.stopPropagation()を追加する必要があります。何が起こるかは、クリックイベントがあなたの.picからボディーにバブリングして、両方のハンドラーが必要なときに両方のハンドラーをトリガーすることです。 .stopPropagation()は、イベントがDOMの上位にバブリングするのをブロックします。

$('.pic').click(function(e){ // don't forget that 'e' 
    e.stopPropagation(); 
    $('#overlay').html("<img class='enlarged_pic' src='" + (this).src + "'>").fadeIn(); 
}); 

$('body').click(function(e){ 
    $('#overlay').fadeOut(); 
}); 

http://jsfiddle.net/VQkNa/

また、オーバーレイ自体をクリックすると、オーバーレイをフェードしないようにそれを作るために必要がある場合があります。これは、簡単にクリックのターゲットを検出することで行われます

$('body').click(function(e) { 
    if (e.target.id !== "overlay") { 
     $('#overlay').fadeOut(); 
    }; 
});​ 

http://jsfiddle.net/VQkNa/1/

+0

そここんにちは、おかげであなたの応答のために多くのことを。このstopPropagation関数については知らなかった。それは私の問題を非常に簡潔な方法で解決しました。再度、感謝します。よろしく – eric01

+0

ほとんど同じ問題を抱えていましたが、最終的には素晴らしい答えが見つかりました。ありがとうございました ! –

0

あなたの両方のメソッドが呼び出されていると仮定します。

「.pic」をクリックすると、.fadeIn()が呼び出されます。 また、 '.pic'をクリックすると本体にもあるので、.fadeOut()が呼び出されます。

体のセレクタを.picsを含まないように変更しようとしました。

0

はこれを試してみてください:

var isOverlaid = false; 
$('.pic').mousedown(function() { 
    $('#overlay').html("<img class='enlarged_pic' src='" + (this).src + "'>").fadeIn('slow', function() { 
     isOverlaid = true; 
    }); 

}); 
$('body').mousedown(function() { 
    if (isOverlaid) { 
     $('#overlay').fadeOut('slow', function() { 
      isOverlaid = false; 
     }); 
    } 
});​ 

http://jsfiddle.net/XeNc8/

+0

こんにちは、お返事ありがとうございました。それは問題を解決しました。代わりに、ユーザーmblase75はe.stopPropagation()を使用してより短い方法を発見しました。 もう一度、ありがとうございます – eric01

関連する問題