2012-02-24 18 views
3

email-signup-linkをクリックするとemail-signupを開きます。それからボックス自体を除いて、ページ上のどこかをクリックして閉じることができます。jQueryどこでもクリックしてDIVを閉じるページ

私はこのサイトを見回しましたが、この問題の解決策はたくさんありますが、私が試したすべてのものを表示してからすぐに私のdivを隠します。私は間違ったことをする必要があります。私のJavascriptの

<a href="#" id="email-signup-link">Sign Up</a> 
<div id="email-signup"> 
    <div id="inner"> 
     <h2>E-mail Notifications</h2> 
     <input class="" type="text" name="description" placeholder="Enter your e-mail address" id="description" /> 
     <a href="#">Sign Up</a> 
    </div> 
</div> 

これは、次のとおりです:

この

はHTMLです

$('#email-signup').click(function(){ 
    e.stopPropagation(); 
}); 
$("#email-signup-link").click(function() { 
    e.preventDefault(); 
    $('#email-signup').show(); 
}); 
$(document).click(function() { 
    $('#email-signup').hide(); 
}); 

答えて

10

2つのこと。実際にはeは定義されていないので、使用することはできません。そして、あなたは同様にあなたの他のクリックハンドラでstopPropagationが必要になります。

$('#email-signup').click(function(e){ 
    e.stopPropagation(); 
}); 
$("#email-signup-link").click(function(e) { 
    e.preventDefault(); 
    e.stopPropagation(); 
    $('#email-signup').show(); 
}); 
$(document).click(function() { 
    $('#email-signup').hide(); 
});​ 

http://jsfiddle.net/Nczpb/

+0

'' 'e.stopPropagation();' ''は、時には不要なイベントを引き起こすことがあります。もし ''#email-signup'''をクリックして '' 'e.stopPropagation();' 'をクリックするとあなたのフォームは送信されません。 –

+0

@codenamejames '#email-signup'をクリックしても' stopPropagation'はありませんので、問題ありません。 'stopPropagation'は、イベントがDOMのバブリングを停止するだけです。送信ボタンが何らかの形で '#email-signup'の親でない限り、あなたの例は決して問題にならないでしょう。 –

+0

モンタージュあなたは正しいですか?フィードバックに感謝します:-) –

0
$(":not(#email-signup)").click(function() { 
    $("#email-signup").hide(); 
}); 

あなたはポップアップ背後のオーバーレイのいくつかの種類を持つと結合したほうが良いと思いますが、上記のイベントをクリックするだけです。

別のstackoverflowの記事で参照されるように
+0

このようにすれば$( ':not(#email-signup)')してください。 –

+0

なぜですか? .not()メソッドは複雑なセレクタや変数を:not()セレクタフィルタにプッシュするよりも読みやすい選択肢を提供します。ほとんどの場合、より良い選択です。 –

+0

また、-1は、ページに多数のタグがある場合に、何千ものイベントリスナーを追加する可能性があります。 –

0
var mouse_is_inside = false; 

$(document).ready(function() 
{ 
    $('.form_content').hover(function(){ 
     mouse_is_inside=true; 
    }, function(){ 
     mouse_is_inside=false; 
    }); 

    $("body").mouseup(function(){ 
     if(! mouse_is_inside) $('.form_wrapper').hide(); 
    }); 
}); 

...

6
$(document).click (function (e) { 
    if (e.target != $('#email-signup')[0]) { 
     $('#email-signup').hide(); 
    } 
}); 
+0

+1非常に良いと簡単なソリューション –

+0

誰かがこのソリューションで '[0]'が果たす役割を説明できますか? @アレクサンダー?Thanks – Robbo

+0

jQueryセレクタ( '$()')は常に配列を返します。 [0]はこの配列の最初の要素を選択するだけです。 IDが正しく使用されている場合、これが唯一の結果になるはずです。 –

0

私は、多くの場合、これが行わdiv要素でフォームの背後にあるページを重ねている見てきた道(グレーアウト通常)。それで、あなたは使用することができます:

$("#greydiv")..click(function() { 
    $("#email-signup").hide(); 
    $("#greydiv").hide(); 
}); 

...または何かsimliar。

関連する問題