JavaScript核心技术学习笔记(1)——DOM基础(1)

DOM基础(1)

一、DOM是什么

  Document object Model,文档对象模型,是由W3C定义的一个标准。简单来说,DOM里面有很多方法,我们通过它提供的方法来操作一个页面中的某个元素,例如改变这个元素的颜色、点击这个元素实现某些效果、直接把这个元素删除等。

  一句话总结:DOM操作,可以简单理解成“元素操作”

  为方便理解,我们可以这样思考:每一个元素就是一个节点,而每一个节点就是一个对象。也就是说,我们在操作元素时,其实就是把这个元素看成一个对象,然后使用这个对象的属性和方法来进行相关操作(这句话非常重要)

二、节点类型

  在JS中,节点也是分为很多类型的。DOM节点共有12中类型,不过常见的只有3种,分别是:

• 元素节点

• 属性节点

• 文本节点

  如下面这段代码:

<div id="wrapper">xff贼帅</div>

  元素节点是整段话,属性节点是id="wrapper",文本节点是xff贼帅。

三、获取元素

  获取元素,准确来说,就是获取元素节点(注意不是属性节点或文本节点)。对于一个页面,我们想要对某个元素进行操作,就必须通过一定的方式来获取该元素,只有获取到了才能对其进行相应的操作。

  在JS中,我们可以通过以下六种方式来获取指定元素:

• getElementById()

• getElementsByTagName()

• getElementsByClassName()

• querySelector()和querySelectorAll()

• getElementsByName()——仅限表单元素

• document.title和document.body

1. getElementById()

此方式为通过id来选中元素。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script>
        window.onload = function()
        {
            var oDiv = document.getElementById("div1");
            oDiv.style.color = "red";
        }
    </script>
</head>
<body>
    <div id="div1">xff贼帅</div>
</body>
</html>

注:我们都知道,浏览器是从上到下解析一个页面的。这个例子的JS代码在HTML代码的上面,如果没有window.onload,浏览器解析到document.getElementById(“div1”)就会报错,因为它不知道div1究竟是谁,所以我们必须使用window.onload,等到浏览器把整个页面解析完了再去解析window.onload内部的代码,这样就不会报错了。

2. getElementsByTagName()

此方式为通过标签名来选中元素。

  getElementsByTagName()例子:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script>
        window.onload = function()
        {
            document.body.innerHTML = "<input type='button' value='按钮'/><input type='button' value='按钮'/><input type='button' value='按钮'/>"
            var oBtn = document.getElementsByTagName("input");
            oBtn[0].onclick = function()
            {
                alert("表单元素共有:"+oBtn.length+"个");
            }
        }
    </script>
</head>
<body>
</body>
</html>         

  getElementById()例子:

 

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script>
        window.onload = function()
        {
            document.body.innerHTML = "<input id='btn' type='button' value='按钮'/><input type='button' value='按钮'/><input type='button' value='按钮'/>"
            var oBtn = document.getElementById("btn");
            oBtn.onclick = function()
            {
                alert("表单元素共有:"+oBtn.length+"个");
            }
        }
    </script>
</head>
<body>
</body>
</html>    

 

注:对比以上2.1.两种方式可以发现,1.无法实现操作动态创建的DOM元素,而2.可以操作动态创建的DOM元素。

着重看第一个例子我们可以发现,该方法获取的是一堆元素。准确地说,getElementsByTagName()获取的是一个“类数组”(也叫伪数组),也就是说这不是真正意义上的数组。

那么总结一下类数组的特点,能用的只有两点:1. length属性   2.下标形式 ,除此之外的如push()等方法是不能使用的。

至于方法3.4.5.6.,与1.2.类似,具体不多做赘述,有兴趣朋友可以自行查阅。

四、创建元素

在JS中,我们可以使用createElement()来创建一个元素节点,也可以使用createTextNode()来创建一个文本节点,然后可以将上述两种节点组装成“有文本内容的元素”。

