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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ассоциативный массив, Правильно инициализировать 
:(
    Опции темы
izOne
Дата 23.3.2005, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 22.8.2003
Где: Украина, Киев

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



Как правильно сделать следующее:
Код

    var ns = new Array();
        ns[0]['left']    = 1;
        ns[0]['right']    = 18;
        ns[0]['level']    = 0;
        ns[1] = new Array('left' = 2,    'right' = 7,    'level' = 1);
        ns[2] = new Array("left" = 3,    "right" = 4,    "level" = 2);
        ns[3] = new Array("left" = 5,    "right" = 6,    "level" = 2);
        ns[4] = new Array("left" = 8,    "right" = 15,    "level" = 1);
        ns[5] = new Array("left" = 9,    "right" = 10,    "level" = 2);
        ns[6] = new Array("left" = 11,    "right" = 12,    "level" = 2);
        ns[7] = new Array("left" = 13,    "right" = 14,    "level" = 2);
        ns[8] = new Array("left" = 16,    "right" = 17,    "level" = 1);

т.е. положить в элемент массива массив с строковыми ключами.
--------------------
Успех ждет каждого, но иногда всю жизнь.
PM Jabber   Вверх
Aliance
Дата 23.3.2005, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

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



Что требуется-то? Многомерный массив? Вот он:
Код

var array1 = new Array(1, 2, 3);
var array2 = new Array(4, 5, 6);
var array3 = new Array(7, 8, 9);
var totalArray = new Array(array1, array2, array3);

PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 23.3.2005, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



izOne это будет не совсем массив:
Код
var ns = [
 {left:1, right:18, level:0},
 [
   {left:2, right:7, level:1},
   {left:3, right:4, level:2} //и так дальше
 ]
];

alert(ns[0].left+", "+ns[1][0].left);

Но дерево лучше записать не так, я для нешего FAQ'a структуру меню отсылал в таком виде дерева обьектов. Каждый узел имеет свойство subtree, массив всех подузлов/листьев:
Код
var tree={name:"root", lft: 0. rgt: , subtree: [
  {name: "sub1", lft:1, rgt:2, subtree:null},
  {name: "sub2", lft:3, rgt:8, subtree: [
       {name: "subsub1", lft:4, rgt:5, subtree:null},
       {name: "subsub2", lft:6, rgt:7, subtree:null},
   ]},
]};

Видим корень, в массиве subtree все дочерние узлы, которые тоже могут иметь поддеревья.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
izOne
Дата 23.3.2005, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 22.8.2003
Где: Украина, Киев

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



Aliance
Цитата(Aliance @ 23.3.2005, 19:42)
Что требуется-то? Многомерный массив? Вот он:

положить в элемент массива массив с строковыми ключами.

На PHP это выглядит следующим образом:
Код

$rs = array();
array_push($rs, array(
  "left"     => 1,
  "right"   => 2,
  "name"  => 'Название1'
));
array_push($rs, array(
  "left"     => 3,
  "right"   => 4,
  "name"  => 'Название2'
));

Используется дерево NestedSet. Отсортировав массив по ключу "left", получаем правильное дерево.

Сейчас стоит задача: сделать визуальный редактор этого дерева, т.е. перемещение, удаление, добавление элементов посредством браузера и мыши.

Можно конечно после кадожго event'a посылать запрос на сервер, там скриптом обрабатывать, и посылать новую страницу клиенту, но это долго.

Сейчас хоче сделать нечто следующее: при каждом event'e пишется в переменную лог действий, напр.:
Код

MOVE 13 UP
MOVE 25 UP
MOVE 166 DOWN
DELETE 54
DELETE 4

Потом при нажатии кнопки это дело посылается скрипту, который уже и делает конечные манипуляции с БД.

Есть идеи? Может есть готовые решения?

Это сообщение отредактировал(а) izOne - 23.3.2005, 23:05
--------------------
Успех ждет каждого, но иногда всю жизнь.
PM Jabber   Вверх
Sardar
Дата 24.3.2005, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Значит не нужно просто передать данные на клиент, да так что бы под всеми браузерами, ты бы задачу полней выкладывал smile
Делай XML файл, в нём создавай все необходимые ноды. При работе используй XPath для выборок конкретных нод. Реализовывать это всё на JS в ручную запаришся smile

Код
if (document.implementation && document.implementation.createDocument)
        xmlDoc = document.implementation.createDocument("", "", null);
else {
       if (window.ActiveXObject) xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
       else {
        alert('Your browser can\'t handle this script');
        return;
    }
}

//теперь можем подгузить данные, но нам это не нужно, либо создать первые ноды в дереве юзая
//xmlDoc.loadXML("<treeroot></treeroot>");


Далее методами DOM редактируем дерево и XPath выборки.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
izOne
Дата 24.3.2005, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 22.8.2003
Где: Украина, Киев

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



Sardar Мне кажется предложенный вариант я не потяну: я в JS с трудом плаваюsmile
К тому же, по-моему, Gecko-браузеры ActiveX не поддерживают. Может я ошибаюсь.

smile Результатом сегоднящней работы стал следующий "шедевр":

Код

<HTML>
    <HEAD>
        <TITLE>Testing NestedSet WYSIWYG Editor</TITLE>
<script ="JavaScript">
function nsInit(){
    for (i = 0; i < document.forms.length; i++) {
        if(document.forms[i].onsubmit) continue;
        document.forms[i].onsubmit = function(e) {
            var form = e ? e.target : window.event.srcElement;
            nsFormSBMT();
            return false;
        }
    }
    rebuild();
}
</script>
    </HEAD>
<BODY onload="nsInit()">

<script ="JavaScript">
    function nsFormSBMT(){
        alert("onSubmit event");
    }
    var handlerURL = "/test/manageNS.php";
    var nsHTTPop = "";
    var ns = new Array();
        ns[0] = new Array();
        ns[0]['id']    = 0;
        ns[0]['left']    = 1;
        ns[0]['right']    = 18;
        ns[0]['level']    = 0;
        ns[0]['name']    = "0.0";
        ns[1] = new Array();
        ns[1]['id']    = 1;
        ns[1]['left']    = 2;
        ns[1]['right']    = 7;
        ns[1]['level']    = 1;
        ns[1]['name']    = "1.0";
        ns[2] = new Array();
        ns[2]['id']    = 2;
        ns[2]['left']    = 3;
        ns[2]['right']    = 4;
        ns[2]['level']    = 2;
        ns[2]['name']    = "1.1";
        ns[3] = new Array();
        ns[3]['id']    = 3;
        ns[3]['left']    = 5;
        ns[3]['right']    = 6;
        ns[3]['level']    = 2;        
        ns[3]['name']    = "1.2";
        
        ns[5] = new Array();
        ns[5]['id']    = 4;
        ns[5]['left']    = 8;
        ns[5]['right']    = 15;
        ns[5]['level']    = 1;    
        ns[5]['name']    = "2.0";        
        
        ns[4] = new Array();
        ns[4]['id']    = 5;
        ns[4]['left']    = 9;
        ns[4]['right']    = 10;
        ns[4]['level']    = 2;
        ns[4]['name']    = "2.1";
        
        ns[6] = new Array();
        ns[6]['id']    = 6;
        ns[6]['left']    = 11;
        ns[6]['right']    = 12;
        ns[6]['level']    = 2;                                
        ns[6]['name']    = "2.2";
        ns[7] = new Array();
        ns[7]['id']    = 7;
        ns[7]['left']    = 13;
        ns[7]['right']    = 14;
        ns[7]['level']    = 2;    
        ns[7]['name']    = "2.3";        
        ns[8] = new Array();
        ns[8]['id']    = 8;
        ns[8]['left']    = 16;
        ns[8]['right']    = 17;
        ns[8]['level']    = 1;
        ns[8]['name']    = "3.0";

function moveU(){
    var form = document.getElementById('nsNodesForm');
    var select = form.nsNodesSelect;
    idx = select.selectedIndex;
    //alert(idx);
    //alert(idx + ":" +ns[select.options[idx].value]['left']);
    if(idx !== -1){
        var debug = "";
        for(var i=0; i<idx; i++){// Цикл, т.к. могут перемещаться меню, у которых есть дети
            if(ns[select.options[i].value]['right'] == (ns[select.options[idx].value]['left']-1)){
                //alert("Можем перемещать");
                // Левая ветвь -->
                var x = this.ns[select.options[idx].value]['right'] - ns[select.options[i].value]['right'];
                var y = this.ns[select.options[idx].value]['left'] - ns[select.options[i].value]['left'];
                for(var m = i; m<idx; m++){
                    this.ns[select.options[m].value]['right'] = ns[select.options[m].value]['right'] + x;
                    this.ns[select.options[m].value]['left']     = ns[select.options[m].value]['left'] + x;
                }
                // Правая ветвь <--
                var n = (this.ns[select.options[idx].value]['right'] - this.ns[select.options[idx].value]['left']+1)/2;
                //alert("idx=" + idx + " | idx+n=" + (idx+n));
                for(var m = idx; m<idx+n; m++){
                    // mid
                    this.ns[select.options[m].value]['right']    = this.ns[select.options[m].value]['right'] - y;
                    this.ns[select.options[m].value]['left']    = this.ns[select.options[m].value]['left'] - y;
                }
                //select.options[1].style.selected = "selected";
                rebuild();
                return true;
            }else{
                continue
            }
        }
    }else{
        alert('Не выбран раздел');
    }
    alert('Перемещение вверх невозможно');
    rebuild();
    return false;
}
function rebuild(){
    this.ns.sort(cmp);
    var select = document.getElementById('nsNodesForm').nsNodesSelect;
    for(var i=0; i< ns.length; i++){
        select.options[i].text = this.ns[i]['name'] + "|=|" + ns[i]['left'] + "::" + ns[i]['right'] + "::" + ns[i]['level'];
        select.options[i].value = this.ns[i]['id'];            
    }
    //alert("Можем перемещать");
    return true;
}
function cmp(a, b){
    if (a['left'] > b['left'])
        return 1;
    if (a['left'] < b['left'])
        return -1;
    return 0;
}

function notice(msg){
    alert(msg);
}
</script>
<form name="nsNodes" id="nsNodesForm" target="">
    <select size=15 style="width: 200px; font-family: monospace;" name="nsNodesSelect">
        <option value="0">Root</option> <!-- 1:18 | 0-->
        <option value="1">1.0</option> <!-- 2:7 | 1-->
        <option value="2">--> 1.1</option><!-- 3:4 | 2 |-->
        <option value="3">--> 1.2</option><!-- 5:6 | 2 |-->
        <option value="4">2.0</option><!-- 8:15 | 1 | -->
        <option value="5">--> 2.1</option><!--9:10   | 2 | -->
        <option value="6">--> 2.2</option><!-- 11:12 | 2 |-->
        <option value="7">--> 2.3</option><!-- 13:14 | 2 |-->
        <option value="8">3.0</option><!-- 16:17 | 1 | -->
    </select>
    <br>
    <a onClick="moveU(); return false;" href="/">Вверх</a>&nbsp;|&nbsp;<a href="" onclick="rebuild(); return false;">Перестроить меню</a>
    <br><input type="submit" name="submit" value="Сохранить изменения" style="width: 200px"/>
</form>
</BODY>
</HTML>


Сначла все перемещается правильно, но потом дерево рушится. Если у кого-нибудь будет время и желание потестить и выловить баг - буду благодарен.
--------------------
Успех ждет каждого, но иногда всю жизнь.
PM Jabber   Вверх
Sardar
Дата 24.3.2005, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Цитата(izOne @ 24.3.2005, 00:59)
Результатом сегоднящней работы стал следующий "шедевр":

Самому всё реализовывать не особо нужно smile Выборки из дерева, нормальное редактирование и т.п. ребром встанут, особенно когда при больших деревьях всё тормозить начнёт smile

Цитата(izOne @ 24.3.2005, 00:59)
К тому же, по-моему, Gecko-браузеры ActiveX не поддерживают. Может я ошибаюсь

Там два варианта, для мозиллы и для ИЕ. К счастью интерфейс у конечных обьектов одинаковый, обращаемся к xmlDoc.documentElement и вперёд, по стандартам DOM, как ты бы это сделал в любом другом языке.

С помощью XML документа будет проще, у тебя готовая структура, которую довольно просто редактировать. В конце генеришь по дерево код обратно, либо отсылаешь XML данные на сервер, что будет лучше.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Gorcer
Дата 6.4.2005, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 275
Регистрация: 30.6.2004
Где: Владивосток

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



Цитата(Sardar @ 24.3.2005, 02:08)
С помощью XML документа будет проще, у тебя готовая структура, которую довольно просто редактировать. В конце генеришь по дерево код обратно, либо отсылаешь XML данные на сервер, что будет лучше.


а вы немоглибы привести пример обращения к какойнибудь ветви или атрибуту ветви через DOM в javascript
Добавлено @ 12:22
какие там базовые методы, функции и атрибуты?


--------------------
Больнее всего получить удар от человека которому доверяешь.

<удалено администрацией>
PM MAIL WWW ICQ Skype   Вверх
Aliance
Дата 6.4.2005, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

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



Gorcer
Читай тут (за ссылку говори спасибо Sardar)
Добавлено @ 12:51
Еще полещно почитать официальную доку:
http://support.microsoft.com/default.aspx?...kb;en-us;234486
http://support.microsoft.com/default.aspx?...kb;en-us;285081
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 6.4.2005, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



Gorcer создавай новый топик с отдельными вопросами smile
Aliance поддержка XML и обьект XMLHTTPRequest это немного разные вещи, второй используется для коммуникаций клиента с сервером.

Gorcer те же методы(document.createElement и т.п.) что и в HTML документе + поддержка XPath. Подзагрузка документов: http://www.quirksmode.org/dom/importxml.html, получаем обьект Document, затем отркываем: http://www.w3.org/DOM/ и читаем что же можно со всем этим сделать.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




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


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

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