DOM

一.关于DOM的事件操作

1.事件

  JS是以事件驱动为核心的一门语言

2.事件的三要素

  事件的三要素 : 事件源 , 事件 , 事件驱动程序.

  事件源 : 引发后续事件的html标签.

  事件 : js已经定义好了

  事件驱动程序 : 对样式和html的操作.也就是DOM.

   代码书写步骤 : 

    (1) 获取事件源 : document.getElementById("boy");

    (2) 绑定事件 : 事件源boy.事件onclick = function(){ 事件驱动程序 };

    (3) 书写事件驱动程序 : 关于DOM的操作

<body>
<div id="box1"></div>
<script type="text/javascript">
        //1.获取事件源
        var div = document.getElementById("box1");
        //2.绑定事件
        div.onclick = function(){
            //3.书写事件驱动程序
            alert("我是弹出的内容");
        }
</script>
</body>

常见的事件:

事件名 说明
onclick 鼠标单击
ondblclick 鼠标双击
onkeyup 按下并释放键盘的一个键时触发
onchange 文本内容或下拉菜单中的选项发生改变
infocus 获取焦点,表示文本框等获得鼠标光标
onblur 失去焦点,表示文本框等失去鼠标光标
onmouseover 鼠标悬停,即鼠标停留在图片等的上方
onmouseout 鼠标移出,即离开图片等所在的区域
onload 网页文档加载事件
onunload 关闭网页时
onsubmit 表单提交事件
onreset 重置表单时

3.获取事件源的方式(DOM节点的获取)

  获取事件源的常见方式:

var div1 = document.getElementById("box1");
                 //方式一:通过id获取单个标签
var arr1 = document.getElementsByTagName("div1");
                //方式二:通过 标签名 获得 标签数组,所以有s
var arr2 = document.getElementsByClassName("haha");
                //方式三:通过 类名 获得 标签数组,所以有s

 

4.绑定事件的方式

方式一 : 直接绑定匿名函数

<div id="box1" ></div>

<script type="text/javascript">
    var div1 = document.getElementById("box1");
    //绑定事件的第一种方式
    div1.onclick = function () {
        alert("我是弹出的内容");
    }
</script>

方式二 : 先单独定义函数,在绑定

<div id="box1" ></div>

<script type="text/javascript">
    var div1 = document.getElementById("box1");
    //绑定事件的第二种方式
    div1.onclick = fn;   //注意,这里是fn,不是fn()。fn()指的是返回值。
    //单独定义函数
    function fn() {
        alert("我是弹出的内容");
    }
</script>

 

方式三 : 行内绑定

<!--行内绑定-->
<div id="box1" onclick="fn()"></div>

<script type="text/javascript">

    function fn() {
        alert("我是弹出的内容");
    }

</script>

5.事件驱动程序

<style>
        #box {
            width: 100px;
            height: 100px;
            background-color: pink;
            cursor: pointer;
        }
    </style>
</head>

<body>

<div id="box" ></div>

<script type="text/javascript">
    var oDiv = document.getElementById("box");
    //点击鼠标时,原本粉色的div变大了,背景变红了
    oDiv.onclick = function () {
        oDiv.style.width = "200px";   //属性值要写引号
        oDiv.style.height = "200px";
        oDiv.style.backgroundColor = "red";   //属性名是backgroundColor,不是background-Color
    }
</script>

  1.在js里写属性值时 , 要用引号

  2.在js里写属性名时 , 是backgroundColor , 不是CSS里面的background-Color .记得所有的像css属性的text-*,line-*、backgroun-*等在js中都写成驼峰

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box{
            width: 200px;
            height: 200px;
            background-color: red;
        }
    </style>
</head>
<body>
    <div id="box" class="box"></div>
