2012-01-31 11 views
3

基本設定は次のとおりです。アクセシビリティ関連のリンクを含むウェブサイトの上部に細い棒があります。 JavaScriptが有効な場合、これは非表示になります(マイナスマージン)。しかし、ユーザーがリンクをたどっていく度にバーを表示したいと思います。私がやっていることは次のとおりです。要素外の子がフォーカスを取得したときの検出

var bar = $("#bar"); 
bar.find("a").on("focus", function(){ 
    if(bar.css("margin-top") == "-50px"){ 
     bar.animate({ marginTop: 0 }, 250); 
    } 
}); 

それは機能します。しかし、このバーを閉じると、ややこしいことになります。 blurイベントをaにバインドすると、の各リンクをタブすると非表示になります。私はすべてリンクがぼやけているときにだけそれを隠したいと思います。

私はこれを行うにしたいと思います:

bar.find("a").on("blur", function(){ 
    // If no links inside #bar have focus now: 
    bar.animate({ marginTop: -50 }, 250); 
}); 

どのように?

+0

それは私が現在フォーカスを持っている要素を見つけるための方法を探していたことが昨日でした。それと幸運 –

答えて

1

blurイベントがfocusイベント火災を発生させているので、あなたはblurイベントでタイムアウトを設定し、focusイベントでそれをキャンセルしなければなりません。

(function() { 

    var bar = $("#bar"); 
    var timeout; 

    bar.find("a").on("focus", function(){ 
     clearTimeout(timeout); 

     if(bar.css("margin-top") == "-50px"){ 
      bar.animate({ marginTop: 0 }, 250); 
     } 
    }); 

    bar.find("a").on("blur", function(){ 
     timeout = setTimeout(function() { 
      // If no links inside #bar have focus now: 
      bar.animate({ marginTop: -50 }, 250); 
     }, 1); 
    }); 

}()); 
+0

素晴らしい!フォーカスの前にぼやけの火が現れなかったので、あなたの答えが選ばれました(しかし、@ jAndyの答えも完璧に働いていました)。ありがとう – nopr

1

のようなので、それを実行します。この1つはフォーカスを持っているかもしれないすべてのanchorsを照会

bar.find("a").on("blur", function() {  
    setTimeout(function() { 
     if($('a:focus').length === 0) { 
      // If no links inside #bar have focus now: 
      bar.animate({ marginTop: -50 }, 250); 
     } 
    }, 15); 
}); 

.lengthがゼロであれば、私たちは今、そのバーを非表示にできることを知っている必要があります。私はまだそのコードをテストしていない、私に教えてください。

http://api.jquery.com/focus-selector/

例を参照してください:http://jsfiddle.net/e4PaN/

+2

これは完全に働いた。私は 'a:focus'の' length'チェックを試みましたが、フォーカスイベントの前にblurが発生するという事実を考慮しませんでした(以下の@Mattの答え)。ありがとう! – nopr

関連する問題