JS章节③ (上) DOM应用

1.DOM基础

  • 什么是DOM :
    document ,节点! 其实说的都是一个东西, CSS时管叫标签, JS时管叫元素,DOM时,管叫节点;
  • 浏览器支持情况
    IE:10% Chrome:60% FF:99% 支持
  • DOM节点
    childNodes:子节点
    nodeType:节点的类型
  • nodeType == 3 -> 文本节点
  • nodeType == 1 -> 元素节点
childNodes 和 nodeType配合使用
<head>
    <meta charset="UTF-8">
    <title>01-DOM基础</title>
    <script>
        window.onload = function () {
            //        ul的子节点为li
            var oUl = document.getElementById('ul1');
            for(var i=0;i<oUl.childNodes.length;i++){
                //由于在不同的浏览器下,获取到的oUl.childNodes是不一样的;IE6-8会将文本节点也算进去;
                //故若想给元素节点修改样式,可以通过 oUl.childNodes[i].nodeType == 1 来获取元素节点,并修改样式;
                //nodeType==3   ->  文本节点
                //nodeType==1   ->  元素节点

                //给所有的li设置背景颜色
                if(oUl.childNodes[i].nodeType == 1){
                    oUl.childNodes[i].style.background = 'red';
                }
            }
        }
    </script>
</head>
<body>

<ul id="ul1">
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
</ul>
abcdefg //文本节点
<span>abcdefg</span> //元素节点
</body>
</html>
  • 获取子节点
    children:他只包括元素,不包含文本,兼容所有浏览器
    故上面的例子可以这样写,简单粗暴!!!
for (var i=0;i<oUl.children.length;i++){
     oUl.children[i].style.background = 'red';
}

parentNode:父节点
例子:点击链接,隐藏整个li
parentNode示例:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>02-parentNode</title>
    <script>
        window.onload = function () {
            var aA = document.getElementsByTagName('a');
            for(var i=0;i<aA.length;i++){
                aA[i].onclick = function () {
                    this.parentNode.style.display = 'none';
                }
            }
        }
    </script>
</head>
<body>
<ul>
    <li>11111<a href="javaScript:;">隐藏</a></li>
    <li>22222<a href="javaScript:;">隐藏</a></li>
    <li>33333<a href="javaScript:;">隐藏</a></li>
    <li>44444<a href="javaScript:;">隐藏</a></li>
</ul>
</body>
</html>
parentNode应用
  • offsetParent
    例子:获取元素在页面上的实际位置
    主要用作定位时,获取元素的实际父节点.
示例一:给第二个div2设置绝对定位,给div2的父节点div1什么也不设置,那么div2的offsetParentbody.
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>offsetParent</title>
    <style>
        #div1{width: 200px;height: 200px;background: #ccc;margin-left: 100px;}
        #div2{width: 100px;height: 100px;background: red;position: absolute;left: 10px;}
    </style>
    <script>
        window.onload = function () {
            oDiv2 = document.getElementById('div2');
            alert(oDiv2.offsetParent); //结果:[object HTMLBodyElement] 父节点为body;
        }
    </script>
</head>
<body>
<div id="div1">
    <div id="div2"></div>
</div>
</body>
</html>
示例二:给第二个div2设置绝对定位,给div2的父节点div1设置相对定位,那么div2offsetParentdiv1.
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>offsetParent</title>
    <style>
        #div1{width: 200px;height: 200px;background: #ccc;margin-left: 100px;
            position: relative;}
        #div2{width: 100px;height: 100px;background: red;position: absolute;left: 10px;}
    </style>
    <script>
        window.onload = function () {
            oDiv2 = document.getElementById('div2');
            alert(oDiv2.offsetParent); //结果:[object HTMLDivElement] 父节点为div;
        }
    </script>
</head>
<body>
<div id="div1">
    <div id="div2"></div>
</div>
</body>
</html>

2.DOM节点(2)

  • 首尾子节点
  • 有兼容性问题
  • firstChild、firstElementChild
  • lastChild 、lastElementChild
    //IE6-8
    //oUl.firstChild.style.background='red';
    //高级浏览器
    //oUl.firstElementChild.style.background='red';

