Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> www.dhtmlgoodies.com — Folder tree with drag&drop, Помогите модифицировать одну функцию 
V
    Опции темы
artuska
Дата 5.5.2008, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



Вот собственно сам скрипт, а вот его демо.

Есть там такая функция — getNodeOrders (файл — js/drag-drop-folder-tree.js, строки — 528-560):
Код

getNodeOrders: function(initObj, saveString) 
 { 
  if(!saveString) var saveString = ''; 
  if(!initObj){ initObj = document.getElementById(this.idOfTree); } 
  var lis = initObj.getElementsByTagName('LI'); 

  if(lis.length>0){ 
   var li = lis[0]; 
   while(li){ 
    if(li.id){ 
     if(saveString.length>0)saveString = saveString + ',\n'; 
     var numericID = li.id.replace(/[^0-9]/gi,''); 
     if(numericID.length==0)numericID='A'; 
     var numericParentID = li.parentNode.parentNode.id.replace(/[^0-9]/gi,''); 
     if(numericID!='0'){ 
      saveString = saveString + numericID; 
      saveString = saveString + '-'; 

      if(li.parentNode.id!=this.idOfTree) saveString = saveString + numericParentID; else saveString = saveString + '0'; 
     } 

     var ul = li.getElementsByTagName('UL'); 
     if(ul.length>0){ 
      saveString = this.getNodeOrders(ul[0], saveString); 
     } 
    } 
    li = li.nextSibling; 
   } 
  } 

  if(initObj.id == this.idOfTree){ 
   return saveString; 
  } 
  return saveString; 
 }


Эта функция парсит наше дерево (ну, все элементы <li>) и возвращает строку с айдишками и парэнт_айдишками, разделенную запятыми.
Например, у меня такая структура дерева (для нагладности в скобках указываю айдишки):
Код

Administration (1) 
-Login (2) 
-Exit (3) 
-Content (4) 
--Titles (8) 
--Includes (9) 
-Preferences (5) 
-Statistics (6) 
-Recycle Bin (7) 


Функция getNodeOrders возвратит мне следующую строку, исходя из моей структуры дерева:
Код

1-0, 
2-1, 
3-1, 
4-1, 
8-4, 
9-4, 
5-1, 
6-1, 
7-1 // ну тут все понятно — каждой id'шке присваивается parent_id'шка. Потом мы просто забиваем в базу эти парэнт_айдишки и таким образом можем менять структуру дерева.


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

1) 1-0, 
2) 2-1, 
3) 3-1, 
4) 4-1, 
5) 8-4, 
6) 9-4, 
7) 5-1, 
8) 6-1, 
9) 7-1 // вот так. Просто тупо пронумировать каждую строку... вроде ничего сложного... один два три четыре...


На первый взгляд элементарно — создать переменную, которую потом внутри цикла while() будем инкрементировать. Типа так:
Код

if(!num) var num = '0'; // здесь объявляем нашу переменную! 
... 

if(lis.length>0){ 
 var li = lis[0]; 
  while(li){ 
   num++; // а здесь ее увеличиваем каждый раз 
   ... 
  } 
 ... 
}


Но не тут-то было — у нас там рекурсия. И когда эта рекурсия исполняется, то эта инкремент-переменная теряется:
Код

1) 1-0, 
2) 2-1, 
3) 3-1, 
4) 4-1, 
5) 8-4, 
6) 9-4, 
5) 5-1, // вот здесь, где исполняется условие if(ul.length>0) и начинается рекурсия, наша переменная num ведет себя странно
6) 6-1, 
7) 7-1 


Что делать? Куда этот num++; всунуть, чтобы он корректно нумеровал мне строки?

ЗЫ. Нет, я не забываю указывать переменную num в параметрах функции (function(initObj, saveString, num)).
PM MAIL   Вверх
ksnk
Дата 5.5.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 38
Всего: 386



Ну, выводи этот num за пределы видимости этой рекурсивной функции.
как нибудь так:
Код

num:0,
getNodeOrders: function(initObj, saveString) 
 { 
...

 while(li){ 
   this.num++; // а здесь ее увеличиваем каждый раз 
   ... 
  } 




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
artuska
Дата 5.5.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 5.5.2007

Репутация: нет
Всего: нет



Аааааа! Ура! Сделал как ты сказал — работает!
Только обьявил переменную чуток по-другому — this.num = 0;

Уф, спасибо, а-то я на официалном форуме задал этот же вопрос, но там никто до сих пор не ответил, хотя тема просмотрена несколькими десятками пользователей.

Огромное человеческое спасибо, выручил! Так как именно из-за этой, вроде мелочи, дальше двигаться не могу...

(помечаю тему как решенную)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Применение библиотек | Следующая тема »


 




[ Время генерации скрипта: 0.0728 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.