2013-03-08 113 views
0

我使用的自動寫入所有的ID和班級Drupal的網絡表單模塊,所以我不能一個ID添加到我想將其添加到地方的孩子。而Drupal並沒有爲我提供一個。哎呀。我使用我的代碼只是一個簡單的getElementById('myid')沒有問題,但我需要的元素是一個空白的,沒有ID,沒有「傳說」裏面的類「a」(它有一個類,但沒有ID),這是在一個ID的字段集。DOM的幫助,父母的父母,子女

我想這個代碼和一些變化,但它沒有工作:

document.getElementById('webform-created-id-here').getElementsByTagName('legend').getElementsByTagName('a'); 

我覺得我不理解如何正確地訪問DOM的一部分。任何人都可以提供幫助或建議?

謝謝!

回答

0

的getElementsByTagName返回與發現的元素的節點列表,所以你必須選擇元素

例中的索引的第一個元素

var test = document.getElementById('webform-created-id-here').getElementsByTagName('legend')[0].getElementsByTagName('a')[0]; 

DEMO VIEW

+0

有趣 - 這看起來完全像我所需要的,但它仍然不起作用。有沒有辦法找出它是否真的是「[0]」?因爲它可能不是... – user1149499 2013-03-08 21:49:28

+0

發佈HTML,那麼我們可以告訴你它應該是什麼。但是,如果只有一個指定類型的孩子,它將是[0]。 – Barmar 2013-03-08 21:57:47

+0

您必須根據元素中的'a'順序選擇索引,並且@Barmar已經寫入,發佈html部分 – Sam 2013-03-08 21:59:20

0

遞歸通過DOM自己。對任何元素的子元素的引用都存儲在每個節點都存在的childNodes屬性中。

function recurseDOM (el,test) { 
    if (test(el)) { 
     return el; 
    } 
    else { 
     var children = el.childNodes; 
     var result; 
     for (var i=0; i<children.length; i+) { 
      result = recurseDOM(children[i],test); 
      if (result) { 
       return result; 
      } 
     } 
    } 
    return null; 
} 

這只是我在2分鐘內寫出的一個可能的實現,它讓我輸入這個答案。所以它可能會使用一些改進。但你明白了。

使用方法如下:

recurseDOM(document.body,function(el){ 
    if (el == something_something) { return 1} 
    return 0 
}); 

你可以寫一個類似的功能測試的父母:

function testParents (el, test) { 
    var parent = el.parentNode; 

    if (test(parent)) { 
     return 1; 
    } 
    else { 
     if (parent != document.body) { 
      return testParents(parent,test); 
     } 
    } 
    return 0; 
} 

所以,你可以寫類似:

recurseDOM(document.body,function(el){ 
    if (el.tagName == 'a' && testParents(el,function(p){ 
     if (p.tagName == 'legend' && testParents(p,function(pp){ 
      if (pp.id == 'webform-created-id-here') { 
       return 1; 
      } 
      return 0; 
     })) { 
      return 1; 
     } 
     return 0; 
    })) { 
     return 1; 
    } 
    return 0; 
}); 

另外,您可以從getElementById開始遞歸,而不是document.body