使用示例

<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
<script>
window.onload=function ()
{
    var oUl=document.getElementById('ul1');
    //IE6-8
    //oUl.firstChild.style.background='red';
    //高级浏览器
    //oUl.firstElementChild.style.background='red';

    //给第一个li设置红色背景:由于兼容问题,故需判断下
    if(oUl.firstElementChild)
    {
        oUl.firstElementChild.style.background='red';
    }
    else
    {
        oUl.firstChild.style.background='red';
    }
};
</script>
</head>
<body>
<ul id="ul1">
    <li>1</li>
    <li>2</li>
    <li>3</li>
</ul>
</body>
</html>
  • 兄弟节点 (使用同上)
  • 有兼容性问题
  • nextSibling、nextElementSibling
  • previousSibling、previousElementSibling

3.操纵元素属性

  • 元素属性操作
    第一种:oDiv.style.display='block';
    第二种:oDiv.style['display']='block';
    第三种:Dom方式: oDiv2.setAttribute('display','none');

  • DOM方式操作元素属性
    获取:getAttribute(名称)
    设置:setAttribute(名称, 值)
    删除:removeAttribute(名称)

4.用className选择元素

  • 如何用className选择元素
  • 选出所有元素
  • 通过className条件筛选
    初级用法
<html>
<head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <script>
        window.onload=function ()
        {
            var oUl=document.getElementById('ul1');
            var aLi=oUl.getElementsByTagName('li');
            for(var i=0;i<aLi.length;i++)
            {
                if(aLi[i].className=='box')
                {
                    aLi[i].style.background='red';
                }
            }
        };
    </script>
</head>
<body>
<ul id="ul1">
    <li class="box"></li>
    <li class="box"></li>
    <li></li>
    <li></li>
    <li></li>
    <li class="box"></li>
    <li></li>
</ul>
</body>
</html>
  • 封装成函数
    高级用法
    <script>
         //封装成函数
        function getByClass(oParent, sClass)
        {
            var aResult=[];
            var aEle=oParent.getElementsByTagName('*');//*通配符,获取oParent下面所有的节点

            for(var i=0;i<aEle.length;i++)
            {
                if(aEle[i].className==sClass)
                {
                    aResult.push(aEle[i]);
                }
            }
            return aResult;
        }
        window.onload=function ()
        {
            var oUl=document.getElementById('ul1');
            var aBox=getByClass(oUl, 'box');

            for(var i=0;i<aBox.length;i++)
            {
                aBox[i].style.background='red';
            }
        };
    </script>
    <body>
       <ul id="ul1">
          <li class="box"></li>
          <li class="box"></li>
          <li></li>
          <li></li>
          <li></li>
         <li class="box"></li>
         <li></li>
       </ul>
</body>

5.创建、插入和删除元素

  • 创建DOM元素
    createElement(标签名) 创建一个节点 appendChild(节点) 追加一个节点
注意:appendChild(节点) 有两个作用:

(一)如果这个元素是通过createElement(标签名)创建出来的,那么它可以直接添加到新的父级;
(二).如果这个元素有父级, 那么1.先把元素从原有父级上删除;2.再添加到新的父级.

例子:为ul插入li

<html>
<head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <script>
        window.onload=function ()
        {
            var oBtn=document.getElementById('btn1');
            var oUl=document.getElementById('ul1');
            var oTxt=document.getElementById('txt1');
            oBtn.onclick=function ()
            {
                //创建节点
                var oLi=document.createElement('li');
                oLi.innerHTML=oTxt.value;
                //添加节点 父级.appendChild(子节点);
                oUl.appendChild(oLi);
            };
        };
    </script>
</head>
<body>
<input id="txt1" type="text"/>
<input id="btn1" type="button" value="创建li"/>
<ul id="ul1">
</ul>
</body>
</html>
创建DOM元素,并添加
  • 插入元素
    insertBefore(节点, 原有节点) 在已有元素前插入 例子:倒序插入li
