# 获取元素

# - getElementById

作用:用于获取一个基于唯一的ID的元素。

用法:getelementById(id),接受一个你要获取的id参数,如果找到相应的元素则返回该元素,如果找不到就返回null。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        // 因为我们文档页面从上往下加载,所以将script写在这里,是无法获取DOM元素的
        const el = document.getElementById("one");
        console.log(el);// null
    </script>
</head>
<body>
    <div id="one">大家好,我叫刘德华!</div>
    <div id="three">大家好,我叫张学友!</div>
    <div id="three">大家好,我叫郭富城!</div>
</body>
<script>
    // 1- getElementById是document对象下的一个方法
    // 2- getElementById采用的是驼峰命名法
    // 3- 参数id对大小写敏感
    
    // 传入id
    console.log(document.getElementById("one"));

    // 返回值是元素对象
    console.log(typeof document.getElementById("one"));

    // 将返回的对象赋值给一个变量
    var el = document.getElementById("one");
    console.log(el);

    // 如果指定了ID,但是没有与其匹配的元素,那么返回null
    var el = document.getElementById("two");
    console.log(el);// null

    // 如果有两个ID(不规范),只会取第一个。
    var el = document.getElementById("three");
    console.log(el)

</script>
</html>

# - getElmentsByTagName

作用:用于获取对应name名的所有元素

用法:getElementsByName(tagname),接受一个你要获得name名的参数,返回含零或多个元素的NodeList(节点列表,与数组类似)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <h3>小说</h3>
    <ul>
        <li>武侠:《射雕英雄传》、《小李飞刀》</li>
        <li>言情:《还珠格格》、《霸道总裁爱上你》</li>
        <li>玄幻:《斗罗大陆》、《斗破苍穹》</li>
    </ul>
</div>
</body>
<script>
    // 返回的是对象的集合,以伪数组的形式存储的
    var lis = document.getElementsByTagName("li");
    console.log(lis);
    console.log(lis.length);// 3 长度

    // 遍历
    var lis = document.getElementsByTagName("li");
    for(var i=0;i<lis.length;i++){
        // 根据下标获得DOM元素
        console.log(lis[i])
    }

    // 可以通过Array.from方法将伪数组转为真数组
    var lis = document.getElementsByTagName("li");
    console.log(Array.from(lis));// 转换为真数组
    // forEach进行遍历
    Array.from(lis).forEach(function (item,index){
        console.log(item,index);
    })

    // 如果没有对应的元素,得到的是一个空的伪数组。
    var my = document.getElementsByTagName("span");
    console.log(my);// 得到的是一个空的伪数组

    // 可以通过下标获得伪数组的元素
    var h3 = document.getElementsByTagName("h3");
    console.log(h3);// 伪数组
    console.log(h3[0]);// 得到下标为1的元素

    // 获得的元素的顺序与文档中出现的标签顺序相同
    var my = document.getElementsByTagName("li");
    console.log(my[0]);
    console.log(my[1]);
    console.log(my[2]);

    // 可以通过传递*可以获得文档中的所有DOM元素
    var all = document.getElementsByTagName("*");
    console.log(all);
</script>
</html>

# - h5新增加获取元素方法

h5新增加获取元素方法不兼容IE678

# - getElementsByClassName

作用:用于获取对应class名的所有元素

用法:getElementsByClassName(classname),接受一个你要获得class名的参数,返回含零或多个元素的NodeList(节点列表,与数组类似)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>getElementsByClassName</title>
    <style>
        .bg {
            background: green;
        }

        .cl {
            color: red;
        }
    </style>
</head>
<body>
    <div>
        <p class="bg">医人买得医官札付者,冠带而坐于店中。</p>
        <p class="bg cl">过者骇曰:“此何店,而有官在内?”旁人答曰:“此医官之店(嘲衣冠之店)。”</p>
    </div>
    <script>
        // 1- getElementsByClassName是document对象下的方法,
        // 2- 该方法接收class名字,返回一个伪数组(如果说没有找到返回提一个空的伪数组。)
        console.log(document.getElementsByClassName("bg"));
        console.log(document.getElementsByClassName("bg cl"));
        console.log(document.getElementsByClassName("bg")[0]);
        console.log(document.getElementsByClassName("cl")[0]);
        console.log(document.getElementsByClassName("bg cl")[0]);
    </script>
</body>

</html>

# - getElementsByName

作用:用于获取对应name名的所有元素

用法:getElementsByName(name),接受一个你要获得name名的参数,返回含零或多个元素的NodeList(节点列表,与数组类似)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <p class="one" id="one" name="one">一医久无生意,忽有求药者至。</p>
    <p name="one">开箱取药,中多蛀虫。</div>
    <p name="two">人问“此是何物?”曰:“僵蚕。”又问:“僵蚕如何是活的?”答曰:“吃了我的药,怕他不活?”</p>
    <form action="">
        <input type="text" name="userName">
    </form>
