Javascript.RU

Удобное дерево с AJAX-подгрузкой

Эта статья показывает, как написать простое и удобное дерево с AJAX-подгрузкой узлов.

Она основана на материалах грамотное javascript-дерево и интеграция AJAX в интерфейс.

Добавить AJAX-подгрузку, используя эти две технологии - очень просто. Вообще, это может послужить основой для того, чтобы создавать любые AJAX-виджеты и сложные системы интерфейсов.

Для начала оформим дерево в виде компоненты интерфейса. Инициализацию будет осуществлять функция tree, которая получает два параметра:

id
ID узла DOM, который служит контейнером для дерева
url
Адрес, с которого подгружать узлы при помощи AJAX-запроса

Код ниже полностью описывает дерево, за исключением функции AJAX-подгрузки узлов load, которая будет разобрана ниже. Он полностью соответствует оригинальной статье, только чуть реорганизован.

Все, что он делает - это отслеживает клик на элементе element.onclick, содержащем дерево, получает узел по event.target и, если узел не содержит элементов и еще не было попыток загрузки - то получает его с сервера вызовом load. Саму функцию загрузки load разберем дальше в статье.

Функции hasClass и toggleNode - вспомогательные, для индикации скрытия-открытия ветки дерева через CSS-класс.

function tree(id, url) {
	var element = document.getElementById(id)

	/* вспомогательная функция */
	function hasClass(elem, className) {
		return new RegExp("(^|\\s)"+className+"(\\s|$)").test(elem.className)
	}

	function toggleNode(node) {
		// определить новый класс для узла
		var newClass = hasClass(node, 'ExpandOpen') ? 'ExpandClosed' : 'ExpandOpen'
		// заменить текущий класс на newClass
		// регексп находит отдельно стоящий open|close и меняет на newClass
		var re =  /(^|\s)(ExpandOpen|ExpandClosed)(\s|$)/
		node.className = node.className.replace(re, '$1'+newClass+'$3')
	}

	function load(node) {/* ... загрузить узел с сервера, код далее ... */}

	element.onclick = function(event) {
		event = event || window.event
		var clickedElem = event.target || event.srcElement

		if (!hasClass(clickedElem, 'Expand')) {
			return // клик не там
		}

		// Node, на который кликнули
		var node = clickedElem.parentNode
		if (hasClass(node, 'ExpandLeaf')) {
			return // клик на листе
		}

		if (node.isLoaded || node.getElementsByTagName('LI').length) {
			// Узел уже загружен через AJAX(возможно он пуст)
			toggleNode(node)
			return
		}


		if (node.getElementsByTagName('LI').length) {
			// Узел не был загружен при помощи AJAX, но у него почему-то есть потомки
			// Например, эти узлы были в DOM дерева до вызова tree()
			// Как правило, это "структурные" узлы
			// ничего подгружать не надо
			toggleNode(node)
			return
		}

		// загрузить узел
		load(node)
	}
}

Чтобы инициализовать дерево - достаточно запустить функцию tree на DOM-контейнере для дерева.

Вспомним, что согласно структуре дерева - для этого служит элемент UL.

Можно взять дерево с уже готовыми узлами, а можно и пустое дерево с единственным корневым узлом "Каталог", вот такого вида (просто картинка, рабочий вариант далее):

Наше дерево:
  • Каталог

HTML-код:

Наше дерево:
<ul class="Container" id="tree">
  <li class="Node IsRoot IsLast ExpandClosed">
    <div class="Expand"></div>
    <div class="Content">Каталог</div>
    <ul class="Container">
    </ul>
  </li>
</ul>

Яваскрипт-вызов для инициализации дерева:

tree('id', '/ajax/data.php')

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

Для этого нужно реализовать метод load и необходимые вспомогательные функции.

При описании дерева была предусмотрена AJAX-индикация, а в статье по интеграции AJAX в интерфейс - стандартные методы и последовательность вызовов. Остается применить их для дерева.

...

function load(node) {

	/*
	  код этих трех функций - 
      как в статье по интеграции AJAX в интерфейсы 
    */ 
	function onSuccess(data) {... }
	function onAjaxError(xhr, status) {... }
	function onLoadError(error) { ...}

    /*
	  функция showLoading использует способ 
      AJAX-индикации через CSS из этой же статьи.
    */
	function showLoading(on) {
		var expand = node.getElementsByTagName('DIV')[0]
		expand.className = on ? 'ExpandLoading' : 'Expand'
	}

	function onLoaded(data) {

		for(var i=0; i<data.length; i++) {
			var child = data[i]
			var li = document.createElement('LI')
			li.id = child.id

			li.className = "Node Expand" + (child.isFolder ? 'Closed' : 'Leaf')
			if (i == data.length-1) li.className += ' IsLast'

			li.innerHTML = '<div class="Expand"></div><div class="Content">'+child.title+'</div>'
			if (child.isFolder) {
				li.innerHTML += '<ul class="Container"></ul>'
			}
			node.getElementsByTagName('UL')[0].appendChild(li)
		}

		node.isLoaded = true
		toggleNode(node)
	}


	showLoading(true)


	$.ajax({
		url: url,
		data: node.id,
		dataType: "json",
		success: onSuccess,
		error: onAjaxError,
		cache: false
	})
}
...

Для начала заметим, что все вспомогательные функции объявлены внутри load. Это удобно, т.к. автоматически дает им доступ к узлу node.

Можно вызвать новую загрузку load, не дожидаясь окончания текущей - конфликта доступа не произойдет, т.к обработчики через замыкание привязаны к загружаемому узлу.

Оригинальная функция здесь, пожалуй, всего одна - это onLoaded. Она принимает данные с сервера в виде массива объектов-детей:

[
  { id: 1, title: 'Node 1', isFolder: 1},
  { id: 2, title: 'Node 2', isFolder: 1},
  { id: 3, title: 'Node 3', isFolder: 0}
]

Из этих объектов создается DOM-структура дерева.

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

Жмите на +, чтобы загрузить детей с сервера.

На стороне сервера используется скрипт, который сначала полсекунды спит (чтобы продемонстрировать индикацию загрузки), а затем возвращает 3 узла с последовательными номерами и примерно 33%-ным шансом того, что узел является листовым (isFolder=0).

Наше дерево:
  • Каталог

Вы также можете:


