《JavaScript高级程序设计 (第3版)》学习笔记36:chapter_10-1.3 Element类型

让学习“上瘾”,成为更好的自己!!!

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>element类型</title>
</head>

<body>
    <div id="myDiv" class="bdbd" my_special_attribute = 'nothing'  lang="en" dir="ltr"></div>

    <input type="button" id="btn" style="width: 100px; height:150px; background-color: red" value="点我"
        onclick="showInSomething();">

    <script>
        function showInSomething() {
            // alert('hello');
        }
    </script>

    <ul id="myList">
        <li>Item1</li>
        <li>Item2
            <ul>
                <li>21</li>
                <li>22</li>
            </ul>
        </li>
        <li>Item3</li>
    </ul> 
        <!-- 
            IE中,这里<ul>3个子节点,即3<li>元素
            其他浏览器,这里<ul>7个子节点,3<li>元素和4个文本节点

         -->

         <!-- IE和其他浏览器返回相同的<ul>元素的子节点 -->
         <!-- <ul id="myList"><li>Item1</li><li>Item2</li><li>Item3</li></ul>  -->


    <script>
        /*
    Element类型用于表现XML或HTML元素,提供对元素标签名、子节点以及特性的访问
     1, nodeType: 1
    2, nodeName: 元素的标签名
    3, nodeValue: null
    4, parentNode: Document or Element
    5, ownerDocument: null
    6, 子节点可以是一个Element,Text,processingInstruction,CDATASection,Comment or EntityReference
    // 得到这些子节点的过程是:
                先获取相应的元素节点(例如document.getElementById('myDiv')),然后div.childNotes[位置]得到相应的子节点
    
    访问元素的标签名: nodeName or tagName属性



    一,HTML元素



    二,取得特性

 

    三,设置特性



    四,attributes属性



    五,创建元素




    六,元素的子节点

    
    */
        var div = document.getElementById('myDiv');
        console.log(div);
        console.log(div.childNodes);
        console.log(div.hasChildNodes());
        console.log(div.ownerDocument);
        // console.log(div.nodeName);  // DIV
        // console.log(div.tagName);  // DIV
        // 在HTML中,标签名的输出始终是大写表示
        // 在XML中,标签名的输出始终与源代码中的保持一致
        // console.log(div.nodeName == div.tagName);

        // 不确定脚本会在HTML或XML中运行时如下书写【推荐书写!!】
        // if(div.tagName.toLowerCase() == 'div'){
        // alert('yes');
        // do something!

        // }

        // 一,HTML元素
        // 所有HTML元素都由HTMLElement类型(继承自Element类型)表示,或者其子类型来表示
        //  每个HTML元素都存在的标准特性:
        //     a, id
        //     b,title:有关元素的附加说明信息
        //     c,lang(很少使用)
        //     d,dir(很少使用)
        //     e,className

        // var div = document.getElementById('myDiv'); 
        // console.log(typeof div);
        // console.log(div instanceof HTMLDivElement);
        // console.log(div instanceof HTMLElement);
        // console.log(div.id);
        // console.log(div.lang);


        // div.className = 'bdbd';
        // div.dir = 'rtl';
        // console.log(div.className);


        // 每一种元素都有与之关联的类型,每一种类型都有与之相关的特性和方法




        // 二,取得特性:getAttribute()方法
        // 每个元素都有一或者多个特性,特性的用途为给出相应元素或其内容的附加信息
        //  操作特性:getAttribute(), setAttribute(), removeAttribute()

        // getAttribute()方法
        // var div = document.getElementById('myDiv'); 

        // console.log(div.getAttribute('id'));
        // console.log(div.getAttribute('lang'));
        // 传递给getAttribute()的特性名与实际的特性名相同
        // 如果给定的特性不存在,getAttribute()则返回null
        // console.log(div.getAttribute('class'));  // null
        // console.log(div.className);   // 空字符串

        // 通过getAttribute()也可以获得自定义特性的值
        // var value = div.getAttribute('my_special_attribute');
        // console.log(value);

        // 这里的特性名不区分大小写,另外,根据HTML5的规范,自定义特性应该加上"data-"前缀以便验证
        // console.log(div.getAttribute('CLASS'));

        // 任何元素的所有特性(公认的特性,非自定义特性),也都可以通过DOM元素本身的属性来访问。
        // console.log(div.id);
        // console.log(div.my_special_attribute);  // undefined(IE除外)


        // 两类特殊属性:
        // (1) style:  getAttribute()  --> CSS文本
        //             属性访问  --> 对象
        // var button = document.getElementById('btn');
        // console.log(button.getAttribute('style'));
        // console.log(button.style);



        // (2) 事件处理程序:getAttribute()  --> JavaScript代码字符串
        //                  属性访问  --> JavaScript函数
        // console.log(button.getAttribute('onclick'));
        // console.log(button.onclick);




        //  【总结】 一般使用对象的属性进行DOM操作
        //          在涉及自定义特性值时,才会使用getAttribute()


        // 三,设置特性:setAttribute()
        // (1)兩個參數:要设置的特征名和值
        // "存在则覆盖,空则创建"
            // var div = document.getElementById('myDiv');
            // div.setAttribute('class','changed');  // 存在则覆盖
            // div.setAttribute('title', 'fgfgf');  // 空则创建
            // div.setAttribute('another_define_attribute','baba');  // 操作自定义特性
            // 通过这个方法设置的特姓名都有被统一转换成小写形式

        // (2) 对象属性赋值也可使设置特性的值,但不可以操作自定义特性,即该属性不会成为元素的特性
            // div.className = 'thishi';
            // div.mycolor = 'red';
            // console.log(div.getAttribute('mycolor'));  // null
        
        // (3) removeAttribute()方法:彻底删除元素的特性(特性名及其特性值)
        //  不常用!!
        // 系列化DOM元素时,可以通过他来确切指定要包含哪些特性

        // div.removeAttribute('my_special_attribute');
        

        // 四,attributes属性
        // Element类型是使用attributes属性的唯一的一个DOM节点类型,attributes属性中包含一个NamedNodeMap,与NodeList类似,是一个“动态”的集合
        // 元素的每一个特性都由一个Attr节点表示,每个节点都保存在NamedNodeMap对象中
        // NamedNodeMap对象包含以下方法:
        //     a, getNamedItem(name):返回nodeName属性等于name的节点
        //     b, removeNamedItem(name):从列表中删除nodeName属性等于name的节点
        //     c, setNamedItem(node):向列表中添加节点,以节点的nodeName属性为索引
        //     d, item(pos): 返回位于数字pos位置处的节点

        // (1)attributes属性中包含一系列节点,每个节点的nodeName就是特性的名称,而节点的nodeValue就是特性的值
        // var div = document.getElementById('myDiv');
        // console.log(div.attributes);
        // console.log(div.attributes.length);

        // // 等价书写----------
        // console.log(div.attributes[1]);
        // console.log(div.attributes['class']);
        // var id = div.attributes.getNamedItem('id').value;  // myDiv
        // var id = div.attributes['id'].nodeValue;
        // console.log(id);

        // 设置特性的值

        // div.attributes['class'].nodeValue = '123123';

        // (2)removeNamedItem(name)
        // 调用removeNamedItem(name)与在元素调用removeAttribute()方法的效果相同
        // 唯一区别: removeNamedItem()返回表示被删除特性的Attr节点

        // var oldAttr = div.attributes.removeNamedItem('class');
        // var oldAttr = div.removeAttribute('class');  // undefined
        // console.log(oldAttr);

        // (3)setNamedItem(node):【不常见!】
        // var attr = document.createAttribute('align');
        // div.attributes.setNamedItem(attr);

        // 【注意】一般情况下,attributes属性加方法的这种用法比较少用

        // 遍历元素的特性 , attributes属性可以用的上!!   
        // 在需要将DOM结构序列化为XML or HTML字符串时,都是都会涉及遍历元素的特性 

            // 迭代元素的每一个特性,然后将他们构造成name="value", name="value"的字符串格式
            function ouputAttributes(element){
                var pairs = new Array(),
                    attrName,
                    attrValue,
                    i,
                    len;
                for(i=0,len=element.attributes.length;i < len;i++){
                    attrName = element.attributes[i].nodeName;
                    attrValue = element.attributes[i].nodeValue;
                    if(element.attributes[i].specified){ 
                         // specified为true, 则意味着要么在HTML中指定了相应的特性,要么通过setAttribute()的方法设置了这个特性
                         // 在IE中,所有未经过设置的特性的该属性值都为false,而在其他浏览器中不会为这类特性生成对应的特性节点
                        pairs.push(attrName+ '=\"' + attrValue + '\"');

                    }

                } 
                return pairs.join(' ');

            }


        // 五,创建元素
        // (1)document.createElement()方法可以创建新元素。


        // var div =  document.createElement('div');
        // console.log(div);

        // 在使用createElement()方法创建新元素的同时,也为新元素设置了ownerDocument属性
        // div.id = 'myNewDiv';
        // div.className = 'jfdf';

        // 以上操作并不会将该新建元素添加到文档树中

        // (2) 新元素添加到appendChild(),insertBefore(),replaceChild()方法
        // document.body.appendChild(div);


        // IE中,使用另一种方法createElement(),为这个方法传入完整的元素标签,也可以包含属性
        // var div = document.createElement('<div id=\"myNewDiv\"></div>');




        // 六,元素的子节点
        // 元素可以有任意数目的子节点和后代节点,因为元素可以是其他元素的子节点。

        // 通过某个特定的标签名取得子节点或者后代节点??  --> getElementByTagName()
        // var ul = document.getElementById('myList');
        // var items = ul.getElementsByTagName('li');
        // console.log(items);
        // 【注意】 这里的<ul>的后代中只包含直接子元素
        //          如果他包含更多层次的后代元素,则各个层次中的<li>元素也会返回







    </script>



</body>

</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值