Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как "достать" все объекты документа (https://javascript.ru/forum/misc/32338-kak-dostat-vse-obekty-dokumenta.html)

macdack 12.10.2012 09:54

как "достать" все объекты документа
 
все элементы хтмл-документа можно создавать яваскриптом
а как сохранить все элементы-узлы объекта document со всеми ид классами и тд
например для повторного создания всех этих узлов

Maxmaxmахimus 12.10.2012 11:21

element.cloneNode()

macdack 12.10.2012 11:26

я имел в виду не копирование и вставку
а экспорт например в json всех хэлементов dom
и импорта из json для воссоздания dom

dmitriymar 12.10.2012 11:40

Не выйдет так просто -после перекидки объект -ясон-объект , объект уже не будет иметь тип htmlElement. Нужно писать парсер элемент-ясон-элемент. Можно обойтись без парсера элемент-ясон конечно а сделать через стандартный перевод в ясон.

Maxmaxmахimus 12.10.2012 11:44

парсер чтобы сохранял нужные важные для тебя параметры элемента и записывал ил в ясон(ну и транскрипция) , и наоборот.
ну еще как вариант похранить

element.innerHTML сроку))
но не факт что сохранятся и обработчики

bes 12.10.2012 11:59

сохранить во фрагменте, потом вставить
<head>
<script>
window.onload = function () {

	function createTree(el, par) {
		var ul = document.createElement('ul');
		par.appendChild(ul);
		var childs = el.children;
		var len = childs.length;
		for (var i = 0; i < len; i++) {
			var li = document.createElement('li');
			li.innerHTML = childs[i].tagName; 
			ul.appendChild(li);
			createTree(childs[i], ul);
		}
	}
	
	var frag = document.createDocumentFragment();
	createTree(document.body, frag);
	document.body.appendChild(frag);
}
</script>
</head>
<body>
<div>
	<div>
		<span>span</span>
		<button>button1</button>
		<input>
	</div>
	<div>
	<form>
		<input>
		<input>
		<span>span2</span>
		<button>button2</button>
	</form>
	</div>
</div>
<div>
	<div>
		<span>span</span>
		<button>button1</button>
		<input>
	</div>
	<div>
	<form>
		<input>
		<input>
		<span>span2</span>
		<button>button2</button>
	</form>
	</div>
</div>
</body>

macdack 12.10.2012 12:09

мужики, вопрос концептуальный - все узлы DOM это элементы объекта document

это обычный объект со свойствами
можно добавлять эти свойства как в обычный объект JS

соответственно должен быть простой способ сохранения этого объекта со всеми его свойствами, например сохраниения на клиенте или в БД на сервере - самое логичное конечно же JSON причем без всяких конвертаций же

dmitriymar 12.10.2012 12:39

Цитата:

Сообщение от macdack
это обычный объект со свойствами

да вот болт
var div=document.createElement('div');
alert( div);
div=JSON.parse(JSON.stringify(div));
alert( div);
var a={};
alert(a);

что не понятного ?самый простой способ:
кинуть в ясон.
затем перевести назад.
создать узел(тип тега можно получить из свойств распарсеного)
переписать ему все свойства из из распарсеного, перечислением.
-но если необходим ещё и минимальный ясон ,то и для первого пункта нужен парсер

Maxmaxmахimus 12.10.2012 12:55

Вопрос, зачем вообще понадобились такие извращения?
Проблема стоит не в том как распарсить DOM а гораздо ранее на этапе когда такая потребность ВООБЩЕ ПОЯВИЛАСЬ у тебя

macdack 12.10.2012 14:37

это простите не извращения - это я грызу гранит и пытаюсь понять логику

повторюсь ибо ответы ваши не об том чо я спрашиваю -
правильно ли я понимаю что хтмл-документ это объекты DOM и следовательно объекты JS-программы
и возможно полностью прочитать все элементы объекта document в виде пар ключ-значение и сохранить эти данные, и обратно прочитать эти данные и воссоздать первоначальный документ

вопрос наверное к профессорам типа автора учебника этого сайта))

Aetae 12.10.2012 14:43

Все - нельзя, есть запретные, но почти все - можно.
Однако:
1. document - адски большой.
2. В document полно саморекурсивных ссылок(firstChild <-> parentNode итд)
3. document и child'ы - не просто объекты - это Node объекты, соответственно если в строку превратить с оговорками(см пункт 2) ещё можно, то обратно уже никак(ну точнее без извращений никак - оно того не стоит).

