Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > document.createElement()


Автор: Иль 15.6.2005, 15:06
Код

o=document.createElement('div')
delete o

Доброго времени. Не просветите, в каком контексте создается этот div? Где и как висит если в DOM дереве его не видно и продолжает ли он засорять память если я удалю последнюю переменную с ссылкой на него.
Что будет если я применю создание без присвоения ссылки переменной? Это будет бесполезный засор памяти? Этот див можно будет достать только через childNodes[i]?

Автор: Black 15.6.2005, 17:15
Цитата
Где и как висит если в DOM дереве его не видно


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

Код

o = document.createElement('div');
document.body.appendChild(o);

Автор: Иль 15.6.2005, 19:10
PHP-DIRECTOR, не издевайся наверное, да ... smile, а то сейчас в раздел PHP вопросы нелегкие пойду задовать smile.
Что до appendChild будет, вот в чем вопрос.

Автор: sergejzr 15.6.2005, 21:45
до appendChild ничего не будет. Он в памяти лежит и его innerHTML имеет строку "<div></div>"
Больше в принципе и нету ничего, всё остальное null.
И если ты удалишь переменную на него или не присвоишь никакой переменной, то после этого его уже никак и ничем не достанешь и сборщик мусора по идее его прибьёт, если он ему попадётся smile

Автор: Sardar 17.6.2005, 02:35
Цитата(sergej @ 15.6.2005, 20:45)
Он в памяти лежит и его innerHTML имеет строку "<div></div>"

Нет, это лежит в outerHTML, который есть фича ИЕ.

Иль, ты созда обьект, он схавал немного памяти, затем delete который в том синтаксисе что у тебя не должен ничего делать. Оператор delete удаляет свойства обьектов/массивов и (если не ошибаюсь) локальные переменные. Глобальные переменные им убить нельзя. В эффективном смысле delete что_то идеентично что_то = undefined.

Сборщик мусора убьёт обéкты на которые нет более ссылок.

Автор: Иль 17.6.2005, 10:39
Цитата(Sardar @ 17.6.2005, 02:35)
delete который в том синтаксисе что у тебя не должен ничего делать

Верно, не обращал на синтаксис внимания, а как позавчера логика полетела (хорошо дебаггер, а так бы труба!) - сразу мануалы читать smile
юзаю:
Код

o={}
o.n=document.createElement('div')
delete o.n


Цитата(Sardar @ 17.6.2005, 02:35)
Сборщик мусора убьёт обéкты на которые нет более ссылок.

теперь уяснил.

А вообще понял, что просто домовский метод .createElement создает в JS DOM`овский объект, и только такой объект мы можем вставить в дом-дерево.

Автор: Иль 17.6.2005, 12:50
Цитата(Sardar @ 17.6.2005, 02:35)
Глобальные переменные им убить нельзя

Заинтересовался. Закралось сомнение. Проверил, можно, но не всегда smile.
Яж почему глюк словил - до этого удалял глобальные переменные, а тут "догодался" удалить объект и получил false
Вот что выдают результаты тестинга:
Удалить глобальную/локальную переменную в которой лежит примитивное значение или массив можно.
Удалить переменную, ссылающуюся на объект или ноду нельзя.
Можно удалить свойство объекта или массива ссылающееся на объект или ноду. Соответственно потеряеются только данное свойство и ссылка. Сам объект возможно удалится сборщиком мусора только если на него нет больше ссылок.
Вот так получается, вот такая заморочка.
(текст выложен на правах опровержимой аксиомы smile)

Автор: Sardar 18.6.2005, 01:28
Цитата
А вообще понял, что просто домовский метод .createElement создает в JS DOM`овский объект, и только такой объект мы можем вставить в дом-дерево.

Если почитаешь спецификацию от W3C, то узнаешь что:
  • все ноды и вообще примочки создаються "фабричными"(pattern factory) методами
  • ноды/аттрибуты/примочки созданные в одном документе нельзя вставить в другой документ(например с одного фрейма в другой). Перенос большого контента(например подзагрузка чего либо в ифрейме) из документа в документ методами DOM это полная ...., начинаем радоваться священному innerHTML smile
    Забыл сказать про метод документа importNode, который в прямом смысле копирует ноду из документа в документ. Метод появился начиная с DOM 2
  • ноды и другие примочки являються "живыми" обьектами, т.е. изменив его, сразу получаем изменение во всём дереве. Например можно перенести ноду с одного узла в другой простым appendChild, вызывать removeChild на старом месте не нужно.
Вообще полезно читать стандарты smile

О глобальных переменных и delete. Согласно ECMA-262 переменные обьявленные в "глобальном контексте" ключевым словом var не могут быть удаленны:
Код
a=90;
var b=100;
alert("a: "+a+", b: "+b);
delete a;
delete b;
//проверяем a на undefined, иначе выскочит ошибка
alert("a: "+(typeof(a)!="undefined"? a:"undefined")+", b: "+b);

Автор: Иль 18.6.2005, 02:07
Цитата(Sardar @ 18.6.2005, 01:28)
переменные обьявленные в "глобальном контексте" ключевым словом var

Sardar, спсб. Тонко подмечено!
Цитата(Sardar @ 18.6.2005, 01:28)
ноды и другие примочки являються "живыми" обьектами, т.е. изменив его, сразу получаем изменение во всём дереве. Например можно перенести ноду с одного узла в другой простым appendChild, вызывать removeChild на старом месте не нужно.

жуть, что я этого не знал, хотя вроде и не применял (завтра все перепроверю и попеределаю)
Цитата(Sardar @ 18.6.2005, 01:28)
Вообще полезно читать стандарты

каюсь, как доделаю, возьмусь искать переводы. Можно и на Антглитском помучится - полезно будет
Добавлено @ 02:08
smile smile

Автор: Aliance 18.6.2005, 18:08
Цитата(Sardar @ 18.6.2005, 02:28)
можно перенести ноду с одного узла в другой простым appendChild, вызывать removeChild на старом месте не нужно.

Эм... да? Я такого тоже не знал или не понял что ты написал smile

Автор: Sardar 18.6.2005, 19:30
Цитата(Aliance @ 18.6.2005, 17:08)
Эм... да? Я такого тоже не знал или не понял что ты написал

Думаю это разьяснит:
Код
<div id="test">Text before, <span id="inr" style="color: red">sub text</span>, text after</div>
<div id="cont"></div>
<script type="text/javascript">
<!--
document.getElementById("cont").appendChild(document.getElementById("inr"));
//-->
</script>

Рефлекторным движением, по крайней мере у меня, хочеться вызвать removeChild на div:test smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)