УпÑавление памÑÑÑÑ Ð² ÑлÑÑае Ñ DOM ÑабоÑÐ°ÐµÑ Ð¿Ð¾ ÑÑÑи Ñак же, как и Ñ Ð¾Ð±ÑÑнÑми JavaScript-обÑекÑами. Ðока обÑÐµÐºÑ Ð´Ð¾ÑÑижим â он оÑÑаÑÑÑÑ Ð² памÑÑи.
Ðо еÑÑÑ Ð¸ оÑобенноÑÑи, поÑколÑÐºÑ DOM веÑÑ Ð¿ÐµÑеплеÑÑн ÑÑÑлками.
ÐÑимеÑ
ÐÐ»Ñ Ð¿ÑимеÑа ÑаÑÑмоÑÑим ÑледÑÑÑий HTML:
<html>
<body>
<div>
<ul>
<li>СпиÑок</li>
</ul>
СоÑед
</div>
</body>
</html>
Ðго DOM (Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ ÑолÑко оÑновнÑе ÑÑÑлки):
Удаление removeChild
ÐпеÑаÑÐ¸Ñ removeChild ÑазÑÑÐ²Ð°ÐµÑ Ð²Ñе ÑвÑзи Ð¼ÐµÐ¶Ð´Ñ ÑдалÑемÑм Ñзлом и его ÑодиÑелем.
ÐоÑÑомÑ, еÑли ÑдалиÑÑ DIV из BODY, Ñо вÑÑ Ð¿Ð¾Ð´Ð´ÐµÑево под DIV ÑÑÐ°Ð½ÐµÑ Ð½ÐµÐ´Ð¾ÑÑижимÑм и бÑÐ´ÐµÑ Ñдалено.
Ð ÑÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ, еÑли на какой-Ñо ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ð½ÑÑÑи ÑдалÑемого поддеÑева еÑÑÑ ÑÑÑлка?
ÐапÑимеÑ, UL ÑоÑ
ÑанÑн в пеÑеменнÑÑ list:
var list = document.getElementsByTagName('UL')[0];
document.body.removeChild(document.body.children[0]);
Ð ÑÑом ÑлÑÑае, Ñак как из ÑÑого UL можно по ÑÑÑлкам добÑаÑÑÑÑ Ð´Ð¾ лÑбого дÑÑгого меÑÑа DOM, Ñо полÑÑаеÑÑÑ, ÑÑо вÑе обÑекÑÑ Ð¿Ð¾-пÑÐµÐ¶Ð½ÐµÐ¼Ñ Ð´Ð¾ÑÑÐ¸Ð¶Ð¸Ð¼Ñ Ð¸ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÑÑаÑÑÑÑ Ð² памÑÑи:
То еÑÑÑ, DOM-обÑекÑÑ Ð¿Ñи иÑполÑзовании removeChild ÑабоÑаÑÑ Ð¿Ð¾ Ñой же логике, ÑÑо и обÑÑнÑе обÑекÑÑ.
Удаление ÑеÑез innerHTML
Ð Ð²Ð¾Ñ Ñдаление ÑеÑез оÑиÑÑÐºÑ elem.innerHTML="..." бÑаÑзеÑÑ Ð¸Ð½ÑеÑпÑеÑиÑÑÑÑ Ð¿Ð¾-ÑазномÑ.
Ðо идее, пÑи пÑиÑвоении elem.innerHTML=html из DOM Ð´Ð¾Ð»Ð¶Ð½Ñ ÑдалÑÑÑÑÑ Ð¿ÑедÑдÑÑие ÑÐ·Ð»Ñ Ð¸ добавлÑÑÑÑÑ Ð½Ð¾Ð²Ñе, из Ñказанного html. Ðо ÑÑандаÑÑ Ð½Ð¸Ñего не говоÑÐ¸Ñ Ð¾ Ñом, ÑÑо делаÑÑ Ñ Ñзлами поÑле ÑдалениÑ. Ð ÑÑÑ ÑазнÑе бÑаÑзеÑÑ Ð¸Ð¼ÐµÑÑ Ñазное мнение.
ÐоÑмоÑÑим, ÑÑо пÑоизойдÑÑ Ñ DOM-ÑÑÑÑкÑÑÑой пÑи оÑиÑÑке BODY, еÑли на какой-либо ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÐµÑÑÑ ÑÑÑлка.
var list = document.getElementsByTagName('UL')[0];
document.body.innerHTML = "";
ÐбÑаÑÐ°Ñ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ â ÑвÑÐ·Ñ ÑазÑÑваеÑÑÑ ÑолÑко Ð¼ÐµÐ¶Ð´Ñ DIV и BODY, Ñ.е. на веÑÑ
нем ÑÑовне, а list â ÑÑо пÑоизволÑнÑй ÑлеменÑ.
ЧÑÐ¾Ð±Ñ ÑвидеÑÑ, ÑÑо оÑÑанеÑÑÑ Ð² памÑÑи, а ÑÑо Ð½ÐµÑ â запÑÑÑим код:
<div>
<ul>
<li>СпиÑок</li>
</ul>
СоÑед
</div>
<script>
var list = document.getElementsByTagName('ul')[0];
document.body.innerHTML = ''; // Ñдалили DIV
alert( list.parentNode ); // Ñела ли ÑÑÑлка UL -> DIV ?
alert( list.nextSibling ); // Ð¶Ð¸Ð²Ñ Ð»Ð¸ ÑоÑеди UL ?
alert( list.children.length ); // Ð¶Ð¸Ð²Ñ Ð»Ð¸ поÑомки UL ?
</script>
Ðак ни ÑÑÑанно, бÑаÑзеÑÑ Ð²ÐµÐ´ÑÑ ÑÐµÐ±Ñ Ð¿Ð¾-ÑазномÑ:
parentNode |
nextSibling |
children.length |
|
|---|---|---|---|
| Chrome/Safari/Opera | null |
null |
1 |
| Firefox | Ñзел DOM | Ñзел DOM | 1 |
| IE 11- | null |
null |
0 |
ÐнÑми Ñловами, бÑаÑзеÑÑ Ð²ÐµÐ´ÑÑ ÑÐµÐ±Ñ Ñ ÑазлиÑной ÑÑепенÑÑ Ð°Ð³ÑеÑÑивноÑÑи по оÑноÑÐµÐ½Ð¸Ñ Ðº ÑлеменÑам.
- Firefox
- ÐлавнÑй паÑиÑиÑÑ. ÐÑÑавлÑÐµÑ Ð²ÑÑ, на ÑÑо еÑÑÑ ÑÑÑлки, Ñ.е. ÑлеменÑ, его ÑодиÑелÑ, ÑоÑедей и деÑей, в ÑоÑноÑÑи как пÑи
removeChild. - Chrome/Safari/Opera
- СÑиÑаÑÑ, ÑÑо Ñаз Ð¼Ñ Ð·Ð°Ð´Ð°Ð»Ð¸ ÑÑÑÐ»ÐºÑ Ð½Ð°
UL, Ñо нам нÑжно ÑолÑко ÑÑо поддеÑево, а оÑÑалÑнÑе ÑÐ·Ð»Ñ (ÑоÑедей, ÑодиÑелей) можно ÑдалиÑÑ. - Internet Explorer
- Ðак ни ÑÑÑанно, ÑамÑй агÑеÑÑивнÑй. УдалÑÐµÑ Ð²Ð¾Ð¾Ð±Ñе вÑÑ, кÑоме Ñзла, на коÑоÑÑй еÑÑÑ ÑÑÑлка. ÐÑо поведение одинаково Ð´Ð»Ñ Ð²ÑÐµÑ Ð²ÐµÑÑий IE.
Ðа иллÑÑÑÑаÑии ниже показано, какÑÑ ÑаÑÑÑ DOM оÑÑÐ°Ð²Ð¸Ñ ÐºÐ°Ð¶Ð´Ñй из бÑаÑзеÑов:

