2016-07-04 6 views
5

サイトを開いたときにサインインフォームが自動的に表示されるサイト用の小さな機能を開発しています。特定のCookieが設定されていません。 10秒後にフォームが消えます。クッキーが設定されておらず入力が選択されていない場合、10秒後にサインインフォームを非表示にする

入力のいずれかに内容が含まれている場合は、ユーザがフォーム入力またはのいずれかを選択すると、開いたままになっていることも想定されます。 (#user-pestまたは#pass-pest)。

ほとんどの入力は、入力のいずれかが選択されているかコンテンツが含まれていても、10秒後にフォームがページから消えてしまいます。

次はのJavaScript(およびjQueryの)私が使用していたコード(を更新)です。

$(document).ready(function(){ 
    // hide sign in form 

    function hideForm(){ // function for updating elements 
     $("#darknet-login-nav").css("display", "none"); 
     $(".index-outer").css("height", "100px"); 
     $(".index-inner").css("width", "438px"); 
     $(".index-inner").css("top", "-10px"); 
     $("#darknet-mast").css("font-size", "97px"); 
    } 

    function hideFormSet(){ // function used for updating elements and setting cookie 
     hideForm(); 
     document.cookie = "signinNav=set"; 
    } 

    var checkDisplayed = getCookie("signinNav"); // get cookie contents 
    if(checkDisplayed == "set"){ 
     hideForm(); // if cookie is set, hide the form 
    } else { // if it isn't 
     var hideInterval = setInterval(hideFormSet, 10000); // after 10 seconds, call hideFormSet function 
     if($("#user-pest").is(':focus') || $("#pass-pest").is(':focus')){ 
      clearInterval(hideInterval); // if one of the inputs are focused on, stop the interval 
     } else { 
      hideInterval; // if they aren't focused, start the interval 
     } 
    } 
}); 

これは私の単純化したマークアップです。

<div class="darknet-nav-login-form" id="darknet-login-nav"> 
    <form action="" method="post"> 
     <input type="text" name="username" id="user-pest" placeholder="Username" autocomplete="off"><br> 
     <input type="password" name="password" id="pass-pest" placeholder="Password" autocomplete="off"><br> 
    </form> 
</div> 

私はJavaScriptにまだまだ慣れていますので、あらゆるポインタや修正をいただければ幸いです。

編集:私の上記の更新コードを確認してください。

入力のオンにフォーカスがあっても、間隔は停止するのではなく、引き続き継続します。あなたはこのラインで& &を必要

おかげ

+0

保守性を改善する方法、あなたは5つのCSS-方法は、あなたが同じコードを複製する必要がないようにあなたが呼び出す関数の呼び出しに変換する必要があります。 – Esko

+0

@Eskoどうすればいいですか? –

+1

'function myFunction(){$("#darknet-login-nav ")。css(" display "、" none ");$( "。index-outer")。css( "height"、 "100px"); } 'そして次にmyFunction();それを – Esko

答えて

3

私が目標を正しく理解していれば、入力がフォーカスを失ってから10秒後にフォームを非表示にしたいこともあります。 この場合、focusin/focusoutイベントにバインドしてタイムアウトを再開するほうが簡単です。そうでない場合は、インターバルが始まる直前に入力を終了すると、タイムアウトよりずっと前に隠れてしまいます。

var inputs = $('#user-pest, #pass-pest'), 
    hideTimeout, 
    checkFocus = function(){ 
     var hide = !inputs.is(':focus'); 
     if(hide===!!hideTimeout)return; 
     if(hide) 
      hideTimeout = setTimeout(hideFormSet, 10000); 
     else 
      hideTimeout = clearTimeout(hideTimeout); 
     }; 

inputs.focusin(checkFocus).focusout(checkFocus); 
checkFocus(); 

追記、jQueryのis方法チェックJQ配列の要素のいずれかがそう代わりに別個および/または、選択に対応する場合は、あなたが行うことができます:$('#user-pest, #pass-pest').is(':focus')

example Fiddle

Sidenote2では、1つの入力がフォーカスを失ってから次のフォーカスがフォーカスに移るため、(再)バインディングが2回発生します。これは問題ではありませんが、フォームに2つの入力のみが含まれている場合は、イベントのバブリングを使用してフォーム自体のフォーカスを確認してください。inputs.parent().focusin(checkFocus).focusout(checkFocus);

+0

ここに2つの '!'があるはずです: 'hide === !! hideTimeout'? –

+0

Thnakyou!完全に動作します:-) –

+0