<!--     <div id="box2" class="box"></div> -->


    <script>
        
    //需求: 默认盒子是200*200 红色 点击盒子让盒子颜色变成绿色

    //1.获取事件源(标签)2.事件   3.事件驱动程序
    // 获取DOM的三种方式

    //获取事件源
    var oDiv = document.getElementById('box');
    console.log(oDiv);
    var oDiv2 = document.getElementsByClassName('box')[0];
    console.log(oDiv2);
    // 获取出来是伪数组
    var oDiv3 = document.getElementsByTagName('div')[0];
    console.log(oDiv3);


    // var oDiv4 = document.querySelector('.box');
    // console.log(oDiv4);

    var isRed = true;
    //2.事件
    oDiv.onclick = function() {
        

        if (isRed) {
            //3.驱动程序
            console.log(oDiv.style);
            oDiv.style.backgroundColor = 'green';
            isRed = false;

        }else{
                //3.驱动程序
            console.log(oDiv.style);
            oDiv.style.backgroundColor = 'red';
            isRed = true;
        }
        
    }
    </script>
    
</body>
</html>
时间三步走

6.onload事件

  当页面加载(文本和图片)完毕的时候 , 触发onload事件

<script type="text/javascript">
    window.onload = function () {
        console.log("小马哥");  //等页面加载完毕时,打印字符串
    }
</script>

  js的加载是和html同步加载的。因此,如果使用元素在定义元素之前,容易报错。这个时候,onload事件就能派上用场了,我们可以把使用元素的代码放在onload里,就能保证这段代码是最后执行。

  整个页面上所有元素加载完毕在执行js内容。所以,window.onload可以预防使用标签在定义标签之前。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script>
        
    //入口函数
    // 窗口加载   先是文档加载,图片是后加载
       console.log(window.onload);

       // 1.必须等待图片资源加载完成之后才执行js脚本代码 异步的(不等待) 同步
        window.onload = function() {
            console.log(document);
            console.log(document.documentElement);
            console.log(document.body);

        };
        console.log(1111);

        // 2.有事件覆盖
        // window.onload = function() {
        //     // console.log(111);
        // }
    </script>

</head>
<body>
    <div id="box"></div>
    <!-- 1. -->
    
</body>
</html>
DOM的使用

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        #box{
            width: 200px;
            height: 200px;
            background-color: red;
        }
        .active{
            display: none;
        }
    </style>
</head>
<body>
    <button id="btn">隐藏</button>
    <div id="box" class="app"></div>
    <img src="" alt="" id="myImg">
    <a href=""></a>
    <input type="text">
    <script>
        //1.样式属性  element.style.样式名 = 'xxx'
        //2.标签属性  id class title img中的src alt  a标签中href  input标签type name 

        // 1.获取事件源
        // 2.事件  onclick  onmouseover onmouseout
        // var oBtn = document.getElementById('btn');
        // var oDiv = document.getElementById('box');

        function $(id) {
            return document.getElementById(id);
        }

        /*
        var isShow = true;
        $('btn').onclick = function() {
            if (isShow) {
                $('box').style.display = 'none';
                isShow = false;    

                console.log(this);
                this.innerText = '显示';
            }else{
                $('box').style.display = 'block';
                isShow = true;    

                console.log(this);
                this.innerText = '隐藏';
            }            
        };
        */

        $('btn').onmouseover = function () {

            // 点语法  set方法和get方法

            // console.log($('box').className);
            
            // $('box').className += ' active';

            // $('box').title = '我的alex';
            $('myImg').src = './fd039245.jpg';
            $('myImg').title = '一个美女';
            $('myImg').alt = '大美女';
            $('myImg').className = 'active2';
            this.style.backgroundColor = 'red';

        }

        $('btn').onmouseout = function () {
            // 点语法  set方法和get方法

            // console.log($('box').className);
            
            // $('box').className += ' active';

            // $('box').title = '我的alex';
            // $('myImg').src = './fd039245.jpg';
            // $('myImg').title = '一个美女';
            // $('myImg').alt = '大美女';
            // $('myImg').className = 'active2';
            this.style.backgroundColor = 'green';

        }
    </script>
    
</body>
</html>
盒子的显示隐藏

京东顶部广告栏关闭

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            padding: 0;
            margin: 0;
        }
        .top-banner{
            /*position: relative;*/
            background-color: rgb(230, 15, 82);
        }
        .top-banner .w{
            width: 1190px;
            position: relative;
            margin: 0 auto;
        }
        .top-banner .banner{
            display: block;
            width: 100%;
            height: 80px;
            background: url('./close.jpg') no-repeat center 0;
        }
        .top-banner .close{
            position: absolute;
            right: 0;
            top:0;
            text-decoration: none;
            color: white;    
            width: 20px;
            height: 20px;
            line-height: 20px;
            text-align: center;    
        }
        .hide{
            display: none;
        }

    </style>
</head>
<body>
    <div class="top-banner" id="topBanner">
        <div class="w">
            <a href="#" class="banner"></a>
            <a href="#" class="close" id="closeBanner">x</a>
        </div>
    </div>
    <script type="text/javascript">
        // /需求:点击案例,隐藏盒子。
            //思路:点击a链接,让top-banner这个盒子隐藏起来(加隐藏类名)。

        window.onload  = function(){
            // /1.获取事件源和相关元素
            var closeBanner = document.getElementById('closeBanner');
            var topBanner = document.getElementById('topBanner');
            //2.绑定事件
            closeBanner.onclick = function(){
                //3.书写事件驱动程序
                        //类控制
                //topBanner.className += ' hide';//保留原类名,添加新类名
                //topBanner.className = 'hide';
                //替换旧类名
                topBanner.style.display = 'none';
            }
        }
    </script>

    
</body>
</html>
View Code

当鼠标悬停在img上时 , 更换为另外一张图片 ; 鼠标离开时 , 还原为本来的图片

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <script>
        //window.onload页面加载完毕以后再执行此代码
        window.onload = function () {
            //需求:鼠标放到img上,更换为另一张图片,也就是修改路径(src的值)。
            //步骤:
            //1.获取事件源
            //2.绑定事件
            //3.书写事件驱动程序

            //1.获取事件源
            var img = document.getElementById("box");
            //2.绑定事件(悬停事件:鼠标进入到事件源中立即出发事件)
            img.onmouseover = function () {
                //3.书写事件驱动程序(修改src)
                img.src = "image/jd2.png";
//                this.src = "image/jd2.png";
            }

            //1.获取事件源
            var img = document.getElementById("box");
            //2.绑定事件(悬停事件:鼠标进入到事件源中立即出发事件)
            img.onmouseout = function () {
                //3.书写事件驱动程序(修改src)
                img.src = "image/jd1.png";
            }
        }
    </script>
</head>
<body>

    <img id="box" src="image/jd1.png" style="cursor: pointer;border: 1px solid #ccc;"/>

</body>
</html>
View Code

二.DOM介绍

 1.DOM

  DOM:文档对象模型。DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构。目的其实就是为了能让js操作html元素而制定的一个规范。

  DOM就是由节点组成的.

2.解析过程

  HTML加载完毕,渲染引擎会在内存中把HTML文档,生成一个DOM树,getElementById是获取内中DOM上的元素节点。然后操作的时候修改的是该元素的属性

3.DOM树(一切都是节点)

  DOM的数据结构:

 在HTML当中 , 一切都是节点 

  元素节点 : HTML标签

  文本节点 : 标签中的文字(比如标签之间的空格 , 换行 )

  属性节点 : 标签的属性

整个html文档就是一个文档节点 . 所有的节点都是Object

4.DOM可以做的:

  找对象(元素节点)

  设置元素的属性值

  设置元素的样式

  动态创建和删除元素

  事件的触发响应 : 事件源  ,  事件  ,  事件的驱动程序

5.DOM节点的获取

  DOM节点的获取方式其实就是获取事件源的方式

  操作元素节点,必须首先找到该节点. 

三种方式可以获取DOM节点:

 var div1 = document.getElementById("box1");      //方式一:通过id获取单个标签
var arr1 = document.getElementsByTagName("div1"); //方式二:通过 标签名 获得 标签数组,所以有s var arr2 = document.getElementsByClassName("hehe"); //方式三:通过 类名 获得 标签数组,所以有s

特殊情况:数组中的值只有1个。即便如此,这一个值也是包在数组里的。这个值的获取方式如下:

  document.getElementsByTagName("div1")[0];    //取数组中的第一个元素

  document.getElementsByClassName("hehe")[0];  //取数组中的第一个元素

6.DOM 访问关系的获取

  DOM的节点并不是孤立的,因此可以通过DOM节点之间的相对关系对它们进行访问。

  节点的访问关系 , 是以属性的方式存在的