</body>
<script>
    // name属性常用于表单元素。
    // console.log(document.getElementsByName("one"))
    // console.log(document.getElementsByName("two"))
    // console.log(document.getElementsByName("three"))
    // console.log(document.getElementsByName("userName"))

    // 注意:
    var oneName = document.getElementsByName("one")[0];
    var oneId = document.getElementById("one");
    var oneClass = document.getElementsByClassName("one")[0];
    var oneTag = document.getElementsByTagName("div")[0];
    console.log(oneName === oneId);// true
    console.log(oneName === oneClass);// true
    console.log(oneName === oneTag);// true
</script>
</html>

# - querySelector

作用:返回文档中匹配指定 CSS 选择器的一个元素

用法: document.querySelector(selectors)

注意:querySelector() 方法仅仅返回匹配指定选择器的第一个元素。如果你需要返回所有的元素,请使用 querySelectorAll() 方法替代。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        p{
            background:red;
        }
    </style>
</head>
<body>
    <div>
        <p id="one" class="my">我确定你就是那只匹着羊皮的狼</p>
        <p id="two">我爱你中国,我亲爱的母亲,我为你流泪,也为你自豪</p>
        <input type="text" name="userName">
    </div>
</body>
<script>
    // 1- 根据标签获取第一个p元素
    // const pEl = document.querySelector("p");
    // console.log(pEl)

    // 2- 根据ID获取第一个元素
    // console.log(document.querySelector("#one"));
    // console.log(document.querySelector("#two"));

    // 3- 根据className获取元素
    // console.log(document.querySelector(".my"))

    // 4- 根据属性获得元素
    // console.log(document.querySelector("input[name=userName]"));
    
    // 5-分步骤获得元素:
    // 5-1-根据ID获得元素
    // var twoEl = document.querySelector("div");
    // 5-2-在获得元素的基础上,再次使用querySelector
    // var twoLiEl = twoEl.querySelector("#two");
    // console.log(twoLiEl);
</script>
</html>

# - querySelectorAll

作用: querySelectorAll() 方法返回文档中匹配指定 CSS 选择器的所有元素

用法: querySelectorAll(selectors)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <ul id="one">
            <li>梨树1</li>
            <li>桃树1</li>
            <li>杏树1</li>
            <li>葡萄1</li>
        </ul>
        <ul id="two">
            <li>梨树2</li>
            <li>桃树2</li>
            <li>杏树2</li>
            <li>葡萄2</li>
        </ul>
    </div>
</body>
<script>    
    // 1- 获得所有的ul元素:返回的是一个伪数组(集合NodeList)
    // console.log(document.querySelectorAll("ul"));

    // 2- 获得所有的li
    // console.log(document.querySelectorAll("li"));

    // 3- 获取id为one元素下的所有li,并遍历
    // document.querySelectorAll("#one li").forEach(function (item){
    //     console.log(1,item);
    // })

    // 4- 可以获得长度
    // console.log(document.querySelectorAll("#two li").length);// 4

    // 不支持map:map is not a function
    // document.querySelectorAll("#two li").map(function (item){
    //     console.log(item)
    // })

    // 5- 可以将伪数组转为真数组
    var arr = Array.from(document.querySelectorAll("ul")).map(function (item,index){
        console.log(item);
        return index
    })
    console.log(arr);
</script>
</html>

# - 获取html、head以及body

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>getElementsByClassName</title>
</head>
<body>
    <script>
        // 获取html
        console.group("******************html*******************************");
        console.log(1,document.documentElement);
        console.log(2,document.getElementsByTagName("html")[0]);
        console.log(3,document.querySelector("html"));
        console.log(4,document.querySelectorAll("html")[0])
        console.groupEnd();

        // 获取head
        console.group("******************head*******************************");
        console.log(1,document.head);
        console.log(2,document.getElementsByTagName("head")[0]);
        console.log(3,document.querySelector("head"));
        console.log(4,document.querySelectorAll("head")[0])
        console.groupEnd();

        // 获取body
        console.group("*******************body***************************")
        console.log(document.body);
        console.log(document.getElementsByTagName("body")[0]);
        console.log(document.querySelector("body"));
        console.log(document.querySelectorAll("body")[0]);
        console.groupEnd();


    </script>
</body>

</html>

# - 获得表单数据的方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form name="myForm">
        <p>姓名:<input name="userName" type="text"></p>
    </form>
</body>
<script>
    // 获取表单当中的name为userName的元素
    // 1- 获取
    // console.log(document.myForm.userName);

    // 2- 先将myForm赋值给一个变量,然后通过该变量调用
    // var myForm = document.myForm;
    // console.log(myForm.userName);
</script>
</html>