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

HTML+CSS+JavaScript

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

 

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

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

тема: условия рекурсивного лупа
 
 автор: sl1p   (03.02.2010 в 00:25)   письмо автору
 
 

while(o.tagName != "DIV" && o.className.indexOf("flat") == -1)
    o = o.parentNode;


немогу допетрать как остановить луп только тогда когда o.tagName == "DIV" и если проходит первое условие на таг проверить есть ли у этого элемента класс flat..

помогите:)

  Ответить  
 
 автор: sl1p   (03.02.2010 в 00:56)   письмо автору
 
   для: sl1p   (03.02.2010 в 00:25)
 

вот, сделал так, но интересно было бы узнать как это реализовать в примере выше..

while(true) {
    o = o.parentNode;
    if(o.tagName == "DIV" && o.className.indexOf("flat") > -1)
        break;
}

  Ответить  
 
 автор: АЯ   (03.02.2010 в 01:40)   письмо автору
 
   для: sl1p   (03.02.2010 в 00:25)
 

А ничего делать не надо.
Вообще ничего.
У вас и так в первом сообщении написан код, который выполняет именно то, что вам и надо.


Логический оператор AND (&&) исполняется следующим образом: вычисляется результат первого выражения. Если результат первого выражения true, то только тогда вычисляется результат второго выражения. А если первое выражения - false, то второе выражение с целью экономии времени и ресурсов никогда не вычисляется.

См. пример:
<script>
//переменная SECOND не определена вообще
//если написать alert (SECOND), то  alert-окошко не появится, ибо ошибка "Переменная не определена"

//определим переменную FIRST
var FIRST = false;

//выведем условие
alert (FIRST && SECOND);
//безо всяких проблем/ошибок увидим  alert-окошко, в котором будет написано false
</script>

Т.е., если тег != 'DIV', то имя класса браузер проверять не будет гарантированно, а просто остановит цикл.

  Ответить  
 
 автор: sl1p   (03.02.2010 в 01:49)   письмо автору
 
   для: АЯ   (03.02.2010 в 01:40)
 

хм..
а почему остановится, если в таком случае:
while(o.className.indexOf('photo') == -1) o = o.parentNode;
    return o;


проходится неогр. кол-во тегов?

  Ответить  
 
 автор: АЯ   (03.02.2010 в 02:54)   письмо автору
 
   для: sl1p   (03.02.2010 в 01:49)
 

Странный вопрос.
Пишете сначала про СЛОЖНОЕ условие, затем приводите пример с ПРОСТЫМ условием и спрашиваете - "почему не останавливается?" :-)

while (условие_1) переводится на русский как "делать что-то, ПОКА выполняется условие_1".
В примере с вашим (простым) условием, если в дереве вовсе НЕТ тегов с именем класса photo, цикл работать будет вплоть до конца родительского дерева, т.е. до тега <HTML>. А потом даст ошибку - у "последнего" тега НЕТ родителя.

Если условие у вас с оператором AND, например, while (условие_1 && условие_2), т.е. "делать что-то, пока женщина (1) с именем Аня (2)", то работать это будет так:
-- проверяем - "женщина" ли?
-- если женщина, то узнаём имя этой женщины (Аня - продолжаем, не Аня - останавливаемся).
-- а вот если мужик, то имя у него спрашивать уже не будем. И не потому, что мужиков с именем Аня не бывает. А потому, что - "мужик", а не "женщина" - первое условие не выполнено. Просто СРАЗУ остановимся (перестанем "делать что-то").

  Ответить  
 
 автор: sl1p   (03.02.2010 в 12:33)   письмо автору
 
   для: АЯ   (03.02.2010 в 02:54)
 

хм ну так более менее я понял, но стыдно признаться не до конца:)
ну да ладно.. спасибо большое за попытку объяснить!

значит мой второй пост для моей цели более подходит?
или можно сделать както интеерсней?

  Ответить  
 
 автор: АЯ   (03.02.2010 в 13:16)   письмо автору
 
   для: sl1p   (03.02.2010 в 12:33)
 

Я написал: "У вас и так в первом сообщении написан код, который выполняет именно то, что вам и надо."
В ответ на это получаю: "значит мой второй пост для моей цели более подходит?"

"Я офигеваю, дорогая редакция" (с)

  Ответить  
 
 автор: sl1p   (03.02.2010 в 13:59)   письмо автору
 
   для: АЯ   (03.02.2010 в 13:16)
 

мда
я же написал что он работает не так как мне надо, нужно чтобы останавливалось на DIV с классом flat, оно же останавливается на на первом попавшемся DIV

теперь яснее?

  Ответить  
 
 автор: АЯ   (03.02.2010 в 14:14)   письмо автору
 
   для: sl1p   (03.02.2010 в 13:59)
 

while (условие_1) выполняется ДО ТЕХ ПОР, пока условие_1 является истинным. Т.е. истинность условия_1 - это УСЛОВИЕ ПРОДОЛЖЕНИЯ ЦИКЛА.

Вы же пытаетесь трактовать истинность условия_1 как УСЛОВИЕ ОСТАНОВКИ ЦИКЛА.

Вывод: измените условие на (!(o.tagName != "DIV" && o.className.indexOf ("flat") < 0))

  Ответить  
 
 автор: sl1p   (03.02.2010 в 15:54)   письмо автору
 
   для: АЯ   (03.02.2010 в 14:14)
 

о теперь понятно, спасибо :)

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

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