js中的父子兄访问关系:

  父节点  : parentNode

  兄弟节点 : nextSibling  ,  nextElementSibling  ,  previousSibling  ,  previousElementSibling

  子节点 : firstChild  ,  firstElementChild  ,  lastChild  ,  lastElementChild

  所有子节点 : childNodes  ,  children

7.获取父节点

  调用者就是节点。一个节点只有一个父节点,调用方式就是     节点.parentNode

  (1) nextSibling : 指的是下一个节点(包括标签、空文档和换行节点)

  (2) nextElementSibling  :  火狐、谷歌、IE9+版本:都指的是下一个元素节点(标签)。

总结:为了获取下一个元素节点,我们可以这样做:在IE678中用nextSibling,在火狐谷歌IE9+以后用nextElementSibling,于是,综合这两个属性,可以这样写:

下一个兄弟节点 = 节点.nextElementSibling || 节点.nextSibling

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div id="father">
        <div id="laoda"></div>
        <div id="laoer"></div>
    </div>
    <script>
        
        var oLaoda = document.getElementById('laoda');
        // console.log(oLaoda.nextSibling);
        // console.log(oLaoda.nextElementSibling);

        // 兼容性
        // var a  = oLaoda.nextElementSibling  || oLaoda.nextSibling;
        // console.log(a);

        console.log(document.getElementById('father').children);

        console.log(oLaoda.parentNode);
    </script>
</body>
</html>

8.获取单个的子节点

  a.第一个子节点 | 第一个子元素节点:

  (1)firstChild:

  (2)firstElementChild:都指的是第一个子元素节点(标签)。

 

总结:为了获取第一个子元素节点,我们可以这样做:在IE678中用firstChild,在火狐谷歌IE9+以后用firstElementChild,于是,综合这两个属性,可以这样写:

 第一个子元素节点 = 节点.firstElementChild || 节点.firstChild

  b、最后一个子节点 | 最后一个子元素节点:

  (1)lastChild:

  (2)lastElementChild:都指的是最后一个子元素节点(标签)。

总结:为了获取最后一个子元素节点,我们可以这样做:在IE678中用lastChild,在火狐谷歌IE9+以后用lastElementChild,于是,综合这两个属性,可以这样写:

 最后一个子元素节点 = 节点.lastElementChild || 节点.lastChild

9.获取所有的子节点

  (1)childNodes:标准属性。返回的是指定元素的子节点的集合(包括元素节点、所有属性、文本节点)。

   用法: 

子节点数组 = 父节点.childNodes;   //获取所有节点。

  (2)children:非标准属性。返回的是指定元素的子元素节点的集合。

  它只返回HTML节点 , 甚至不返回文本节点.

  用法: 

子节点数组 = 父节点.children;   //获取所有节点。用的最多。

三.DOM节点操作

节点的操作都是函数(方法)

1.创建节点

新的标签(元素节点) = document.createElement("标签名");

如果我们想创建一个li标签,或者是创建一个不存在的adbc标签,可以这样做:

<script type= "text/javascript">
    var a1 = document.createElement("li");  //创建一个li标签
    var a2 = document.createElement("adbc");  //创建一个不存在的标签
    console.log(a1);
    console.log(a2);
    console.log(typeof a1);
    console.log(typeof a2);
</script>

结果:

2.插入节点

  方式1:

 父节点.appendChild(新的子节点);

  解释:父节点的最后插入一个新的子节点。

  方式2:

父节点.insertBefore(新的子节点,作为参考的子节点);

解释:

  • 在参考节点前插入一个新的节点。
  • 如果参考节点为null,那么他将在父节点最后插入一个子节点。

3.删除节点

  格式:

  父节点.removeChild(子节点);

  解释:用父节点删除子节点。必须要指定是删除哪个子节点。

如果我想删除自己这个节点,可以这么做:

node1.parentNode.removeChild(node1);

4.复制节点

  格式:

 要复制的节点.cloneNode();       //括号里不带参数和带参数false,效果是一样的。

  要复制的节点.cloneNode(true);

括号里带不带参数,效果是不同的。解释如下:

  • 不带参数/带参数false:只复制节点本身,不复制子节点。

  • 带参数true:既复制节点本身,也复制其所有的子节点。

