2012-01-31 91 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

昨天是我一直在尋找一種方法來找出哪些元素具有當前焦點。祝你好運 – 2012-01-31 12:07:22

回答

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 2012-01-31 12:18:03

1

做它像這樣:

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); 
}); 

這一個查詢所有anchors可能有一個重點,如果.length是零,我們應該知道,我們可以隱藏欄現在。我還沒有測試該代碼,請讓我知道。

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

例子:http://jsfiddle.net/e4PaN/

+2

這工作完美。我曾嘗試對'a:focus'進行「長度」檢查,但沒有考慮到焦點事件之前模糊發生的事實(如下面的@Matt回答)。謝謝! – nopr 2012-01-31 12:16:57