Автор: igor (не зарегистрирован), дата: 30 апреля, 2009 - 20:25
#permalink

А как изменить этот скрипт, чтобы в скрытом фрейме отправлял запрос вместо аякс, а то в ИЕ6 по умолчанию отключен activeX и не отсылается или запрашивает подтверждение для включенияактивного содержимого?


Автор: Kosty, дата: 8 мая, 2009 - 19:54
#permalink

Осталось еще добавить фунуцию перетаскивания узлов в дереве и между несколькими деревьями и будет перфект контрол


Автор: Илья Кантор, дата: 8 мая, 2009 - 20:43
#permalink

Да, я это когда-то все делал. В принципе, никаких проблем - статья про drag'n'drop на сайте есть. Все что надо - замечательно реализуется.


Автор: TT (не зарегистрирован), дата: 19 мая, 2009 - 20:54
#permalink

Статья очень классная, спасибо за неё!
Но у меня есть один вопрос - как в php'шном скрипте здесь узнать значение узла по которому кликнули? (т.е. то что значится как Node 1,2,3)?


Автор: Илья Кантор, дата: 19 мая, 2009 - 22:56
#permalink

Эта информация содержится в ajax-запросе:

.ajax(
...
data: node.id
...
)

Автор: ТТ (не зарегистрирован), дата: 20 мая, 2009 - 00:21
#permalink

