Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не работает свойство childNodes в JavaScript
 
 автор: OlegBas   (06.12.2013 в 21:36)   письмо автору
 
 

Добрый вечер уважаемые форумчане. Подскажите почему именно из элемента p невозможно получить дочерние узлы при помощи свойства childNodes

  Ответить  
 
 автор: confirm   (06.12.2013 в 23:36)   письмо автору
 
   для: OlegBas   (06.12.2013 в 21:36)
 

А что именно вы хотите получить? childNodes - это массив объектов узлов текущего элемента и включает в себя не только объекты элементы, но текстовые узлы. Браузер может воспринимать пробелы, символы разрыва строк как текстовые узлы, что в свою очередь будет влиять на свойства firstChild, lastChild этого набора.

  Ответить  
 
 автор: OlegBas   (07.12.2013 в 10:45)   письмо автору
151.7 Кб
 
   для: confirm   (06.12.2013 в 23:36)
 

Я хочу получить дочерние узлы находящиеся в элементе p.Посмотрите пожалуйста скрин во вложении (в 1 скрине я показываю как я получаю дочерние узлы , а во втором сам html)

  Ответить  
 
 автор: OlegBas   (07.12.2013 в 10:50)   письмо автору
142.4 Кб
 
   для: OlegBas   (07.12.2013 в 10:45)
 

Это второй скрин(смотрите во вложении)

  Ответить  
 
 автор: confirm   (07.12.2013 в 11:04)   письмо автору
 
   для: OlegBas   (07.12.2013 в 10:50)
 

Во-первых - метод getElementsByClassName, это метод из черновика HTML5, а значит просто не будет работать в зависимости от браузера.
Во-вторых в html коде представленном элементов с классом 'div' не наблюдается, видимо вы путаете имя тега с классом.
Если знаете, что в элементе необходимо получить дочерние узлы и только div, то это можно сделать методом getElementsByTagName('div').
В третьих, у вас используется jQuery, а значит ваша комбинация совсем никчемна, в jQuery получить дочерние элементы (не узлы!), это:
$(селектор).children([селектор])


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

  Ответить  
 
 автор: OlegBas   (07.12.2013 в 17:59)   письмо автору
153.7 Кб
 
   для: confirm   (07.12.2013 в 11:04)
 

Я немного запутал вас.Я хочу получить дочерние узлы элементов с классом block , а не по имени тега/.Также я переписал код на стиль XHTML 1.1 . так как вы говорите , что свойство getElementsByClassName() не поддерживается в HTML 5 Но все равно из элемента p , который оказывается в выборке с индексом 1 не удается получить дочерний узлы ,там один только objectText и все , а из div спокойно можно получить .Посмотрите пожалуйста на скрин

  Ответить  
 
 автор: confirm   (07.12.2013 в 18:18)   письмо автору
 
   для: OlegBas   (07.12.2013 в 17:59)
 

Вместо картинок ненужных выставляйте свой код, обрамив его тегами code.
Я вам уже написал как получить дочерние элементы с помощью jQuery:

$('p.block').children();


В методе children() можно указывать и селектор уточняющий, например, если ваш параграф содержал бы кроме тегов h3, и другие теги, а нужны были бы только заголовки, то нужно было бы написать так:

$('p.block').children('h3');


Что не понятного?

  Ответить  
 
 автор: OlegBas   (07.12.2013 в 20:14)   письмо автору
 
   для: confirm   (07.12.2013 в 18:18)
 

На jQuery конечно все понятно , я хотел это сделать на чистом JavaScript

  Ответить  
 
 автор: confirm   (07.12.2013 в 21:05)   письмо автору
 
   для: OlegBas   (07.12.2013 в 20:14)
 

На чистом JS (хотя jQuery, это не "грязный JS", а библиотека функций и методов JS), нужно поступать также как и jQuery делала бы - получаете все элементы, в цикле перебирая их, проверяете имя класса, найдя нужный получаете его узлы (childNodes), в цикле проверяете тип полученных узлов (nodeType), и если возвращается 1, то это узел элемента - делайте с ним чего вам надо.

  Ответить  
 
 автор: OlegBas   (08.12.2013 в 11:14)   письмо автору
 
   для: confirm   (07.12.2013 в 21:05)
 

Все логично, что вы говорите с элементом div , но с элементов p так не получается .Если запросить у него дочерние узлы ,то сколько бы узлов (в реальности) элемент p не содержал , возвращается только один objectText и нечего больше .ВОТ В ЧЕМ ЗАКЛЮЧАЕТСЯ ВСЯ ПРОБЛЕМА!!!.Продемонстрирую еще раз код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head> 
     <title>Тестовая страница</title>
     <script type = "text/javascript"  src = "lib/func.js"></script>
</head>
<body>
         
    <div  class = "block">
        <span>Блочный элемент span</span>
    </div>
    <p  class = "block">
       <h3>Заголовок 3 уровня</h3>
       <h3>Заголовок 3 уровня</h3>
    </p>
    <script type = "text/javascript">
            var elements =  document.getElementsByClassName("block");//Получаем все элементы с классом block
            var childrens_0 = elements[0].childNodes;
            var childrens_1 = elements[1].childNodes;
            alert(childrens_0.length); //Выводит 3 элемента (правильно)
            alert(childrens_1.length); //Выводит 1 элемента  почему?
    </script>
</body>
</html>

  Ответить  
 
 автор: confirm   (08.12.2013 в 11:38)   письмо автору
 
   для: OlegBas   (08.12.2013 в 11:14)
 

Вы сами то понимаете что пишите?
Во-первых, document.getElementsByClassName("block") - это равноценно использованию jQuery, ибо выбор по селектору доступен только в новых браузерах.
Во-вторых, вы или не понимаете смысла childNodes, или не читаете то, что вам пишут.

<script>
onload = function() {
   var elm = document.getElementById('as').childNodes;
   for(i=0, k=elm.length; i<k; i++) {
       alert(elm[i].nodeType);
       if(elm[i].nodeType==1) alert(elm[i].innerHTML);
   }
}   
</script>    

<p id="as">
  <span>Element 1</span>
  <span>Element 2</span>
</p>


Показывает типы узлов? Показывает содержимое элемента, если узел это элемент?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования