DOM对象(DHTML)与HTML DOM Event(事件)

DOM对象

什么是 DOM?

DOM 是 W3C(万维网联盟)的标准。DOM 定义了访问 HTML 和 XML 文档的标准:

"W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。"

DOM 节点

  • 整个文档是一个文档节点(document对象)
  • 每个 HTML 元素是元素节点(element 对象)
  • HTML 元素内的文本是文本节点(text对象)
  • 每个 HTML 属性是属性节点(attribute对象)
  • 注释是注释节点(comment对象)

画dom树是为了展示文档中各个对象之间的关系,用于对象的导航。

节点(自身)属性:

  • attributes - 节点(元素)的属性节点
  • nodeType – 节点类型
  • nodeValue – 节点值
  • nodeName – 节点名称
  • innerHTML - 节点(元素)的文本值

推荐导航属性:

  • parentElement              // 父节点标签元素
  • children                        // 所有子标签
  • firstElementChild          // 第一个子标签元素
  • lastElementChild           // 最后一个子标签元素
  • nextElementtSibling       // 下一个兄弟标签元素
  • previousElementSibling  // 上一个兄弟标签元素

节点树中的节点彼此拥有层级关系。



访问 HTML 元素(节点),访问 HTML 元素等同于访问节点,我们能够以不同的方式来访问 HTML 元素:

页面查找:

  • 通过使用 getElementById() 方法 
  • 通过使用 getElementsByTagName() 方法 
  • 通过使用 getElementsByClassName() 方法 
  • 通过使用 getElementsByName() 方法 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="div1">
    <div class="div2">i am div2</div>
    <div name="yuan">i am div2</div>
    <div id="div3">i am div2</div>
    <p>hello p</p>
</div>
<p>this is p</p>

<script>
   // ---------------查找节点-----------------------
   var div1=document.getElementById("div1");//只有用id来访问时获得一个节点,用其他方式会获取一个列表
   var div2=document.getElementsByClassName('div2');
   console.log(div2);    //HTMLCollection [div.div2]
    console.log(div2[0]);//<div class="div2">i am div2</div>

     // -------------节点属性--------------------
   console.log(div1.nodeName)//DIV
   console.log(div1.nodeValue)//null
   console.log(div1.nodeType)//1
   //innerHTML会将标签内的所以内容都输出包括标签,而innerText只会输出文本内容
   console.log(div1.innerHTML)// <div class="div2">i am div2</div>
                                //  <div name="yuan">i am div2</div>
                                //  <div id="div3">i am div2</div>
                                //  <p>hello p</p>
    console.log(div1.innerText)//i am div2
                                 //i am div2
                                 //i am div2
                                 //hello p
    console.log(div1.attributes)//NamedNodeMap {0: id, id: id, length: 1}


    // ----------------导航属性---------------------
    console.log(div1.parentElement.nodeName)//BODY
    console.log(div1.children)//HTMLCollection(4) [div.div2, div, div#div3, p, yuan: div, div3: div#div3]
    console.log(div1.children[0])//<div class="div2">i am div2</div>
    console.log(div1.nextElementSibling)//<p>this is p</p>


    // ----------------局部查找----------------------
    var div3=div1.getElementsByTagName('p')
    console.log(div3)//HTMLCollection [p]
    // 局部查找除了不能用id进行查找,其他方式都可以

</script>
</body>
</html>

HTML DOM Event(事件)

HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素时启动一段 JavaScript。下面是一个属性列表,这些属性可插入 HTML 标签来定义事件动作。

onclick        当用户点击某个对象时调用的事件句柄。
ondblclick     当用户双击某个对象时调用的事件句柄。

onfocus        元素获得焦点。               //练习:输入框
onblur         元素失去焦点。               应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证.
onchange       域的内容被改变。             应用场景:通常用于表单元素,当元素内容被改变时触发.(三级联动)

onkeydown      某个键盘按键被按下。          应用场景: 当用户在最后一个输入框按下回车按键时,表单提交.
onkeypress     某个键盘按键被按下并松开。
onkeyup        某个键盘按键被松开。
onload         一张页面或一幅图像完成加载。
onmousedown    鼠标按钮被按下。
onmousemove    鼠标被移动。
onmouseout     鼠标从某元素移开。
onmouseover    鼠标移到某元素之上。
onmouseleave   鼠标从元素离开

onselect      文本被选中。
onsubmit      确认按钮被点击。

onload:

onload 属性开发中 只给 body元素加.
这个属性的触发 标志着 页面内容被加载完成.

应用场景: 当有些事情我们希望页面加载完立刻执行,那么可以使用该事件属性.


onsubmit:

是当表单在提交时触发. 该属性也只能给form元素使用.应用场景: 在表单提交前验证用户输入是否正确.如果验证失败.在该方法中我们应该阻止表单的提交.


Event 对象

Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。
事件通常与函数结合使用,函数不会在事件发生前被执行!event对象在事件发生时系统已经创建好了,并且会在事件函数被调用时传给事件函数.我们获得仅仅需要接收一下即可.
比如onkeydown,我们想知道哪个键被按下了,需要问下event对象的属性,这里就时KeyCode;
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>

     // ----------------------------------onload------------------------------------------------

        function f()
        {
            var ele1=document.getElementsByTagName('div')[0]
            console.log(ele1.innerHTML)
        }//如果把js写在前面,因为按从上到下的顺序执行将找不到标签,所以要在body标签里写上onload=f()
        //或者也可以写成
        // window.onload=function()
        // {
        //     var ele1=document.getElementsByTagName('div')[0]
        //     console.log(ele1.innerHTML)
        // }

    </script>
</head>

<body onload="f()"><!--onload='f()'表示在加载完所以标签后执行f()函数-->

<div>this is div</div>


    <!-------------------------------onfocus---------------------------------------------->

<input type="text" id="id1" value="请输入用户名" onfocus="f1()" onblur="f2()"><!--绑定事件方式一-->

<script>
    var ele=document.getElementById('id1');
    function f1()
    {
        if(ele.value=='请输入用户名')
        {
            ele.value='';
        }
    }
    function f2()
    {
        if(!ele.value.trim())
        {
            ele.value='请输入用户名';
        }

    }
</script>

<!--------------------------------------绑定事件---------------------------------------->
<!--除了上面的绑定事件方式之外,还可以不再标签里绑定,而是与通过.事件绑定,实现js与css的解耦-->

<p>this is p</p>

<script>
    var ele2=document.getElementsByTagName('p')[0]
    ele2.onclick=function ()
    {
        alert(666)
    }

</script>


<!--------------------------------this-------------------------------------------------->

<div id="div1" onclick="func(this)">this is div1</div><!--当函数参数为this时,点击会自动定位到div标签-->
<script>
    function func(that) //必须要有除了this以外的任意形参
    {
        console.log(that)//that就是div标签
    }
</script>


<!------------------------------------onsubmit------------------------------------------->

<form action="" id="form1">
    <input type="text" name="username">
    <input type="submit" value="提交">
</form>
<!--将下面的js注释掉会发现在点击提交之后,浏览器会将数据直接提交给后端后,刷新页面-->

<script>
    var ele3=document.getElementById('form1')
    ele3.onsubmit=function(event)//event为特殊的形参,表示事件的状态
    {
        alert('输入格式错误')
        //如果不希望将数据上传至后端可以返回false,这样前段就不会上传数据也不会刷新页面,通常用于前段格式验证
        return false
        //同样可以用event的preventDefalt属性阻止上传数据与刷新
        // event.preventDefault()
    }
</script>


<!------------------------------------事件传播------------------------------------------->

<div id="abc_1" style="background: lightseagreen;width:300px;height:300px;">
    <div id="abc_2" style="background: aqua;width:200px;height:200px;"></div>
</div>
<script >
    document.getElementById("abc_1").onclick=function()
    {
        alert('111');
    }
    document.getElementById("abc_2").onclick=function(event)
    {
        alert('222');
        //如果注释掉会发现点击里面的小方块,外面的alert也会被触发,这就是传播
        event.stopPropagation(); //阻止事件向外层div传播.
    }
</script>
</body>
</html>

应用