Если что - извиняюсь за глупые вопросы ><
то что оно в этой строке содержится я разобралась. А вот как этот node.id в php вытащить?... перечитала учебника 3 и что-то не разобралась( статьи про jquery тож не помогли(
дай хотябы ссылку на то где это объясняется


Автор: Гарик (не зарегистрирован), дата: 30 мая, 2009 - 16:43
#permalink

Илья, огромное спасибо за статью!
Не подскажите, как сделать подгрузку узлов для бесконечного дерева из БД.


Автор: Илья Кантор, дата: 30 мая, 2009 - 22:52
#permalink

Модифицируйте PHP-скрипт, чтобы вместо генерации узлов он брал их из базы.


Автор: Илья Кантор, дата: 12 июня, 2009 - 11:03
#permalink

Если у вас возникают проблемы с node.id - убедитесь, что у каждого DOM-узла дерева есть ID. Это и есть node.id.


Автор: Гарик (не зарегистрирован), дата: 22 июня, 2009 - 20:18
#permalink
function onLoaded(data) {
    for(var i=0; i<data.length; i++) {
    var child = data[i]
               
    var li = document.createElement('LI')
    li.className = "Node Expand" + (child.isFolder ? 'Closed' : 'Leaf')
    if (i == data.length-1) li.className += ' IsLast'
// через здесь узлам добавил id
    li.id = child.id
//
    li.innerHTML = '<div class="Expand"></div><div class="Content">'+child.title+'</div>'
    if (child.isFolder) {
    li.innerHTML += '<ul class="Container"></ul>'
    }
 node.getElementsByTagName('UL')[0].appendChild(li)
                
  }
 node.isLoaded = true
 toggleNode(node)
}

Ещё раз респект и уважуха Илья! Уже присоветовал сайт пацанам на работе.


Автор: Илья Кантор, дата: 22 июня, 2009 - 22:13
#permalink

Оо! Большое спасибо за багрепорт.

Как я понял - все дело было в том, что загружаемым узлам не ставился id, да ?

Исправил в тексте статьи, обновил скрипты и архив.


Автор: Гарик (не зарегистрирован), дата: 26 июня, 2009 - 03:07
#permalink

Да, и ещё такой вот запрос:

$.ajax({

//через эту вот строку id узла передаётся в data.php
url: url + '?id=' + node.id,
//без неё в data.php ничего не передаётся

data: node.id, // а что это за "беда" и с чем её едят?
dataType: "json",
success: onSuccess,
error: onAjaxError,
cache: false
})

Автор: Гость (не зарегистрирован), дата: 5 февраля, 2010 - 08:05
#permalink

Добавила, что-то не заработало Sad


Автор: MikhailGirshberg (не зарегистрирован), дата: 27 июля, 2010 - 09:10
#permalink
$.ajax({
      url: url,
// правильнее так:
      data: {id: node.id},
      dataType: "json",
      success: onSuccess,
      error: onAjaxError,
      cache: false
    })

источник:http://api.jquery.com/jQuery.ajax/


Автор: Гость (не зарегистрирован), дата: 27 июня, 2009 - 20:36
#permalink

Как исправить функцию onLoaded, что бы это дерево не было бесконечным?


Автор: Илья Кантор, дата: 20 июля, 2009 - 09:14
#permalink

Дерево бесконечное только потому, что ПХП-скрипт на сервере возвращает все новые узлы.
В реальной жизни все будет конечное.. Обычно


Автор: Гость (не зарегистрирован), дата: 27 июня, 2009 - 22:38
#permalink

разобрался как работает... алгоритм тут хитрый


Автор: thunder2, дата: 19 июля, 2009 - 12:53
#permalink

Расскажите пожалуйста как это работает. Как рисуются вертикальные палочки, как добавляется строки, как все ровно так сдвигается. Из исходников не понятно как это рисуется.
Растолкуйте плиз. очень надо такую штуку а как оно работает непонимаю.


Автор: thunder2, дата: 20 июля, 2009 - 10:33
#permalink

Со html структорой разобрался, тепер надо поразбираться с функциями


Автор: Антонн (не зарегистрирован), дата: 31 августа, 2009 - 10:27
#permalink

Спасибо за дерево, отличная штука!

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


Автор: Антонн (не зарегистрирован), дата: 31 августа, 2009 - 10:47
#permalink

Виноват, поторопился с вопросом.
Всё очень просто. Для динамически генерируемых узлов надо добавить свой onlick в функцию

function onLoaded(data) {

Это примерно 60 строка tree.js


Автор: Илья Кантор, дата: 31 августа, 2009 - 11:28
#permalink

В том-то и дело, что ничего не надо добавлять.
onclick один на все дерево.

Просто вставляете узел и оно будет работать.


Автор: 4vanger, дата: 13 октября, 2009 - 11:19
#permalink

Реализовывал свой аналогичный компонент. Во многом применял похожие приёмы.
Единственное чем недоволен - тем что использовал таблицы вместо списков. Но было требование, что новое дерево должно быть совместимо по формату с предыдущей версией.
Очень полезная функция - инициализация узлов дерева on demand - демка (из JSON очень быстро строится дерево с 500.000.000 узлами). Как показала практика - существует очень много пользователей, которым очень нужна эта функция.


Автор: Zorro2 (не зарегистрирован), дата: 24 ноября, 2009 - 14:04
#permalink

Я кликнул мышкой по надписи Node 2, как определить, описание какой ветки нужно вывести рядом? Я так понял Node 2 - это DIV, значить при создании нового узла, надо присваевать второму диву который является классом content, идентификатор (например "div_"+child.id), потом вешать на него обработчик onclick, и дальше обрабатывать аяксом элемент в котором должно появиться описание данного узла, можно и с пхп, но прийдеться перегружать страницу, а отсюда проблема сохранения состояния дерева!

Если я не прав, то поправьте меня, просто не вижу смысла в этом дереве, если оно просто открывает и закрывает ветки, а просмотреть информацию по данной ветки, у него, как я понял мозгов нет!

Далее--------------


Автор: TT (не зарегистрирован), дата: вт., 19/05/2009 - 20:54
#permalink

Статья очень классная, спасибо за неё!
Но у меня есть один вопрос - как в php'шном скрипте здесь узнать значение узла по которому кликнули? (т.е. то что значится как Node 1,2,3)?

* Ответить

Автор: Илья Кантор, дата: вт., 19/05/2009 - 22:56
#permalink

Эта информация содержится в ajax-запросе:
Выделить все

.ajax(
...
data: node.id
...
)

это про то что я писал выше, человек спрашивал, как отловить нажатие на надписе, и узнать по какой именно был клик! Вопрос автору: описанный мною вариант имеет смысл, или я что-накрутил? Второй день копаюсь в коде, с некоторыми приколами так и не разобрался!
Вопрос номер 2: как сохранить состояние дерева, при перезагрузке страницы! Все открытые ветки пересылать по сессии, а потом циклом выводить, и присваивать каждой открытой function() { tree("tree", "data.php") }, это, мне кажеться, и вам понятно что полная чуш!

Есть какие нить предложения?

Заранее благодарен!


Автор: snick (не зарегистрирован), дата: 9 декабря, 2009 - 10:19
#permalink

Спасибо за отличный скрипт!
Но не магу разобраться с одним моментом
Как можно скриптом скрыть и загрузить заново список детей в одной из папок?
В моем приложение это дерево ещё и редактируеться


Автор: snick (не зарегистрирован), дата: 9 декабря, 2009 - 10:21
#permalink

И ещё как можно средствами javascript открыть одну из папок


Автор: Надежда_ (не зарегистрирован), дата: 4 февраля, 2010 - 13:20
#permalink

Спасибо большое за деревко!

Подскажите, пожалуйста, почему у меня $id не передаётся? Подставляю в запрос циферку - работает, только, конечно же, один и тот же уровень всё время.
ЗЫ Если записываю его в имя нода, то в названии появляется.

$id = $_GET['id'];
...
$sql = "SELECT reg_id, region, pid, lvl FROM vision.`vision_region` WHERE pid = ".$id." ORDER BY region";

$result = mysql_query($sql);

if (mysql_num_rows($result) > 0){

while ($row = mysql_fetch_array($result)) {
$id_node = $row['reg_id'];
$nam_nod = $row['region'];
if (!$row['lvl'] = '0') {$isFolder = 1;} else {$isFolder = 0;}
$node[] = "{id: '$id_node', title: '$nam_nod', isFolder: $isFolder}";

Автор: Гость (не зарегистрирован), дата: 22 сентября, 2017 - 14:48
#permalink

$sql = "SELECT reg_id, region, pid, lvl FROM vision.`vision_region` WHERE pid = '$id' ORDER BY region";


Автор: AlexBigHorn (не зарегистрирован), дата: 24 февраля, 2010 - 17:00
#permalink

Вызов $.ajax автоматически интерпретирует ответ сервера как JSON - и если с этим проблемы, то хотя XmlHttpRequest выполнился успешно, но $.ajax вызывает коллбэк для ошибки и ставит status="parsererror".

как раз такая ситуация.
консоль firebug'a показывает

xhr.status 200
из data.php возвращается
[{ id: 1, title: 'Node 1', isFolder: 1},{ id: 2, title: 'Node 2', isFolder: 1},{ id: 3, title: 'Node 3', isFolder: 0}]

но парсер говорит что некорректные данные с сервера...
в чем может быть затык?


Автор: Денис_ (не зарегистрирован), дата: 20 мая, 2010 - 19:50
#permalink

Ошибки не будет, если в ответе и ключи и их значения будут взяты в двойные кавычки.

{"id" : "1", "title": "Node 1", "isFolder": "1"}


Автор: AlexBigHorn (не зарегистрирован), дата: 24 февраля, 2010 - 18:32
#permalink

Нашлась затыка.
С новой библиотекой jquery 1.4.2 не работает пример.
Работает с 1.3.2

не смотрел, но видимо onAjaxError по другому работает..


Автор: Алексей Гость (не зарегистрирован), дата: 31 марта, 2010 - 18:33
#permalink

При выполнении примера вываливается ошибка $ is not defined в tree.js строка 81 $.ajax({
....

Что у меня не так? Куда копать?


Автор: Денис_ (не зарегистрирован), дата: 20 мая, 2010 - 19:59
#permalink

Подключите jquery в тот же файл, куда подключили tree.js


Автор: THERE (не зарегистрирован), дата: 3 июня, 2010 - 18:19
#permalink

Илья, спасибо большое за сайт и статьи.

Мелкий баг:

Вы также можете:
* Посмотреть дерево на отдельной страничке
* Скачать архив со всеми исходниками и картинками

На слове "Скачать " ссылка не та.


Автор: MikhailGirshberg (не зарегистрирован), дата: 27 июля, 2010 - 09:16
#permalink

Как заметили некоторые коллеги, в формировании запроса есть ошибка...

$.ajax({
      url: url,
// правильно так:
      data: {id: node.id},
      dataType: "json",
      success: onSuccess,
      error: onAjaxError,
      cache: false
    })

источник:http://api.jquery.com/jQuery.ajax/


Автор: anon (не зарегистрирован), дата: 14 ноября, 2010 - 16:44
#permalink

После манипуляций с библиотекой jQuery (пример работает с версией 1.3.2), в эксплорере пример заработал, а в опере по прежнему пишет: Ошибка parsererror :Некорректные данные с сервера.
В чем может быть проблема?Разве этот скрипт не кроссбраузерный?


Автор: Гость (не зарегистрирован), дата: 14 ноября, 2010 - 22:57
#permalink

Та же беда что у Надежда_ (не зарегистрирован), не хочет работать с id из базы


Автор: Гость (не зарегистрирован), дата: 14 ноября, 2010 - 23:15
#permalink

Никак не пойму, почему если id генериться автоматически - скрип работает, если id берем из базы, то получаем "Ошибка parsererror: Некорректные данные с сервера"


Автор: Гость (не зарегистрирован), дата: 15 ноября, 2010 - 00:57
#permalink

Ключи взятые в двойные кавычки не помагают Sad
На сколько я понял, дело в типе данных, когда берем id из базы, переменная строковая, а должна быть int, исправляется с помощью settype().


Автор: Гость (не зарегистрирован), дата: 15 ноября, 2010 - 01:01
#permalink

И внесите, пожалуйста, в архив эти изменения:

$.ajax({
	 
	//через эту вот строку id узла передаётся в data.php
	url: url + '?id=' + node.id,
	//без неё в data.php ничего не передаётся

Автор: Антон_83 (не зарегистрирован), дата: 19 ноября, 2010 - 10:02
#permalink

Для корректной работы с библиотекой jquery 1.4.2, нужно
ключи и их значения взять в двойные кавычки
{"id" : "1", "title": "Node 1", "isFolder": 1}, но значение ключа "isFolder" не нужно
брать в "", а то всегда будут узлы.


Автор: Pirks (не зарегистрирован), дата: 28 января, 2011 - 20:21
#permalink

Для jquery-1.4.4., у меня заработало так:

как правильно заметил MikhailGirshberg

$.ajax({
      url: url,
// правильно так:
      data: {id: node.id},
      dataType: "json",
      success: onSuccess,
      error: onAjaxError,
      cache: false
    })

и в data.php

$node[] = '{"id":"'.$id.'", "title": "Node '.$id.'", "isFolder":'.$isFolder.'}';

Автор: Гость (не зарегистрирован), дата: 21 марта, 2011 - 14:38
#permalink

Отличный скрипт! Автору респект.
Попытался разобраться при использовании его в форме. Что-то не выходит у меня каменный цветок.
Добавляю

input type="checkbox"

данные из инпута по POST не передаются. Видимо вся загвоздка в том, что данные подгружаются динамично и первоначально их нет в форме. Помогите разобраться


Автор: Гость (не зарегистрирован), дата: 25 апреля, 2011 - 23:23
#permalink

сбор данных из формы

var data = '';

	f = document.getElementById(form_id);

	if (f == null)
	{
		alert ('Ошибка работы с формой id=' + fname);
	}

	var len = f.elements.length;

	for(var i=0;i<len;i++)
	{
		var key = f.elements[i].name;
		var val = f.elements[i].value;
		var t = f.elements[i].type;

		if (!key || t == 'button')
		{
			continue;
		}

		// обработка нестандартных значений полей
		if (t == 'checkbox' || t == 'radio')
		{
			if (f.elements[i].checked != true)
			{
				continue;
			}
		}
		// EOL


		if (data && data.length > 0)
		{
			data += '&';
		}

		data += key + '=' + encodeURIComponent(val);
	}

Автор: Гость (не зарегистрирован), дата: 29 апреля, 2011 - 10:29
#permalink

Данные то собрались, а как их в POST кинуть?


Автор: hamster (не зарегистрирован), дата: 2 июня, 2011 - 06:28
#permalink

Пожалуйста, подскажите, как сделать, чтобы по умолчанию при загрузке страницы узел Каталог оказался раскрытым и автоматически подгрузились его потомки


Автор: kravru, дата: 16 июня, 2011 - 04:25
#permalink

Подскажите где найти простой пример кода на AJAX:
есть таблица групп с подгруппами
в форме 2 селекта, в 1-м выбирается группа, а во 2-й подгружаются подгруппы выбранной группы.


Автор: Гость, дата: 4 июля, 2011 - 12:25
#permalink

День добрый.
Хелп!!!

Сделал первый вывод дерева из базы.
Какой вариант есть чтобы сделать вывод последующих веток был уже зависим от содержания родительской???


Автор: Владимир_ (не зарегистрирован), дата: 1 декабря, 2011 - 22:24
#permalink

Здравствуйте!!!

Очень интересная статья, пытаюсь сделать, чтобы скрипт заработал на моем виртуальном сервере, но при нажатии на "плюсик" отображается картинка загрузки и всё. Прочитал все комментарии, вносил соответствующие исправления в разных комбинациях.

У меня такой вопрос, думаю что не у меня одного, подскажите пожалуйста:
в файле tree.html есть ссылка на /misc/jquery.js, однако такого файла в архиве с исходниками нет. Может быть в этом проблема? И что должно быть в этом файле?


Автор: maxtrime (не зарегистрирован), дата: 17 мая, 2012 - 19:52
#permalink

была та же проблема. с добавлением файла всё наладилось


Автор: GreyDog, дата: 9 октября, 2012 - 11:00
#permalink

МОжно ли в узлах (паротив) дерева добавить пару кнопок?


Автор: Maxsim-v (не зарегистрирован), дата: 17 августа, 2014 - 12:42
#permalink

Здравствуйте, а как сделать, чтобы вот только обновил, страницу, а оно само выдвигалось, тоесть что бы не надо было на плюсик жать.!


Автор: Слайдер (не зарегистрирован), дата: 17 апреля, 2015 - 23:34
#permalink

Отличный пример. Спасибо за интересную статью, жаль только что на элементы дерева надо жмякать, круто было бы, если бы они при наведении выводились.


Автор: Андрей Кузьменко (не зарегистрирован), дата: 11 октября, 2016 - 16:59
#permalink

Здравствуйте, простите за тупой может вопрос, не могу понять как считываеться id для GET запроса. Подскажите пожалуйста как передать ид в php


Автор: Андрей Кузьменко (не зарегистрирован), дата: 11 октября, 2016 - 17:01
#permalink
$.ajax({
			url: url,
                        type:"GET",
			data: ({id:node.id}),
			dataType: "json",
			success: onSuccess,
			error: onAjaxError,
			cache: false
		})

Сделал так но ошибку выводит.


Автор: Гость (не зарегистрирован), дата: 24 января, 2017 - 22:06
#permalink

Добрый день.
Есть база:
id parent title note
1 0 Заголовок1 описание
2 0 Заголовок2 описание
3 1 Заголовок3 описание
4 2 Заголовок1 описание

У корневых элементов parent = 0
Далее идут элементы уже с parent корневых и так далее. Получается древовидная структура.

Как будет выглядеть код php , который мне сформирует сначала корневые
элементы с parent 0 (верхний уровень) и код php, который по ID будет подгружать иp этой базы дочерние элементы ?

Если не трудно дайте плиз листинг


Автор: Гость (не зарегистрирован), дата: 26 января, 2017 - 11:04
#permalink

Подскажите пожалуйста как раскрывать элементы дерева по клику на название title, а не на +


Автор: Гость (не зарегистрирован), дата: 18 февраля, 2019 - 09:00
#permalink

Ребята, я новичок, поэтому учусь на подобных сайтах.

Из вышеуказанных скриптов, я скопировал код HTML и создал файл html, а код для CSS скопировал и создал отдельный файл .css, но ничего не работает Sad


Автор: Гость2 (не зарегистрирован), дата: 21 февраля, 2019 - 09:33
#permalink

Ребята помогите со скриптом. Суть в том, что я хочу написать в поле для поиска какое нибудь слово, которое находится в списке меню. Из обычного списка выходить слово, но когда слово находится внутри ("tree" - дерево - этот скрипт для меню под дерево я взял прямо с данной темы) скрипт не находит это слово.

==

.searchinput {
xbackground-image: url('/css/searchicon.png');
xbackground-position: 8px 6px;
xbackground-repeat: no-repeat;
width: 91%;
font-size: 14px;
padding: 6px 6px 6px 40px;
padding: 6px;
border: 1px solid #ddd;
margin: 0 0 20px 10px;
}

function filterContent(elmnt) {
var x, i, val, show, showh2, showbr;
val = elmnt.value;
x = document.getElementById("leftmenuinnerinner").getElementsByTagName("*");
for (i = 1; i < x.length; i++) {
if (x[i].tagName == "H2") {
if (showh2) {
if (show == false) {
showh2.style.display = "none";
} else {
showh2.style.display = "block";
}
}
show = false;
showh2 = x[i];
}
if (x[i].tagName == "BR") {
if (showbr) {
if (show == false) {
showbr.style.display = "none";
} else {
showbr.style.display = "block";
}
}
showbr = x[i];
}
if (x[i].tagName == "A") {
if (x[i].innerHTML.toUpperCase().indexOf(val.toUpperCase()) == -1) {
x[i].style.display = "none";
} else {
x[i].style.display = "block";
show = true;
}
}
if (showh2) {
if (show == false) {
showh2.style.display = "none";
} else {
showh2.style.display = "block";
}
}
}
}


Автор: Гость (не зарегистрирован), дата: 21 февраля, 2019 - 09:40
#permalink

function tree_toggle(event) {
event = event || window.event
var clickedElem = event.target || event.srcElement

if (!hasClass(clickedElem, 'Expand')) {
return // клик не там
}

// Node, на который кликнули
var node = clickedElem.parentNode
if (hasClass(node, 'ExpandLeaf')) {
return // клик на листе
}

// определить новый класс для узла
var newClass = hasClass(node, 'ExpandOpen') ? 'ExpandClosed' : 'ExpandOpen'
// заменить текущий класс на newClass
// регексп находит отдельно стоящий open|close и меняет на newClass
var re = /(^|\s)(ExpandOpen|ExpandClosed)(\s|$)/
node.className = node.className.replace(re, '$1'+newClass+'$3')
}

function hasClass(elem, className) {
return new RegExp("(^|\\s)"+className+"(\\s|$)").test(elem.className)
}

.Container {
padding: 10px;
margin: 0;
}

.Container li {
list-style-type: none;
}

/* indent for all tree children excepts root */
.Node {
background-image : url(img/i.gif);
background-position : top left;
background-repeat : repeat-y;
margin-left: 18px;
zoom: 1;

}

.IsRoot {
margin-left: 0;
margin-top: -15px;
}

/* left vertical line (grid) for all nodes */
.IsLast {
background-image: url(img/i_half.gif);
background-repeat : no-repeat;
}

.ExpandOpen .Expand {
background-image: url(img/expand_minus.gif);
}

/* closed is higher priority than open */
.ExpandClosed .Expand {
background-image: url(img/expand_plus.gif);
}

/* highest priority */
.ExpandLeaf .Expand {
background-image: url(img/expand_leaf.gif);
}

.Content {
min-height: 18px;
margin-left:18px;

}

* html .Content {
height: 18px;
}

.Expand {
width: 18px;
height: 18px;
float: left;
}

.ExpandOpen .Container {
display: block;
}

.ExpandClosed .Container {
display: none;
}

.ExpandOpen .Expand, .ExpandClosed .Expand {
cursor: pointer;
}
.ExpandLeaf .Expand {
cursor: auto;
}


Автор: Гость (не зарегистрирован), дата: 21 февраля, 2019 - 09:45
#permalink
==
  • CAS

  • Автор: ducklife (не зарегистрирован), дата: 14 августа, 2019 - 12:44
    #permalink

    Thank you for your sharing! Your information is useful to me and many people are looking for them like me! The problem seems simple, but through your pen, it impresses me!
    vex 3


    Автор: suka chu (не зарегистрирован), дата: 9 июня, 2020 - 06:45
    #permalink

    I really need the instructions you share. I hope you will provide more information often. bmi calculator


    Автор: hannah berry (не зарегистрирован), дата: 16 июля, 2020 - 11:00
    #permalink

    To get a good blog I think you tried a lot. And I think this is a very interesting blog, it attracts me by the content and creative design.
    geometry dash


    Автор: 먹튀검증사이트 (не зарегистрирован), дата: 22 ноября, 2020 - 06:04
    #permalink

    Thanks for the nice blog. It was very useful for me. 먹튀검증사이트


    Автор: 개인대출 (не зарегистрирован), дата: 22 ноября, 2020 - 06:06
    #permalink

    I’m excited to uncover this page. I need to to thank you for ones time for this particularly fantastic read!!
    I definitely really liked every part of it and
    i also have you saved to fav to look at new information in your site. 개인대출


    Автор: Shemales in Nottingham (не зарегистрирован), дата: 6 мая, 2021 - 13:33
    #permalink

    For the best sexy chat in UK you must to visit Shemales in Nottingham


    Автор: hampshire sex (не зарегистрирован), дата: 7 июня, 2021 - 18:44
    #permalink

    If you want to find casual sex contacts with hot ladies in United Kingdom you must to visit hampshire sex


    Автор: uk housewives chat (не зарегистрирован), дата: 24 августа, 2021 - 10:46
    #permalink

    Find some fine Brithish wifes ready for free chat contacts with you at uk housewives chat


    Автор: uk housewives chat (не зарегистрирован), дата: 24 августа, 2021 - 10:46
    #permalink

    Find some fine Brithish wifes ready for free chat contacts with you at uk housewives chat


    Автор: sextreffen innsbruck (не зарегистрирован), дата: 5 октября, 2021 - 14:20
    #permalink

    If you are looking for casual contacts with hot girls try sextreffen innsbruck


    Автор: ficken luzern (не зарегистрирован), дата: 26 октября, 2021 - 16:07
    #permalink

    ficken luzern is great web platform for casual sex contacts with fine ladies in EU


    Автор: Tonymanu2 (не зарегистрирован), дата: 28 октября, 2021 - 13:10
    #permalink

    I came to the hill and went trekking. Due to mapquest driving directions, I travel to Everest. This will be a lengthy journey. We have a group of five persons that have a keen interest in hiking and trekking. I hope we can all make it to the end of the voyage on time. We plan to fly the flag of our country from the summit of Everest. It's really hazardous, but I feel we can overcome any obstacle.


    Автор: LucastaLetitia (не зарегистрирован), дата: 26 ноября, 2021 - 07:11
    #permalink

    Слушайте онлайн-радиостанции на сайте: cadena 100


    Автор: Trans a Nice (не зарегистрирован), дата: 17 декабря, 2021 - 20:14
    #permalink

    If you are alone in France you must to visit our web platform and find ladies for casual chat Trans a Nice


    Автор: jamebond (не зарегистрирован), дата: 31 марта, 2022 - 07:10
    #permalink

    I found your essay to be very helpful, and I hope to read more of your work in the future. If you have any spare time, I recently discovered a terrific game called among us , which you are free to join and play with me if you so like.


    Автор: jamebond (не зарегистрирован), дата: 31 марта, 2022 - 07:10
    #permalink

    I found your essay to be very helpful, and I hope to read more of your work in the future. If you have any spare time, I recently discovered a terrific game called among us , which you are free to join and play with me if you so like.


    Автор: Transen in Neukölln (не зарегистрирован), дата: 6 апреля, 2022 - 09:36
    #permalink

    Transen in Neukölln is great web platform created for your sexual pleasure


    Автор: basketbros (не зарегистрирован), дата: 6 апреля, 2022 - 09:48
    #permalink

    огромное спасибо
    Я думаю, что это будет полезно для моего проекта


    Автор: Гость (не зарегистрирован), дата: 2 мая, 2022 - 11:34
    #permalink

    Retro Bowl is an interactive arcade game app. It has many unique and amazing features. In this game you can play rugby like it’s 1987. The theme of this game is in retro style. You also have to perform the press duties and handle the fragile egos of players just like in real life. The more you play this game the more interesting you will find it. This is an addictive game, if you play this game once then you will play it again and again. It has a simple and interactive interface due to which anyone can effortlessly play this game. It also consumes very low battery power and storage. So you don’t have to worry about your phone’s battery power while playing. The reviews of this game are quite impressive as compared to other games. enyjoy~!


    Автор: megan (не зарегистрирован), дата: 9 мая, 2022 - 05:17
    #permalink

    The hasClass and toggleNode- add-in functions, to indicate the hiding of a tree branch via a CSS class. This will make things easier and easier to adjust. wordle game


    Автор: Sexe de Femme (не зарегистрирован), дата: 11 мая, 2022 - 19:42
    #permalink

    You must to try our web platform Sexe de Femme and enjoy chatting with the hot girls in France


    Автор: victoria12 (не зарегистрирован), дата: 1 июля, 2022 - 05:31
    #permalink

    A good article, a compelling story requires the author to have a keen sense and eye to have an in-depth look at it. I am very impressed with your article. run 3


    Автор: Irene Buck (не зарегистрирован), дата: 20 июля, 2022 - 05:47
    #permalink

    Учитывая специфику проекта, над которым сейчас работаю(справочная система), этот плагин оказался просто незаменимым, и я использую 90% его функционала с превеликим удовольствием. И я до сих пор не видел такой же мощной альтернативы. canuckle


    Автор: Silajay (не зарегистрирован), дата: 26 июля, 2022 - 10:42
    #permalink

    I'm glad I found this web site, I couldn't find any knowledge on this matter prior to.Also operate a site and if you are ever interested in doing some visitor writing for me if possible feel free to let me know, i am always look for people to check out my web site. Octordle


    Автор: mytom2, дата: 29 июля, 2022 - 13:51
    #permalink

    wordle game is a straightforward sport based mostly on phrase search. It's a phrase search sport wherein the participant has to seek out the right phrase to fill within the grid. On this sport, you may create as many phrases as you need and you can even make them as troublesome as you need. On this sport, you want a phrase that begins with a sure letter and is so long as a grid. These choices enable you to make the sport extra fascinating.


    Автор: mytom2, дата: 29 июля, 2022 - 13:52
    #permalink

    The primary sport within the well-liked horror collection has been vastly profitable. Five Nights at Freddy's 2  (aka  fnaf 2): The New Expertise is a sequel to the unique and guarantees to be much more scary, with new characters, new environments, and an entire new journey! Get your scariest bounce scares prepared for this spooky sequel! This text will stroll you thru every little thing new and thrilling in regards to the sport.


    Автор: Emma Larkin (не зарегистрирован), дата: 9 августа, 2022 - 20:38
    #permalink

    Escort ireland has made great strides in adapting to a wide range of users with its instant messaging and video calling features. Customers have chosen this website over others because of these excellent features. Don't wait any longer if you are looking for your partner in crime.


    Автор: Virtuel Escort Grand Est (не зарегистрирован), дата: 29 августа, 2022 - 19:35
    #permalink

    You can find hot young ladies for casual contacts in France if you vist our web platform Virtuel Escort Grand Est


    Автор: Silajay (не зарегистрирован), дата: 30 августа, 2022 - 10:20
    #permalink

    I wanna know more about this because this is really informative! Waffle game


    Автор: Panda (не зарегистрирован), дата: 17 сентября, 2022 - 12:16
    #permalink

    wordle online is a enjoyable and difficult word puzzle game that gives you, along with the conventional gameplay, a each day problem to check your abilities. For those who like crossword puzzles and word searches, and are a fan of the game Mastermind, you'll love this nice free online game. Do you suppose you may remedy the problem of the day and share it so that everybody can see how sensible you might be?


    Автор: Duck (не зарегистрирован), дата: 17 сентября, 2022 - 12:16
    #permalink

    Have you ever participated in wordle game? This is a game that always brings surprises to you. Every day, you only have 6 turns and you have to find the answer hidden inside the crosswords.


    Автор: chanvova (не зарегистрирован), дата: 27 сентября, 2022 - 10:02
    #permalink

    word games- popular game today. It fun game


    Автор: 온라인카지노 (не зарегистрирован), дата: 27 сентября, 2022 - 10:20
    #permalink

    Looking at this article, I miss the time when I didn't wear a mask. 온라인카지노 Hopefully this corona will end soon. My blog is a blog that mainly posts pictures of daily life before Corona and landscapes at that time. If you want to remember that time again, please visit us.


    Автор: anthonyscotte (не зарегистрирован), дата: 30 сентября, 2022 - 12:16
    #permalink

    I think this is one of the most vital information for me. And i’m glad reading your article. tree surgeon barnet


    Автор: Transexuelle á Reims (не зарегистрирован), дата: 8 ноября, 2022 - 20:41
    #permalink

    If you are alone you must to check out our web platform with fine ladies ready for casual contacts Transexuelle á Reims


    Автор: Falling For Christmas 2022 Lindsay Lohan Sequin Blazer (не зарегистрирован), дата: 22 декабря, 2022 - 09:29
    #permalink

    Falling For Christmas 2022 Lindsay Lohan Sequin Blazer is the ideal choice for girls because it can be worn in any season and with any outfit, thanks to its attractive and unique design. Jacket-Hub has the best and most affordable price.


    Автор: Гость (не зарегистрирован), дата: 24 декабря, 2022 - 03:55
    #permalink

    Thank you for sharing this useful article information.I am really impressed with the article you provided.

    creperas


    Автор: Гость (не зарегистрирован), дата: 29 декабря, 2022 - 06:31
    #permalink

    Undoubtedly this is an excellent article, I gained a lot of knowledge after reading good luck. The theme of the blog is excellent, there is almost everything to read. thank!


    Автор: fm whatsapp (не зарегистрирован), дата: 9 января, 2023 - 13:42
    #permalink

    Very great information, indeed. Keep sharing stuff like this in the future as well. Добавить AJAX-подгрузку, используя эти две технологии - очень просто. Вообще, это может послужить основой для того, чтобы создавать любые AJAX-виджеты и сложные системы интерфейсов.


    Автор: Гость (не зарегистрирован), дата: 9 января, 2023 - 13:42
    #permalink

    I liked this stuff. I will share it on fm whatsapp


    Автор: Drive Mad (не зарегистрирован), дата: 10 января, 2023 - 08:00
    #permalink

    I genuinely value your excellent post Drive Mad . You honestly shared a blog post with everyone that is interesting and educational.


    Автор: 바카라게임사이트 (не зарегистрирован), дата: 30 января, 2023 - 06:28
    #permalink

    I would like to thank you for the efforts you have put in penning this site. I’m hoping to view the same high-grade content by you later on as well. In truth, your creative writing abilities has motivated me to get my own, personal website now. 바카라게임사이트


    Автор: AngelinaJolie (не зарегистрирован), дата: 30 января, 2023 - 11:54
    #permalink

    To dedicate the game I'm excited about making to everyone, I always hope that fnf mods will be recognized by more people, like your letter did.


    Автор: htjsr (не зарегистрирован), дата: 16 февраля, 2023 - 11:54
    #permalink

    I would like to express my gratitude to the author for the creation of the post because I found it to be extremely helpful and I also enjoyed reading it. I've made a note about it on the papa's freezeria , and I'd be grateful if you could take the time to read it and agree with it. I am grateful that you have taken the time to explain your problem.


    Автор: Полезные (не зарегистрирован), дата: 20 февраля, 2023 - 06:52
    #permalink

    All free games online to play at geeksgames


    Автор: Гость (не зарегистрирован), дата: 26 февраля, 2023 - 19:44
    #permalink

    If you ever visit lowes retail company, you must share your experience about the store with the management on lowescomsurvey.co & win a $500 gift card for free. Lowes is one of the biggest home improvement store in the unkted states.


    Автор: klakling (не зарегистрирован), дата: 22 марта, 2023 - 06:38
    #permalink

    Complete guide classic games


    Автор: Mnaisoa (не зарегистрирован), дата: 28 марта, 2023 - 07:02
    #permalink

    There are numerous online games that keep us entertained; in my spare time, I frequently play 1v1.lol unblocked. It's an intriguing survival shooting game.


    Автор: JuanitaWard (не зарегистрирован), дата: 12 апреля, 2023 - 06:35
    #permalink

    You can watch such information updated for free on youtube premium apk 2023


    Автор: David Clerk (не зарегистрирован), дата: 24 апреля, 2023 - 20:55
    #permalink

    Subway breakfast is a great way to start your morning. The entire menu in the breakfast list of the subway is healthy, delicious, and fast to serve. Moreover, the cost of subway breakfast is quite affordable

    Subway Breakfast Menu


    Автор: John David (не зарегистрирован), дата: 2 мая, 2023 - 22:31
    #permalink

    Lowes Survey is an online platform that serves many questions and ratings to the customers and guests to know about their performance for every month. It will be treated as a report card for your company


    Автор: kiricowell (не зарегистрирован), дата: 24 мая, 2023 - 12:54
    #permalink

    Article is very well written. It will help everyone who uses it, including myself. Keep doing what you're doing—I'll definitely read more of your posts age of war


    Автор: contexto game (не зарегистрирован), дата: 6 июля, 2023 - 10:19
    #permalink

    Do you want to play contexto without restrictions? Quordle Game offers a wide variety of free word games, like Weaver Unlimited, Contexto, and many more.


    Автор: hipohaha (не зарегистрирован), дата: 10 июля, 2023 - 13:06
    #permalink

    Favorite paper minecraft survival game


    Автор: johnpat (не зарегистрирован), дата: 11 июля, 2023 - 13:57
    #permalink

    Are you a fan of Taco Bell's delicious tacos and other Mexican-inspired menu items? If so, you may want to consider participating in the Taco Bell survey, which can give you the chance to win free tacos and other prizes Tellthebell.com


    Автор: jibic56656 (не зарегистрирован), дата: 19 июля, 2023 - 14:31
    #permalink

    The eBay credit card customer service phone number for payments and other assistance: 844-435-0237. Credit Card Payment Address. eBay Mastercard P.O. Box 71718
    CLICK HERE = eBay Credit Card Login


    Автор: Гость (не зарегистрирован), дата: 27 июля, 2023 - 11:17
    #permalink

    Friday Night Funkin is a fun and addictive game, with simple yet innovative graphics and upbeat music. You will experience dramatic and thrilling matches, creating a unique and exciting experience.


    Автор: Гость (не зарегистрирован), дата: 17 августа, 2023 - 07:25
    #permalink

    This is so interesting and enlightening that I want to learn more. redactle unlimited


    Автор: stumble guys (не зарегистрирован), дата: 17 августа, 2023 - 09:57
    #permalink

    Thanks for the useful information from your article stumble guys


    Автор: 토토사이트 (не зарегистрирован), дата: 24 августа, 2023 - 05:53
    #permalink

    Would love to perpetually get updated outstanding website 토토사이트


    Автор: 토토사이트 (не зарегистрирован), дата: 24 августа, 2023 - 05:53
    #permalink

    After study a number of the content on your own internet site now, and I genuinely much like your technique of blogging. 토토사이트


    Автор: 메이저사이트 (не зарегистрирован), дата: 24 августа, 2023 - 05:53
    #permalink

    An impressive share! I have just forwarded this onto a co-worker who has been doing a little research on this. 메이저사이트


    Автор: 토토사이트 추천 (не зарегистрирован), дата: 24 августа, 2023 - 05:53
    #permalink

    I must spend a while learning much more or working out more. 토토사이트 추천


    Автор: betflixsupervip (не зарегистрирован), дата: 28 августа, 2023 - 16:19
    #permalink

    betflix vip ผู้ให้บริการเกมสล็อตชั้นนำ เล่นง่าย จ่ายจริง


    Автор: five nights at freddy's (не зарегистрирован), дата: 30 августа, 2023 - 18:46
    #permalink

    I have gained a lot of knowledge from reading your writings moto x3m bike race game. I'm new to this site, and it's great to meet everyone. Please contact with me here if at all possible. fnaf security breach


    Автор: Survey.walmart.com (не зарегистрирован), дата: 16 ноября, 2023 - 13:32
    #permalink

    Walmart is dedicated to provide the highest caliber of customer support. It is asking its customers to take part in an online survey in order to get their feedback because of this. visit here Survey.walmart.com


    Автор: Гость (не зарегистрирован), дата: 21 ноября, 2023 - 12:55
    #permalink

    You can try all you want to play fnaf security breach unblocked, but the information provided is current and useful. Very engrossing!


    Автор: Гость (не зарегистрирован), дата: 21 ноября, 2023 - 12:55
    #permalink

    You can try all you want to play fnaf security breach unblocked, but the information provided is current and useful. Very engrossing!


    Автор: Гость (не зарегистрирован), дата: 21 ноября, 2023 - 12:55
    #permalink

    You can try all you want to play fnaf security breach unblocked, but the information provided is current and useful. Very engrossing!


    Автор: ufa168 (не зарегистрирован), дата: 29 ноября, 2023 - 18:00
    #permalink

    Really I enjoy your site with effective and useful information. It is included very nice post with a lot of our resources.thanks for share. i enjoy this post. ufa168


    Автор: beckysmith (не зарегистрирован), дата: 4 декабря, 2023 - 12:45
    #permalink

    Currently APK Mod App is being chosen by many people for entertainment. People can use these versions for entertainment on their phones


    Автор: herty (не зарегистрирован), дата: 12 декабря, 2023 - 00:18
    #permalink

    I appreciate you bringing this absorbing article to my attention; it's truly insightful. monkey mart


    Автор: Гость (не зарегистрирован), дата: 28 декабря, 2023 - 09:41
    #permalink

    In the Suika game, there will be many ways for you to combine watermelon.


    Автор: clamb (не зарегистрирован), дата: 11 января, 2024 - 06:18
    #permalink

    A highly practical essay! This post has a wealth of information regarding the nytimes crossword that any person can use to launch a successful social media campaign.


    Автор: King338 (не зарегистрирован), дата: 15 января, 2024 - 12:07
    #permalink

    Автор: roxibe1683 (не зарегистрирован), дата: 16 февраля, 2024 - 08:39
    #permalink

    ShopRite is among the most renowned chains of supermarkets appreciates your feedback and is determined to improve the shopping experience.

    https://myshopriteexperiences.net/


    Отправить комментарий

    Приветствуются комментарии:
    • Полезные.
    • Дополняющие прочитанное.
    • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
      Для остальных вопросов и обсуждений есть форум.
    P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
    Содержание этого поля является приватным и не предназначено к показу.
    • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
    • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
    • Строки и параграфы переносятся автоматически.
    • Текстовые смайлы будут заменены на графические.

    Подробнее о форматировании

    CAPTCHA
    Антиспам
    1 + 0 =
    Введите результат. Например, для 1+3, введите 4.
     
    Текущий раздел
    Поиск по сайту
    Содержание

    Учебник javascript

    Основные элементы языка

    Сундучок с инструментами

    Интерфейсы

    Все об AJAX

    Оптимизация

    Разное

    Дерево всех статей

    Последние комментарии
    Последние темы на форуме
    Forum