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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> document.createElement(), Что, где, куда? 
:(
    Опции темы
Иль
Дата 15.6.2005, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

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

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


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Black
Дата 15.6.2005, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Web-Development
**


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

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



Цитата
Где и как висит если в DOM дереве его не видно


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

Код

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



--------------------
Могу все, но ничего не умею :-)
PM WWW   Вверх
Иль
Дата 15.6.2005, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Это сообщение отредактировал(а) Иль - 15.6.2005, 19:12


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
sergejzr
Дата 15.6.2005, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



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



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Sardar
Дата 17.6.2005, 02:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



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

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

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

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


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


Опытный
**


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

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



Цитата(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`овский объект, и только такой объект мы можем вставить в дом-дерево.


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Иль
Дата 17.6.2005, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Sardar
Дата 18.6.2005, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



Цитата
А вообще понял, что просто домовский метод .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);



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


Опытный
**


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

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



Цитата(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


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Aliance
Дата 18.6.2005, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


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

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



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

Эм... да? Я такого тоже не знал или не понял что ты написал smile
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 18.6.2005, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


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

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



Цитата(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


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


 




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


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

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