А так FireBug примерно это и делает при построении модели DOM.

У меня даже где-то валяется древняя наговнокоженная функция сериализации любых объектов.

Maxmaxmахimus 12.10.2012 14:44

Нет ты понимаешь не правильно, DOM это модель документа, которая через javascript доступка как API в виде обьекта document // то что находится в обьекте document это НЕ обычные обьекты javascript.
Элементы DOM просто ПРЕДСТАВЛЕНЫ в виде обьектов javascript и похожи на них, но на самом деле это API к DOM которая находится в движке браузера.

Я думаю Так понятнее?

macdack 12.10.2012 14:54

да, так более понятно спасибо

итак -
JS может полностью сформировать с нуля хтмл-документ любой сложности
при этом JS может использовать JSON-данные для создания узлов документа
соответственно "модель" документа может быть представлена в виде JS-объекта

Maxmaxmахimus 12.10.2012 14:55

да, ты можешь считать данные о DOM через этот API доступ к которому осуществляется через document / Превратить эти данные в любой удобный для тебя формат, а потом используя этот же API (обьект document) наполнить DOM этими данными.

macdack 12.10.2012 15:02

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

то есть можно же создавая или удаляя или перемещая с помощью JS узлы, писать все эти изменения в "Json-модель" хтмл-документа


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

Maxmaxmахimus 12.10.2012 15:06

var div  = document.createElement('div');
div.className = 'myClass';
div.id = 'myId';

// засунем созданный элемент (через api) в DOM
document.body.appendChild( div ); 

// БАБАХ API метод appendChild добавил в DOM элемент DIV




в jQuery напрмиер так

$('<div>', {className:'myClass', id: 'myId'}).appendTo( 'body' );


или еще проще

$( ' < div class="myClass" id="myId" > ' ).appendTo( 'body' );

Aetae 12.10.2012 15:20

Только чтоб заблуждений не возникло: jquery делает тоже самое, что в первом примере просто внутри себя, для удобства использования.

P.S. Некоторые шаблонизаторы построены на json, в котором содеждится описание нужных элементов.

Maxmaxmахimus 12.10.2012 15:27

кстати да, какая цель то у тебя вообще? ты хочешь придумать какой то формат чтобы присылать сервером данные о РАЗМЕТКЕ а яваскрипт бы наполнял ими DOM ??

macdack 12.10.2012 15:35

о возможном применении я уже написал
подробнее сказать нечего

какбе я грызу этот гранит и хочу глубоко понимать а непросто делать как все ))
ну и сразу же думаю о своем фреймворке

например мне неохота заморачиваться реляционными БД - мне достаточно плоских файлов на ПХП

dmitriymar 12.10.2012 16:00

Цитата:

Сообщение от macdack
правильно ли я понимаю что хтмл-документ это объекты DOM и следовательно объекты JS-программы

откуда такое предположение? dom это не объект языка и JS предоставляет API для доступа к DOM
не глянул что это было уже ранее.
Цитата:

Сообщение от macdack
какбе я грызу этот гранит и хочу глубоко понимать а непросто делать как все ))
ну и сразу же думаю о своем фреймворке

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

macdack 12.10.2012 16:34

хе хе ))
о базовых знаниях и речь

а уж шедевер ли - речь вобще не об этом, и надо уметь и не боятся выдумывать велисапеды
согласитесь лучше не просто делать как все а еще и в квантовой механике объектной модели разбираться ))

macdack 12.10.2012 16:39

товарищи, правильно ли я понимаю что для манипуляций узлами DOM лучше использовать JQuery

Maxmaxmахimus 12.10.2012 16:51

Цитата:

Сообщение от macdack
например мне неохота заморачиваться реляционными БД - мне достаточно плоских файлов на ПХП

о каких БД ты все время говоришь наркоман)?


Цитата:

Сообщение от macdack
товарищи, правильно ли я понимаю что для манипуляций узлами DOM лучше использовать JQuery

ну да, она удобнее всего и кроссбраузерная, там ребята постарались, сделали работу с неудобным API максимальной интуитивно понятной)) да и кода меньше получается если её юзать)

macdack 12.10.2012 16:52

Maxmaxmахimus , большое спасибо за ваши любезные ответы - пешите есчо

Maxmaxmахimus 12.10.2012 16:54

