Как получить доступ к дочерним элементам div при заданном условии с помощью JavaScript? - PullRequest
1 голос
/ 16 мая 2010

Мой главный вопрос - рассчитать последнее предупреждающее сообщение, но любая другая информация также приветствуется.

Я пытаюсь выучить javascript (использовать с greasemonkey позже), но я немного пытаюсь понять DOM и как его обработать.

<html>
<head>
<script type="text/javascript">
function my_test()
{
    var elements = document.getElementsByTagName("div");
    // prints "found [object HTMLCollection] with length 8"
    alert("found " + elements + " with length " + elements.length);
    // prints "0:[object HTMLDivElement]"
    alert("0:" + elements[0]);
    // how to calculate the following?
    alert("for intereting one is AAAA and three is CCCC");
}
</script>
</head>
<body>

<div class="interesing">
        <div class="one">AAAA</div>
        <div class="two">BBBB</div>
        <div class="three">CCCC</div>
</div>

<div class="boring">
        <div class="one">1111</div>
        <div class="two">2222</div>
        <div class="three">3333</div>
</div>

<input type="button" onclick="my_test()" value="my test" 

</body>
</html>

Итак, elements теперь представляет собой массив элементов, и я могу получить доступ к каждому из них по отдельности. Но где я могу найти какие методы / свойства у этих элементов?

Ответы [ 2 ]

1 голос
/ 16 мая 2010

Предполагая, что вы хотите захватывать элементы и их дочерние элементы по классам, а не по позиции, я просто написал бы короткую функцию, которая будет возвращать коллекцию элементов по классам.

<html>
<head>
<script type="text/javascript">
function my_test()
{
    var elements = document.getElementsByTagName("div");
    // prints "found [object HTMLCollection] with length 8"
    alert("found " + elements + " with length " + elements.length);
    // prints "0:[object HTMLDivElement]"
    alert("0:" + elements[0]);
    // how to calculate the following?
    alert("for " + "interesing" + " " + "one" + " is " + C("one",C("interesing")[0])[0].innerHTML + " and " + "three" + " is " + C("three",C("interesing")[0])[0].innerHTML);
}

function C(cls,elm){
    if(!elm) elm = document;
    if(elm.getElementsByClassName) return elm.getElementsByClassName(cls);
    else{
        var t = [];
        var children = elm.getElementsByTagName("*");
        for(var i=0;i<children.length;i++){
            if(children[i].className.match(new RegExp("(^|\\s)" + cls + "($|\\s)"))) t.push(children[i]);
        }
        return t;
    }
}
</script>
</head>
<body>

<div class="interesing">
    <div class="one">AAAA</div>
    <div class="two">BBBB</div>
    <div class="three">CCCC</div>
</div>

<div class="boring">
    <div class="one">1111</div>
    <div class="two">2222</div>
    <div class="three">3333</div>
</div>

<input type="button" onclick="my_test()" value="my test" 

</body>
</html>

Обратите внимание, что функция C, которую я написал для получения элементов по классам, не является идеальным решением, но в большинстве случаев она будет работать достаточно хорошо и ее легко писать на лету. Оповещение работает, получая первый элемент с классом interesing (C("interesing)[0]), а затем используя его в качестве параметра при получении первого дочернего элемента с классом one (C("one",C("interesing")[0])[0]).

Если вы хотите захватить эти элементы на основе позиции или тега, тогда более подходящим будет другое решение. Я просто предполагаю, что вы ищете эти элементы, основанные на классе, и в этом случае простая функция getElementsByClassName сделает все, что вам нужно.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: Похоже, я решил ваш тревожный вопрос, но не совсем ответил на реальный вопрос ... Я думаю. Помните, что вы можете связать вместе getElementsByTagName, поэтому, если вы хотите дочерние элементы div, вы можете просто запустить вложенный цикл for, сначала циклически пройдя все div, и, если есть дочерние элементы, циклически просмотреть их. *

Вот пример:

var elements = document.getElementsByTagName("div");
for(var i=0;i<elements.length;i++){
    var str = "Parent DIV(" + elements[i].className + ") has ";
    var children = elements[i].getElementsByTagName("div");
    if(children.length){
        str += "children: ";
        for(var j=0;j<children.length;j++){
            str += "{className:" + children[j].className + ",innerHTML:" + children[j].innerHTML + "},";
        }
    }else{
        str += "no children.";
    }
    alert(str);
}
0 голосов
/ 16 мая 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...