Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.10.2012, 23:00
Интересующийся
Отправить личное сообщение для LeD4eG Посмотреть профиль Найти все сообщения от LeD4eG
 
Регистрация: 16.04.2012
Сообщений: 14

Работа с nodeType
Добрый вечер!
Подставил перед собой следующую банальную на первый взгляд задачу: подсчитать количество дочерних элементов, без знаков возврата каретки (их необходимо удалить). Как известно перевод каретки - это текстовый узел, то есть для следующей разметки:
<div id="block">
   <span>bla</span>
   <span>bla</span>
   <span>bla</span>
</div>

(здесь мы имеем 7 дочерних элементов - 3 элемента span и 4 символа перевода каретки), имеем следующий код:
var childs = document.getElementById('block').childNodes,
       counter = 0; //количество не текстовых узлов
  for(var i = 0; i<childs.length; i++){
    var mythis = childs[i];
    (mythis.nodeType==3)? mythis.parentNode.removeChild(mythis) : ++counter;
  }


Я получаю counter равным 0. если немного модифицировать приведенный выше код:
var childs = document.getElementById('block').childNodes,
       counter = 0; //количество не текстовых узлов
  for(var i = 0; i<childs.length; i++){
    var mythis = childs[i];
    if(mythis.nodeType==3) mythis.parentNode.removeChild(mythis);  
    ++counter;
  }
, получаю counter равным 4 (то есть количество итераций), однако данный код:
var childs = document.getElementById('block').childNodes,
       counter = 0; //количество не текстовых узлов
  for(var i = 0; i<childs.length; i++){
    var mythis = childs[i];
    if(mythis.nodeType==1) ++counter;
  }
, работает верно и выдает counter равным 3.

Объясните, пожалуйста, что я делаю не так?

А также ещё вопрос: почему из цикла я не могу использовать указатель this? (приходится использовать переменную mythis)

Спасибо большое за помощь!
Ответить с цитированием
  #2 (permalink)  
Старый 16.10.2012, 23:09
Аватар для lord2kim
Профессор
Отправить личное сообщение для lord2kim Посмотреть профиль Найти все сообщения от lord2kim
 
Регистрация: 03.05.2011
Сообщений: 848

LeD4eG,
<div id="block">
   <span>bla</span>
   <span>bla</span>
   <span>bla</span>
</div>
<script>
  var childs = document.getElementById('block').children, //childNodes
       counter = 0; //количество не текстовых узлов
  for(var i = 0; i<childs.length; i++){
    //var mythis = childs[i];
    (childs[i]==3)? "" : ++counter;
  }
alert(counter+"\n"+childs.length);
</script>
Ответить с цитированием
  #3 (permalink)  
Старый 16.10.2012, 23:13
Интересующийся
Отправить личное сообщение для LeD4eG Посмотреть профиль Найти все сообщения от LeD4eG
 
Регистрация: 16.04.2012
Сообщений: 14

то есть Вы просто заменяете пустой строкой возврат каретки?а почему с removeChild() так не выходит?

Последний раз редактировалось LeD4eG, 16.10.2012 в 23:26.
Ответить с цитированием
  #4 (permalink)  
Старый 16.10.2012, 23:27
Аватар для eirnvn
Кандидат Javascript-наук
Отправить личное сообщение для eirnvn Посмотреть профиль Найти все сообщения от eirnvn
 
Регистрация: 15.09.2011
Сообщений: 70

This - для функции, а цикл это не функция у него нет своей области видимости, все переменные в цикле видны в коде, так что mythis это простая переменная в которую записан элемент.
__________________
"I don't write to say what I think, but to know what I think"
Ответить с цитированием
  #5 (permalink)  
Старый 16.10.2012, 23:36
Интересующийся
Отправить личное сообщение для LeD4eG Посмотреть профиль Найти все сообщения от LeD4eG
 
Регистрация: 16.04.2012
Сообщений: 14

eirnvn, спасибо!понял.
Ответить с цитированием
  #6 (permalink)  
Старый 16.10.2012, 23:47
Аватар для lord2kim
Профессор
Отправить личное сообщение для lord2kim Посмотреть профиль Найти все сообщения от lord2kim
 
Регистрация: 03.05.2011
Сообщений: 848

LeD4eG, там ничего не заменяется...просто children возвращает список дочерних узлов, без текстовых
http://learn.javascript.ru/traversing-dom
Ответить с цитированием
  #7 (permalink)  
Старый 17.10.2012, 00:38
Интересующийся
Отправить личное сообщение для LeD4eG Посмотреть профиль Найти все сообщения от LeD4eG
 
Регистрация: 16.04.2012
Сообщений: 14

lord2kim, тогда в чём смысл проверки (childs[i].nodeType==3)?
Ответить с цитированием
  #8 (permalink)  
Старый 17.10.2012, 08:52
Аватар для lord2kim
Профессор
Отправить личное сообщение для lord2kim Посмотреть профиль Найти все сообщения от lord2kim
 
Регистрация: 03.05.2011
Сообщений: 848

LeD4eG, просто показал вам, что такое children
Ответить с цитированием
  #9 (permalink)  
Старый 17.10.2012, 09:31
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

а так не проще?
<!DOCTYPE HTML>
<html>
  <head> </head>
  <body>
<div id="block">
   <span>bla</span>
   <span>bla</span>
   <span>bla</span>
</div>
    <script>

var elem  = document.body.children[0];
    alert(elem.children.length)  


    </script>

  </body>
</html>
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #10 (permalink)  
Старый 17.10.2012, 13:19
Интересующийся
Отправить личное сообщение для LeD4eG Посмотреть профиль Найти все сообщения от LeD4eG
 
Регистрация: 16.04.2012
Сообщений: 14

lord2kim,
cyber,
спасибо вам за помощь с пояснением children, однако я хотел закрепить понятия childNodes и removeChild, а тут вылезла эта непонятная ситуация со счётчиком. думал тут найти ответы.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ищем разработчиков nodejs\php - работа в Киеве onetwotrip Работа 0 08.10.2012 18:06
Javascript фронтенд разработчик(долгосрочная, удаленная работа) cpp Работа 11 16.09.2012 12:04
Программист JavaScript постоянная удалённая работа. moisha Работа 4 26.10.2011 19:52
java-программист, СПБ, зп от 20000 до 50000, работа в офисе embodiment_86 Работа 1 07.10.2011 10:31
Постоянная работа / Front-end / Москва kooper Работа 4 29.09.2011 22:06