угу, так че за БД)?

macdack 12.10.2012 16:57

вопрос ваш неясен весьма
с удовольством отвечу когда пойму

про реляционные БД и плоские файлы вроде бы все знают

Maxmaxmахimus 12.10.2012 17:07

да но как это связанно с DOM и работой с ним через javascript?

bes 12.10.2012 18:12

Цитата:

Сообщение от Maxmaxmахimus
ну да, она удобнее всего и кроссбраузерная, там ребята постарались, сделали работу с неудобным API максимальной интуитивно понятной)) да и кода меньше получается если её юзать)

а учитывая высокую вероятность наличия её в кеше браузера (если подключать из внешних источников), вообще цены ей нет :yes:

macdack 12.10.2012 18:49

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 209680)
да но как это связанно с DOM и работой с ним через javascript?

ничего особенного я не подразумевал - только то что узлы документа можно создавать из json и хранить это json или пары ключ-значение в БД

Maxmaxmахimus 12.10.2012 23:05

храни разметку приложений в виде html файлов или шаблонов. а ДАННЫЕ храни в базе данных. нужно логически разделять данные от представления

macdack 12.10.2012 23:12

я хорошо понимаю принцип разделения mvc

но данные это сами хтмл-документы
я понимаю хтмл-документ как набор ключей-значений

плюс оформление (css)
плюс поведение (js)
- они могут быть общими для многих документов

melky 12.10.2012 23:23

Цитата:

Сообщение от macdack
но данные это сами хтмл-документы

а что, если я открою файрбаг, и в документ вставлю
Код:

DROP TABLE mytable --
или что-то похожее ?

надеюсь, Вы поняли, к чему я клоню.

macdack 12.10.2012 23:32

пардоньте, не понял ))

какбы это факт шо хтмл это структурированные данные

Maxmaxmахimus 13.10.2012 00:01

HTML это данные о разметке и структуре но не сами данные.
сами данные достаются из базы данных и записываются в html структуру.

Например есть разметка <div></div> она хранится в виде html шаблона.
А вот ТО ЧТО ТУДА ВСТАВИТСЯ <div>ОЛОЛО</div> это уже ДАННЫЕ и они хранятся в базе данных.

Это делается либо на стороне сервера либо на стороне клиента.

Цитата:

Сообщение от macdack
какбы это факт шо хтмл это структурированные данные

Если ты живешь в 90 годах в эпоху web 1.0 - то да.

macdack 13.10.2012 00:15

не готов спорить, и возможно вопрос философский (я о философии архитектуры программ)

то что сервер заполняет шаблон - это один из способов архитектурных
а если структура документов всегда разная? тогда шо? шаблоны хранить в бд?
то есть из бд доставать шаблон и доставать его наполнение?

изначально по смыслу хтмл это не шаблон, это документ с информацией


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

Gvozd 13.10.2012 00:47

macdack,
Если вы придумаете как сериализовать/десериализовать object из кода ниже, то вы будете на шаг ближе к полной сериализации/десериализации document
(function() {
var a = 1;
var b = 1;
window.object = {//объект который нужно сериализовать
    func: function(num) {
        return 1 === num ? a : b;
    }
};
})();

метод func после десериализации должен полностью сохранить свое поведение

Maxmaxmахimus 13.10.2012 02:37

Цитата:

Сообщение от macdack
изначально по смыслу хтмл это не шаблон, это документ с информацией

Изначально ты был в маме, но почему-то не залезаешь обратно.


Gvozd,
а и б как я понял это навешанные обработчики событий)?

macdack 13.10.2012 22:37

еще вопрос - когда скрипт меняет ДОМ добавляя удаляя элементы то меняется ли при этом хтмл документ?
и если да то сохраняя документ через меню браузера "сохранить как" сохранятся ли так все "правки" документа

Hoshinokoe 13.10.2012 23:02

macdack,

1) Да
2) Да

Очень легко проверить (выполни в консоли браузера):
document.getElementsByTagName('body')[0].innerHTML = "";

Затем, нажми "Сохранить как" :)

Maxmaxmахimus 13.10.2012 23:47

Вообще не существует ни какого HTML документа браузер партит код странички в DOM и забывает о существоании HTML документа)))


но при сохранении снова его генерит исходя из данных в DOM

П.С. Hoshinokoe, document.body.innedHTML


Часовой пояс GMT +3, время: 14:13.