2012-01-31 9 views
0

私はフォームのサインインを表示するためにスライドトグルを使用しようとしています。ボックスの外側をクリックすると、そのフォームをスライドさせたいと思います。jQuery:slideToggleの可視性が機能していないことを確認していますか?

私はすべて正常に動作していますが、可視性のチェックが機能していないため、フォームコンテナの外をクリックすると機能しません。あなたはなぜそれを見つけることができますか?

var loginForm = jQuery("#login .login-form"); 
jQuery("#login a").click(function(e) { 
    e.preventDefault(); 
    loginForm.slideToggle(); 

}); 

// below check isn't working why? 
if (jQuery(loginForm).is(":visible")) { 
    jQuery("body").click(function() { 
     jQuery(loginForm).slideUp(); 
    }); 
} 
+1

なぜ今日誰も '$'を使わないのですか?人は執筆や何かのように始まった? – gdoron

答えて

0

あなたはクリックハンドラ内のチェックが必要です。

jQuery("body").click(function() { 
    if (loginForm.is(":visible")) { 
     loginForm.slideUp(); 
    } 
}); 

追加のノートを、あなたはすでにjQueryオブジェクトであるオブジェクトに対してjQueryを呼び出す必要はありません。 loginFormをダブルラップする必要はありません。

ログインクリックハンドラーでもevent.stopPropagation()にするといいでしょう。それ以外の場合は、それをクリックすると本体にバブルしてそのハンドラーも起動します。

+0

あなたがなぜ(loginForm.is( ":visible")){alert( 'yes'); }は動作しませんか? –

+0

'if'は' click'ハンドラの外にあります。あなたのコードはページの読み込み時に実行され、フォームが表示されているかどうかを確認し、そうであればハンドラを添付します。初期ロード時にフォームが表示されない場合、ハンドラはまったくアタッチされません。 –

+0

だから、最初にフォームをdisplay:noneの代わりにvisibility:hiddenにすると、私のコードがうまくいくはずです。あなたのソリューションは唯一の方法ですか?私が尋ねる理由は、フォームが表示されているかどうかを最初に確認するのではなく、フォームが表示されなくてもフォームが表示されているかどうかをテストしてから、その関数を適用することです。どうも。 –

0

このコードはどこから実行されますか? clickハンドラをバインドするときにdocumentが準備完了していますか?

また、loginForm変数はすでに、jQueryで再びそれを行うには必要はラップされていない:

// Make sure the document is ready for manipulating the DOM: 
jQuery(function ($) { 
    var loginForm = $('#login .login-form'); 

    $('#login a').click(function (e) { 
     e.preventDefault(); 
     loginForm.slideToggle();  
    }); 

    if (loginForm.is(':visible')) { 
     $(document).click(function() { 
      loginForm.slideUp(); 
     }); 
    } 
}); 
関連する問題