ÐÑого
ÐÑли на какой-Ñо DOM-Ñзел еÑÑÑ ÑÑÑлка, Ñо:
-
ÐÑи иÑполÑзовании
removeChildна ÑодиÑеле (или на ÑÑом Ñзле, не важно) вÑе ÑзлÑ, доÑÑижимÑе из данного, оÑÑаÑÑÑÑ Ð² памÑÑи.То еÑÑÑ, ÑакÑиÑеÑки, в памÑÑи Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑÑаÑÑÑÑ Ð±Ð¾Ð»ÑÑÐ°Ñ ÑаÑÑÑ Ð´ÐµÑева DOM. ÐÑо даÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÑÑÑÑ ÑÐ²Ð¾Ð±Ð¾Ð´Ñ Ð² коде, но Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к болÑÑим «ÑÑеÑкам памÑÑи» из-за ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ , коÑоÑÑе ÑеалÑно не нÑжнÑ.
-
ÐÑи Ñдалении ÑеÑез
innerHTMLбÑаÑзеÑÑ Ð²ÐµÐ´ÑÑ ÑÐµÐ±Ñ Ñ ÑазлиÑной ÑÑепенÑÑ Ð°Ð³ÑеÑÑивноÑÑи. ÐÑоÑÑ-бÑаÑзеÑно гаÑанÑиÑовано одно: Ñам Ñзел, на коÑоÑÑй еÑÑÑ ÑÑÑлка, оÑÑанеÑÑÑ Ð² памÑÑи.ÐоÑÑÐ¾Ð¼Ñ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ÑоÑедÑм и деÑÑм Ñзла, пÑедок коÑоÑого ÑдалÑн ÑеÑез пÑиÑвоение
innerHTML, нелÑзÑ.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)