遮罩

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .div1{
            background: white;
        }
        .div2{
            background: #b4b4b4;
            opacity: 0.5;
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
        }
        .div3{
            position: absolute;
            width: 300px;
            height: 150px;
            margin-top: 15%;
            margin-left: 40%;
            background: aqua;
        }
        .hide{
            display: none;
        }
    </style>
</head>
<body>
<div class="div1">this is content
    <button onclick="show()">show</button></div>
<div class="div2 hide"></div>
<div class="div3 hide"><button onclick="hide()">hide</button></div>

<script>
    var ele1=document.getElementsByClassName('div2')[0];
    var ele2=document.getElementsByClassName('div3')[0];
    function show()
    {
        ele1.classList.remove('hide')
        ele2.classList.remove('hide')
    }
    function hide()
    {
        ele1.classList.add('hide')
        ele2.classList.add('hide')
    }
</script>
</body>
</html>
正反选
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table border="1px" cellpadding="15px">
    <tr>
        <td><input type="checkbox"></td>
        <td>111</td>
        <td>111</td>
        <td>111</td>
    </tr>
        <tr>
        <td><input type="checkbox"></td>
        <td>222</td>
        <td>222</td>
        <td>222</td>
    </tr>
        <tr>
        <td><input type="checkbox"></td>
        <td>333</td>
        <td>333</td>
        <td>333</td>
    </tr>
        <tr>
        <td colspan="4" style="text-align:center">
            <button onclick="selectall()">全选</button>
            <button onclick="cancelall()">取消</button>
            <button onclick="reverse()">反选</button>
        </td>
    </tr>
</table>
<script>

    var eles=document.getElementsByTagName('input');

    function selectall() {
        for(var i=0;i<eles.length;i++)
        {
            eles[i].checked='checked'
        }

    }

    function cancelall()
    {
     for (var i=0;i<eles.length;i++)
     {
         eles[i].checked=false;
     }
    }

    function reverse()
    {
     for(var i=0;i<eles.length;i++)
     {
         eles[i].checked=!eles[i].checked;
     }
    }
</script>
</body>
</html>
二级联动
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<select id="province">
    <option>请输入省份</option>
</select>
<select id="city">
    <option>请输入城市</option>
</select>
<script>

    data={湖北:['武汉','孝感','黄冈'],河南:['郑州','洛阳','开封'],福建:['福州','厦门','泉州']};
    //javascript中字典关键字可以直接写,不用字符串

    // console.log(typeof data);//类型为Object
    // console.log(data);
    // console.log(data.湖北[0]);//通过data.关键字或者data[关键字]都可以获得相应值


    var ele_pro=document.getElementById('province');
    var ele_city=document.getElementById('city');

    //添加省份
    for(var i in data)//i值就是关键字
    {
        // console.log(i)
        var ele_p=document.createElement('option');
        ele_p.innerHTML=i;
        ele_pro.appendChild(ele_p);
    }

    //为省份select绑定onchange事件,当select发生改变时触发函数
    ele_pro.onchange=function()
    {
        ele_city.options.length=1;//在添加城市之前去除之前省份的城市option

        var ele=ele_pro.getElementsByTagName('option');
        for(var i=0;i<ele.length;i++)
        {
         if(ele[i].selected)//选中的option的selected为true
         {
             for(var j in data[ele[i].innerHTML])
             {
                 var ele_c=document.createElement('option');
                 ele_c.innerHTML=data[ele[i].innerHTML][j];
                 ele_city.appendChild(ele_c);
             }
         }
        }
    }

    //下面是更简便的写法

    // ele_pro.onchange=function ()
    // {
    //     console.log(this.selectedIndex)//this会定位到ele_Pro标签,.selectedIndex是选中的标签的索引
    //     console.log(this.options[this.selectedIndex]);
    //
    //     ele_city.options.length=1;
    //
    //     for(var i=0;i<data[this.options[this.selectedIndex].innerHTML].length;i++)
    //     {
    //         var ele=document.createElement('option');
    //         ele.innerHTML=data[this.options[this.selectedIndex].innerHTML][i];
    //         ele_city.appendChild(ele);
    //     }
    // }

</script>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/henry_lv/article/details/80237669