<html>
<head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <script>
        window.onload=function ()
        {
            var oBtn=document.getElementById('btn1');
            var oUl=document.getElementById('ul1');
            var oTxt=document.getElementById('txt1');
            oBtn.onclick=function ()
            {
                var oLi=document.createElement('li');
                var aLi=oUl.getElementsByTagName('li');
                oLi.innerHTML=oTxt.value;

                if(aLi.length>0)
                {//当aLi 中有元素时,直接插入到最上面
                    oUl.insertBefore(oLi, aLi[0]);
                }
                else
                {//当aLi 中没有元素时,先添加一个
                    oUl.appendChild(oLi);
                }
            };
        };
    </script>
</head>
<body>
<input id="txt1" type="text"/>
<input id="btn1" type="button" value="创建li"/>
<ul id="ul1">
</ul>
</body>
</html>
插入DOM:一直插入到第一个位置
  • 删除DOM元素
    removeChild(节点) 删除一个节点 例子:删除li
<html>
<head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <script>
        window.onload=function ()
        {
            var aA=document.getElementsByTagName('a');
            var oUl=document.getElementById('ul1');
            for(var i=0;i<aA.length;i++)
            {
                aA[i].onclick=function ()
                {
                     //a标签的父节点是li
                    oUl.removeChild(this.parentNode);
                };
            }
        };
    </script>
</head>
<body>
<ul id="ul1">
    <li>asfasd <a href="javascript:;">删除</a></li>
    <li>5645 <a href="javascript:;">删除</a></li>
    <li>ghdfjgj <a href="javascript:;">删除</a></li>
    <li>mvbnmvnb <a href="javascript:;">删除</a></li>
</ul>
</body>
</html>
删除DOM元素

6.文档碎片

使用文档碎片在某些情况下可以提高页面效率。
javascript操作dom是一个很耗性能的过程,在某些情况下,不得不进行dom循环操作,我们每次对dom的操作都会触发"重排",这严重影响到能耗,一般通常采取的做法是尽可能的减少dom操作来减少"重排"。
面对循环操作dom的过程,我们选择使用文档碎片(creatDocumentFragment),将需要添加到dom中的内容一次性添加到文档碎片中,然后将文档碎片添加到dom树,这样就可以有效的减少操作dom的次数。

  • 文档碎片可以提高DOM操作性能(理论上)
  • 文档碎片原理
  • document.createDocumentFragment()
<html>
<head>
    <meta charset="utf-8">
    <title>无标题文档</title>
    <script>
        window.onload=function ()
        {
            //在IE6-8等低版本浏览器上,可以提高下性能;在高级浏览器上提高性能不大,有时候还会降低性能
            var oUl=document.getElementById('ul1');
            //1.创建文档碎片
            var oFrag=document.createDocumentFragment();
            for(var i=0;i<10000;i++)
            {
                var oLi=document.createElement('li');
                //2.给文档碎片添加元素
                oFrag.appendChild(oLi);
            }
            //3.把文档碎片添加给ul
            oUl.appendChild(oFrag);
        };
    </script>
</head>
<body>
<ul id="ul1"></ul>
</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • DOM 变化 如何确认浏览器是否支持 DOM 2 和 DOM 3 新增的模块:var supportsDOM2Co...
    云之外阅读 463评论 0 0
  • 我们首先要明白,我们给页面添加效果用到的js到底是什么?js其实包含三部分:dom 文档对象模型 bom 浏览...
    一直以来都很好阅读 792评论 0 0
  • 一、JS前言 (1)认识JS 也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HT...
    凛0_0阅读 2,752评论 0 8
  • 1. 什么是DOM 文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定...
    hanyuntao阅读 1,249评论 0 4
  • 最近听到一首歌曲《笑忘书》没有蜡烛,就不用勉强庆祝,没想到答案,就不用寻找题目,没有退路,那我也不要散步,没人去仰...
    胡闹闹的Angel阅读 260评论 0 1