うん、 '!!'はhideTimeoutを真実にする意図的なものです。これは、hideTimeoutをブール値に強制します。例えば'!! undefined === false'ですので、' !! 0'は '!! anynumber === true'となりました(と喜んで助けました:)) –

3

あなたが前に持っていた何
if(!$("#user-pest").is(':focus') || !$("#pass-pest").is(':focus')){ 

if(user-pest is not focused OR pass-pest is not focused) 

ユーザーは、このように、これは常にtrueに評価され、皮がtrueに設定されますが、一度に両方を集中することはできませんでした。次を使用します。

if(!$("#user-pest").is(':focus') && !$("#pass-pest").is(':focus')){ 

代わりに、あなたはまた、次の

if($("#user-pest").is(':focus') || $("#pass-pest").is(':focus')){ 
    var hide = false; 
} else { 
    var hide = true; 
} 

Asを使用することができ、私が初めてを逃した別の問題が、またそこにあるあなたのコメントで指摘。

hide変数はページの読み込み時に設定され、瞬時に実行されます。どちらのオブジェクトにもフォーカスする時間はほとんどありません。時間切れのコールバックの中に集中しているかどうかをチェックするコードを移動する必要があります。

実例の完全なコードはthis jsFiddleを参照してください。基本的にタイムアウトは、次のスニペットに示すように、ページの読み込みではなく、実行時に入力がフォーカスされているかどうかを確認する必要があります。

setTimeout(function() { 
    if (!$("#user-pest").is(':focus') && !$("#pass-pest").is(':focus')) { 
    $("#darknet-login-nav").css("display", "none"); 
    $(".index-outer").css("height", "100px"); 
    $(".index-inner").css("width", "438px"); 
    $(".index-inner").css("top", "-10px"); 
    $("#darknet-mast").css("font-size", "97px"); 
    document.cookie = "signinNav=set"; // set the cookie so the form doesn't appear when they come back later 
    } 
}, 2000); 
+0

うーん..これは同じことをしないだろうか?なぜなら、どちらも同時に選択されなければ、常にそれを隠すからです。しかし、私はあなたが意味するものを得る –

+0

ああ、ちょうど編集を見た。私は今理解して:)それが動作するかどうかを確認します。ありがとう –

+0

申し訳ありませんが、選択されていてもまだ隠れています。 –

1

入力は次のようになります。それぞれ空で、彼らは焦点が合っていない。最初の10秒のタイムアウトを超えた動作は指定されていないため、間隔をアクティブにしました。タイムアウトが経過し、ヘッダーを隠す条件が満たされると、非表示の動作が呼び出されます。

「ワンショット」タイマーにしたい場合は、intervalHandler機能のclearIntervalとするだけです。

window.addEventListener('load', onDocLoaded, false); 
 

 
var intervalHandle; 
 

 
function onDocLoaded(evt) 
 
{ 
 
\t intervalHandle = setInterval(intervalHandler, 2000); 
 
} 
 

 
function hideHeader() 
 
{ 
 
\t document.getElementById('darknet-login-nav').classList.add('hidden'); 
 
} 
 

 
// returns true/false 
 
// true if the header should be hidden, false otherwise. 
 
// Things that will prevent the header from being hidden area 
 
// 0) content in the #user-pest input 
 
// 1) content in the #pass-pest input 
 
// 2) focus of either #user-pest or #pass-pest elements 
 
function shouldHideHeader() 
 
{ 
 
\t if (document.getElementById('user-pest').value != '') 
 
\t \t return false; 
 
\t \t 
 
\t if (document.getElementById('pass-pest').value != '') 
 
\t \t return false; 
 
\t \t 
 
\t if (document.activeElement == document.getElementById('user-pest')) 
 
\t \t return false; 
 
\t \t 
 
\t if (document.activeElement == document.getElementById('pass-pest')) 
 
\t \t return false; 
 
\t \t 
 
\t return true; 
 
} 
 

 

 
function intervalHandler() 
 
{ 
 
\t if (shouldHideHeader()) 
 
\t \t hideHeader(); 
 
}
.darknet-nav-login-form 
 
{ 
 
\t height: 42px; 
 
} 
 
.hidden 
 
{ 
 
\t height: 0px; 
 
\t overflow: hidden; 
 
\t transition: height 2s; 
 
}
<div class="darknet-nav-login-form" id="darknet-login-nav"> 
 
\t \t <form action="" method="post"> 
 
\t \t \t <input type="text" name="username" id="user-pest" placeholder="Username" autocomplete="off"/><br> 
 
\t \t \t <input type="password" name="password" id="pass-pest" placeholder="Password" autocomplete="off"/><br> 
 
\t \t </form> 
 
\t </div>

関連する問題