原生JavaScript学习笔记之——DOM

全称:Document Object Model 文档对象模型
DOM会把文档看做是一个树状结构,同时定义了很多方法,来操作这个树
每一个标签都是一个节点(标签 即 元素 即 节点)
**不仅仅只有标签才算节点,也有文本节点
    text文本节点   =>   空格 换行 回车
已知一个节点,能找到任何一个节点
    oUl.nodeType  =>   object   

一、节点查找操作(类似CSS选择器)

1、元素.nodeType;   
        只读属性   当前节点类型
        DOM节点类型有多种  12种(W3C)定义
            元素.nodeType;
                1) 元素节点  <==>   1  
                2) 属性节点  <==>   2
                3) 文本节点  <==>   3
2、元素.Attributes;   
        只读属性        属性列表集合
3、元素.childNodes;  
        只读属性
        子节点列表集合(只包含以及子节点,不包含后辈孙级以下节点)
            标准下:   包含了文本和元素类型的节点,也会包换非法嵌套的子节点
            非标准下: 只包含元素类型节点,IE7下不会包含非法嵌套子节点
        oUl.childNodes.length
            是一个类数组对象,当只有一个子节点,其length = undefined,当子节点大于1时,其长度有数值
4、父级.children;  
        只读属性 子节点列表集合 
        只能获取儿子级节点,不能获取孙子级节点 
        标准下:   只包含元素类型节点
        非标准下: 只包含元素类型节点
5、 元素.firstChild;
        只读属性   元素下的第一个子节点(首节点)
        标准下:   firstChild会包含文本类型节点
        非标准下: 只包含元素节点
        元素.firstElementChild;  只读属性  标准浏览器下获取第一个元素类型节点(非标准下不识别会弹出undefined)
        兼容处理:
            var first=obj.firstElementChild || obj.firstChild;
        没有子级点bug
6、 元素.lastChild;  
        最后一个子节点(尾节点)    
        var last=obj.lastElementChild || obj.lastChild;
7、 兄弟节点
        下一个兄弟节点
            obj.nextSibling;    
                1)在chorme FF ie9+ 下获取的是元素节点+文本节点(text)
                2)在IE8  IE7 下只获取元素节点
            obj.nextElementSibling
                1)在chrome FF ie9+ 下只获取元素节点
                2)在IE8  IE7 下 undefined
                3)当没有下一个"元素"兄弟节点,会找文本节点,若没有文本节点则会是null(但不会报错)
            做兼容:
                var next=obj.nextElementSibling || obj.nextSibling;
        上一个兄弟节点
            var prev=obj.previousElementSibling || obj.previousSibling;     
8、元素.parentNode;  
        只读属性  当前节点的父级节点(亲生父亲)
        只能获取父级节点,不能获取爷爷级节点,且只有一个父级节点
9、元素.offsetParent;
        只读属性  距离当前元素最近的一个有定位属性的父节点(找干爹)
        a. 若没有定位父级,默认是body
        b. IE7以下,当前元素没有定位,offsetParent默认是body,若有定位则是html
        c. IE7以下,如果当前元素的某个父级触发了layout,那么offsetParent就会被指向到这个触发了layout特性的父节点上
            01、zoom:1;   触发layout
            02、document.getELementById('div1').currentStyle.haslayout;  =>  true:触发; false:未触发

二、节点增删改操作

1、document.createElement('标签名');
        动态创建元素
        document.createElement('li');
2、 把创建的元素添加到页面中
        1) 父级.appendChild(要添加的元素);
                方法  追加子元素(在后面添加)
                oUl.appendChild(oLi);
        2) 父级.insertBefore(添加的元素,添加的位置);
                方法  在指定元素前面插入一个新元素
        注意:
            1. 在IE下如果第二个参数的节点,不存在会报错
            2. 在其他浏览器下,如果第二个参数的节点不存在,则会以appendChild形式进行添加
    **appendChild insertBefore类似于剪切
3、 父级.removeChild(要删除的元素);
        删除元素
        oUl.removeChild(this.parentNode);
4、 父级.replaceChild(新节点,被替换的节点);
        替换元素
        document.replaceChild(oDiv,oP);
注意:
    appendChild , insertBefore , replaceChild , 都可以操作动态创建出来的节点,也可操作已有节点 
上移下移
    1)上移 添加到上一个的前面
    2)下移 添加到下一个的下一个的前面  

三、元素的属性操作(Attribute)

1、元素.getAttribute(属性名称);              方法   获取指定元素指定属性
    oTxt.getAttributes('value');
2、元素.setAttribute(属性名称,属性值);        方法   给指定元素指定属性设值
    oTxt.setAttribute('value','hello');
3、元素.removeAttribute(属性名称);            方法   移除指定元素指定属性
    oTxt.removeAttribute('value');
注意:
    1.用‘.’和‘[]’的形式无法操作元素的自定义属性,getAttribute可操作元素的自定义属性
    2.可以获取元素属性实际的值,IE7以下还是会返回资源的绝对路径

四、窗口的尺寸和大小

可视区尺寸
    document.documentElement.clientWidth;
    document.document.Element.clientHeight;
滚动距离
    document.body.scrollTop
    document.body.scrollLeft        
        Chrome 认为滚动条(scroll)是body的
        FF、IE都不好使

    document.documentElement.scrollTop;
    document.documentElement.scrollLeft;
    兼容
        var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
内容高度
    例:瀑布流中UL的高度
    document.body.scrollHeight;
文档高度:
    document.body.offsetHeight;

    document.documentElement.offsetHeight;    =>    IE为可视高
物体高度
    1) getStyle(obj,name);
        a. 高度    生效后的高度
        b. 类型  字符串
        c. display:none;     后依然是生效后的高度
    2) obj.offsetHeight;
        a.  高度   盒子模型的高度
        b.  类型   number
        c.  display:none;    后显示为0

五、元素的距离

1、元素.offsetLeft;     只读属性   当前元素到定位父级的距离(偏移值),到当前 元素.offsetParent的距离
   元素.offsetTop;
   没有定位父级
        offsetParent      =>     body/IE7  ->  html
        offsetLeft        =>     html(margin)
    有定位父级
        IE以下
            如果自己没定位: offsetTOP[Left]    ->   到body距离
            如果自己有定位: 那么就是到定位父级的距离
        其他
            到定位父级的距离
2、区别
    style.width:   样式宽(100px,有单位)
    clientWidth:   可视区宽(样式宽+padding   没单位)
    offsetWidth:   占位宽(样式宽+padding+border   可视区宽+边框)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容