这种操作又被称为“动态DOM操作”。所谓的“动态DOM”,指的是使用JS创建的元素,这个元素一开始是不存在于HTML中的

 

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script>
        window.onload = function()
        {
            var oDiv = document.getElementById("content");
            var oStrong = document.createElement("strong");
            var oTxt = document.createTextNode("xff贼帅");
            
            //将文本节点插入strong元素
            oStrong.appendchild(oTxt);
            //将strong元素插入div元素
            oDiv.appendchild(oStrong);
        }
    </script>
</head>
<body>
    <div id="content"></div>
</body>
</html>        

 

上面代码所实现的功能和下面这句html等价:

<div id="content"><strong>xff贼帅</strong></div>

那么有的小伙伴可能就会奇怪了,添加一个元素有必要这么麻烦吗?明明一句话就能解决的事情。

其实会有这个疑问,是因为小伙伴们还没有真正理解动态创建DOM的意义。在html中直接添加元素,是静态方法;而使用JS添加元素,是动态方法。例如我要做一个雪花飘落的效果,这些雪花是动态创建的img元素,雪花会不断生成、消失,也就是我要实现img元素的不断创建、删除。那我总不可能手动中html中添加删除元素吧,那么正确的方法就是使用动态DOM,使用JS来不断地创建和删除元素。

 

小总结

创建动态元素有以下三种方式:

第一种:

Document.write():

<body>
<input type="button" id="btn" value="生成元素" onclick="f1()"/>
<input type="text" value=""/>
<script>
        document.write("这是新添加的内容");
</script>
<div id="d">
    <script>
        document.write("<input type='text' value='123'/>");
    </script>
</div>
<script>
    function f1(){
        document.write("<input type='text' value='456'/>");
    }
    f1();
</script>

注:使用上述方法动态创建时会遇到一个问题——浏览器是从上到下进行加载的,这样会形成一个文档流,可等到执行完毕时,文档流会关闭,会将之前生成的元素全部冲刷掉,所以不建议使用。

第二种:

使用innerHTML创建元素:

<body>
<div id="d"></div>
<input type="button" value="生成" id="btn"/>
<script>
    var txt=document.getElementById("txt");
    var d=document.getElementById("d");
    var btn=document.getElementById("btn");
    //此方法字符串具有不可变性,频繁的操作字符串会造成内存的浪费。
//    btn.onclick=function(){
//        for(var i=0;i<10;i++){
//            d.innerHTML+="<input type='text'><br />";
//        }
//    }
    //因此我们可以先定义一个数组,将字符串存储在数组当中,最后在将数组转化为字符串。
    var arr=[];
    btn.onclick=function(){
        for(var i=0;i<10;i++){
            arr.push("<input type='text'><br />");
        }
        d.innerHTML=arr.join("");
    }
</script>
</body>

注:此方法会整个重写该元素内的所有HTML代码,也就是说之前写的都会被覆盖。所以推荐在元素内没有内容时使用。

第三种:

CreateElement():

<body>
<div id="d"></div>
<script>
    var d = document.getElementById("d"); //获取div的id
    var ul = document.createElement("ul");// 在这里创建一个ul标签
    d.appendChild(ul);         //将存储在内存中ul标签剪切到div之中 
    var li = document.createElement("li");//因为都是字符串,所以需要加""是创建出来的一对标签
    ul.appendChild(li);    //将存储在内存中的li标签剪切到ul之中
    li.innerHTML ="1231321";
    li.id = "abc";
    ul.removeChild(li);  //使用removeChild()可以删除ul里面的li标签
</script>
</body>

注:appendChild()会将新元素插入并成为指定父元素的最后一个子元素

最后说一下createElement()方法创建DOM元素的步骤:

• 创建元素节点:createElement()

• 创建文本节点:createTextNode()

• 将文本节点插入元素节点:appendChild()

• 将上一步组装好的元素插入已有元素中:appendChild()

 

posted @ 2018-09-21 20:58  staticxff  阅读(598)  评论(0)    收藏  举报