Затык при рекурсивном обходе

surg30n

Новичок
Затык при рекурсивном обходе

Добрый всем день.

Дали на доработку систему, там есть такой изврат:
Набор input'ов (checkbox'ы) соответствует разделам с идентификаторами "v_{parent_sid}_{sid}"

Необходимо при установке галки у родителя, также обойти явакскриптом его детей.

Код: цепляем все инпуты и смотрим у кого установлен my_id.
Далее разбиваем его в массив и сравниваем sid (ид раздела) и sid раздела-родителя.
Если они совпадают, значит запускаем рекурсивный вызов с chrootом в дочерний раздел.

Затык в том, что после прохода рекурсии в дочерние элементы, работа вызывавшей части кода не продолжается.

PHP:
var elms_cache = document.getElementsByTagName('input');     //cache

function ch_toggle(my_root){
          
    my_root_p = my_root.split('_');  
    var elms = elms_cache;
                    
        for (var i = 0; i < elms.length; i++) { 
           my_id = elms[i].getAttribute('my_id');
           
           if (my_id) {
           
           my_tmp = my_id.split('_');

                is_real = 1;  // детки               
                if (my_root_p[2]!=my_tmp[1]) is_real=0;                 
                 
                if (my_root==my_id || is_real) {
                        g_i_toggle_check(elms[i].getAttribute('my_id_ex'));                    
                }
               
                // childrens
                if (is_real && my_root!=my_id) {                                                                          
                    return ch_toggle(my_id);
                }
           }
        } 
   
  return true;
}
поодскажите где кос, моск вынесен основательно...

-~{}~ 29.03.07 16:23:

Вообщем так и не разобрался почему рекурсия не работала, сделал через жоппинг по таймауту...
Код ниже. Модеры, если это хрень, смело делитТе тему

PHP:
var elms_cache = document.getElementsByTagName('img');     //cache 
var elms = new Array();

 j=0;
 for (var i = 0; i < elms_cache.length; i++) { 
    t_id = elms_cache[i].getAttribute('my_id');
    if (t_id) {
        elms[j]=new Object;        
        elms[j]['my_id']=t_id;
        elms[j]['my_id_ex']=elms_cache[i].getAttribute('my_id_ex') ;
        elms[j]['my_tmp'] = t_id.split('_');
        j++;
    }
 }
 

function ch_toggle(my_root, to_){
   
    var my_root_p = my_root.split('_');  
                    
        for (var i = 0; i < elms.length; i++) { 
          
           my_id = elms[i]['my_id'];             
           my_tmp = elms[i]['my_tmp'];  
              
                    is_real = 1;  // детки               
                    if (my_root_p[2]!=my_tmp[1]) is_real=0;     
                     
                    if (my_root==my_id || is_real){
                        g_i_toggle_check_force(elms[i]['my_id_ex'],to_);                    
                    }
                    
                    // childrens
                    if (is_real && my_root!=my_id) {                   
                        //return ch_toggle(my_id,to_);  // рекурсия не работает...
                        setTimeout( ('ch_toggle("'+my_id+'",'+to_+')'), 10);                         
                    }                 
        }    
  return true;
}
 

ksnk

прохожий
Переменные нужно объявлять словом var, иначе они становятся глобальными...
 

SelenIT

IT-лунатик :)
Re: Затык при рекурсивном обходе

Зачем в первом варианте return при рекурсивном вызове?
 

surg30n

Новичок
ksnk
Даже если так, здесь это роли явно не играет. Переменным явно указывается первоначальное значение.

SelenIT
Да собственно, слона то и не заметил. Сенькю вэри мач! Наверно пора в отпуск.. :)
 
Сверху