2012-08-14 78 views
0

我知道如何在jQuery中做到這一點,但如何在Javascript中做到這一點?遍歷DOM來找到哪個元素有焦點

if ((evt.which == arrLeftKey || evt.keyCode == arrLeftKey) && document.getElementById(TopMenuID).getElementsByTagName('a') === document.activeElement) { 
       alert("LEFT"); 
} 

上面的if語句不工作,我不確定爲什麼。什麼都沒有被警告。我有一個名爲TopMenuID的導航欄,如果其中的一個標籤具有焦點,我想在按下左鍵時提醒LEFT。我究竟做錯了什麼?

+0

'的document.getElementById(TopMenuID).getElementsByTagName( 'A')''** [0]'** – 2012-08-14 19:58:15

+0

的'的getElementsByTagName()'函數返回一個節點列表,這決不會等於單個元件。 – 2012-08-14 19:58:20

回答

1

getElementsByTagName('a')返回一個數組,但你比較它activeElement因此兩個永遠不會相等。

如果您想知道activeElement是否在您的菜單中,那麼您可以查看activeElement的父鏈,並查看是否運行到TopMenuID元素。

function doesContain(item, parent) { 
    var obj = item.parentNode; 
    while (obj && obj !== document.documentElement && obj.nodeType !== 11) { 
     if (obj === parent) { 
      return(true); 
     } 
     obj = obj.parentNode; 
    } 
    return(false); 
} 

if ((evt.which == arrLeftKey || evt.keyCode == arrLeftKey) && doesContain(document.activeElement, document.getElementById(TopMenuID) { 
    alert("LEFT"); 
} 
+0

所以,像document.activeElement.parentNode === document.getElementById(TopMenuID)? – 2012-08-14 20:13:05

+0

@Hubrid - 是的,如果鏈接始終只比topMenuID低一個級別。我在我的答案中添加了更通用的代碼,因爲您沒有共享HTML,所以我不知道可以對結構做出什麼假設。 – jfriend00 2012-08-14 20:17:24

+0

真棒。 upvotes,獎勵這個人! – 2012-08-14 20:18:06

2

將其更改爲

document.getElementById(TopMenuID).getElementsByTagName('a')[0] 
+0

這不只是給TopMenuID中的第一個? – 2012-08-14 20:11:17

+0

@Hubrid - 是的。否則,您無法將其與'document.activeElement'進行比較,因爲getElementsByTagName返回一個NodeList(Array),而'activeElement'是一個Element。 – 2012-08-14 20:13:25

+0

好的,我需要它來得到他們中的任何一個,但不是所有這些數組,所以我認爲jfriend00的答案有效,然後 – 2012-08-14 20:16:11

0

嘗試

document.getElementById(TopMenuID).getElementsByTagName('a')[0]