四.设置节点的属性

我们可以获取节点的属性值、设置节点的属性值、删除节点的属性。

1.获取节点的属性值

  方式1 : 

    元素节点.属性;
    元素节点[属性];
<body>
<img src="images/1.jpg" class="image-box" title="美女图片" alt="地铁一瞥" id="a1">

<script type="text/javascript">
    var myNode = document.getElementsByTagName("img")[0];

    console.log(myNode.src);
    console.log(myNode.className);    //注意,是className,不是class
    console.log(myNode.title);

    console.log("------------");

    console.log(myNode["src"]);
    console.log(myNode["className"]); //注意,是className,不是class
    console.log(myNode["title"]);
</script>
</body>

  方式2 : 

素节点.getAttribute("属性名称");

 

console.log(myNode.getAttribute("src"));
    console.log(myNode.getAttribute("class"));   //注意是class,不是className
    console.log(myNode.getAttribute("title"));

2.设置节点的属性值

  方式1 :

    myNode.src = "images/2.jpg"   //修改src的属性值
    myNode.className = "image2-box";  //修改class的name

  方式2 :

元素节点.setAttribute(属性名, 新的属性值);

 

    myNode.setAttribute("src","images/3.jpg");
    myNode.setAttribute("class","image3-box");
    myNode.setAttribute("id","你好");

3.删除节点的属性

  格式: 

元素节点.removeAttribute(属性名);

 

    myNode.removeAttribute("class");
    myNode.removeAttribute("id");

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box{
            width: 300px;
            height: 200px;
            background-color:red;

        }
    </style>
</head>
<body>
    <div class="box" id="wrap" style=""></div>
    <p>alex</p>
    <script>
        
        //1,获取事件源
        var oDiv = document.getElementById('wrap');

        //2.事件
        oDiv.onclick = function() {
            //3.事件驱动 业务

            console.log(oDiv.style);
            // oDiv.style.backgroundColor = 'green';

            oDiv.style.width = '400px';
            oDiv.style.float = 'left';
        }

    </script>
</body>
</html>
对样式的操作
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .box{
            width: 42px;
            height: 70px;
            background: url(./images/icon-slides.png) no-repeat -84px 0;
            /*background-position: -82px 0;*/
        }
        
    </style>
</head>
<body>
    <div class="box"></div>

    <img src="./images/购物车.png" width="100" alt="" id="shop">
    <script>
        
        /*
        var oDiv = document.getElementsByClassName('box')[0];

        oDiv.onmouseover = function() {
            this.style.backgroundPosition = '0 0';
        }
        oDiv.onmouseout = function() {
            this.style.backgroundPosition = '-84px 0';
        }
        */
        var isHover = true;

        document.getElementById('shop').onclick = function() {
            if (isHover) {
                this.src = './images/购物车-hover.png';

                this.className = 'app';
                this.alt = '哈哈哈';
                this.title = '哈哈哈';
                this.id = 'app';

                isHover = false;
            }else{
                this.src = './images/购物车.png';
                isHover = true;
            }
            // this.setAttribute(name: DOMString, value: DOMString)
            // console.log(this.getAttribute('src'));
            // console.log(this.src);

            // this.setAttribute('src', './images/购物车-hover.png');
        
        }

    </script>

</body>
</html>
对标签属性的操作
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .child{
            width: 200px;
            height: 200px;
            background-color: green;
        }
        .hidden{
            display: none;
        }
    </style>
</head>
<body>
    <button id="btn">隐藏</button>
    <div class="box">
        
        <div class="child" id="child"></div>

    </div>

    <!-- 1.样式属性 display:none|block

         2.通过控制标签属性className 对类型添加 移除

         3.DOM创建 销毁 创建销毁

     -->
     <script>
         
        var oChild = document.getElementById('child');
// 
        document.getElementById('btn').onclick  = function() {
            // oChild.style.display = 'none';

            // oChild.className +=' hidden';
            oChild.className = oChild.className + ' hidden';
            console.log(oChild.className);
        }
     </script>
    
</body>
</html>
控制元素显示隐藏的方式

 

posted @ 2018-09-26 16:47  Montant  阅读(141)  评论(0)    收藏  举报