2013-03-08 2 views
0

Я использую модуль Webform от Drupal, который автоматически записывает все идентификаторы и классы, поэтому я не могу добавить Id в место, которое я хочу добавить. И Drupal не ставит меня. Хмм.DOM help, родители родителей, дети детей

У меня нет проблем, когда я использую свой код только с простым getElementById ('myid'), но мне нужен элемент, пустой, не id, не класс «a», который находится внутри «легенды» (который имеет класс, но не id), который находится внутри поля с идентификатором.

Я попробовал этот код и несколько вариантов, но это не сработало:

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

+0

Опубликовать HTML, тогда мы можем сказать вам, что это должно быть. Но если есть только один ребенок указанного типа, он будет [0]. – Barmar

+0

Вы должны выбрать индекс в соответствии с порядком 'a' в элементе, и, как @Barmar, напишите, опубликуйте эту часть html – Sam

0

Recurse через 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.

Смежные вопросы