2010-05-03 77 views
3

我有這樣的結構,我的DOM:獲取正確的節點

<label>London<input type="checkbox" name="London"></label><br> 
<div class="innerpost"> 
<label>N1 2AB<input type="checkbox" name="N1 2AB"></label><br> 
<label>E1 1AB<input type="checkbox" name="E1 1AB"></label><br> 
</div> 

我需要一種方法來選擇的第一個複選框股利。就像

parentNode.parentNode.getElementsByTagName("div"); 

但我沒有得到它的權利 - 特定的行選擇一個父母上面我需要的所有div。

+0

你寫:'parentNode.ParentNode.getElementsByTagName(「格」);'除了parentNode'的'錯誤的資本,我不知道你調用哪個節點的'parentNode'屬性。 – 2010-05-03 18:59:07

+0

對不起,錯字。我打電話給第一個輸入的parentNode。 – YsoL8 2010-05-03 19:02:38

+0

我不清楚你想要什麼。當「倫敦」複選框觸發事件(「從第一個複選框」不清楚)時,您是否嘗試獲取'div class =「innerpost」'節點? – 2010-05-03 19:02:56

回答

1

首先,我認爲這將是最簡單的只是把一個ID所需的DIV,然後說document.getElementById('divId')

但是,如果你想要做你的方式,你也許可以先檢查nodeName財產,以確保您的活動真正被稱爲輸入,而不是標籤,然後檢查parentNode.nodeName調試此等

+0

我很想去,但我正在動態生成表單,並且最終會得到具有相同ID的多個div。我想我可以給類名添加數字,並嘗試從給定的複選框中調用div id。不確定。 – YsoL8 2010-05-03 19:16:49

+1

你想增加ID,而不是類名。我們以前做過這種事情。 「倫敦」複選框可能是id =「city_18」,div可能是'div class =「innerpost」id =「inner_18」>' 然後,我們在下劃線上分割出城市的ID爲18,然後'getElementById(「inner _」+ cityId)' – 2010-05-03 19:26:03

+0

編號需要從0還是1開始? – YsoL8 2010-05-03 19:37:34

0

得到了解決方案!

var div = element.parentNode.nextSibling.nextSibling; 
while (!div.tagName) div = div.nextSibling; 

第二行是需要的,因爲IE不計算文本節點,但是其他瀏覽器可以。

測試請參閱本的jsfiddle:http://jsfiddle.net/SLjXW/

+0

否因爲(如果我理解正確)他試圖從div – 2010-05-03 19:08:10

+0

以外的複選框獲得div據我所知,選擇了表單元素。我在倫敦投入之後緊接着div,而不是父母。 – YsoL8 2010-05-03 19:12:10

+0

對不起。我會盡力找到一個正確的解決方案。 – Vincent 2010-05-03 19:32:48

0

使用ID將是最簡單的(正如Tim Goodman所說的),但是如果你不能(生成DOM,不知道ID)我會通過兄弟節點而不是父母循環。 沿東西的(僞代碼)行:

var sib = eventNode; // start at the checkbox where the event took place 
var found = false; 
do { 
    sib = sib.nextSibling; 
    // see if this is the div with class innerpost 
    // it could be a textnode, you can't assume the immediate sibling is the div 
    if (sib.tagName == 'DIV' && sib.className.match('innerpost') { 
     found = true; 
     break; 
    } 
} while (sib); 
+0

我看不到正確的課程6個下一個同級 – YsoL8 2010-05-03 19:27:04