欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

3.4、JavaScript的DOM对象、DOM事件和JS事件对象event的属性和方法

程序员文章站 2022-05-07 20:11:38
...

DOM

通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素。

当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)

HTML DOM树
3.4、JavaScript的DOM对象、DOM事件和JS事件对象event的属性和方法

通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML。

  • JavaScript 能够改变页面中的所有 HTML 元素
  • JavaScript 能够改变页面中的所有 HTML 属性
  • JavaScript 能够改变页面中的所有 CSS 样式
  • JavaScript 能够对页面中的所有事件做出反应

Node节点

根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:

  • 整个文档是一个文档节点
  • 每个 HTML 元素是元素节点
  • HTML 元素内的文本是文本节点
  • 每个 HTML 属性是属性节点
  • 注释是注释节点

我们常用父(parent)、**子(child)**和 **同胞(sibling)**等术语来描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。

  • 在节点树中,顶端节点被称为根(root)。
  • 每个节点都有父节点、除了根(它没有父节点)。
  • 一个节点可拥有任意数量的子节点。
  • 同胞是拥有相同父节点的节点。

查找HTML元素

通常,通过 JavaScript,您需要操作 HTML 元素。

为了做到这件事情,您必须首先找到该元素。有三种方法来做这件事:

  • 通过 id 找到 HTML 元素
  • 通过标签名找到 HTML 元素
  • 通过类名找到 HTML 元素
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h2>查找HTML元素</h2>
    <p id="demo">
        【#多地2020高考结束#,转发微博,向他们说声感谢[心]】感谢父母永远做自己最坚强的后盾;感谢老师默默耕耘让我们放飞人生梦想;感谢所有高考路上的护航人;也感谢那个永不言弃、拼搏到底的自己…十余载寒窗苦读,特殊的超长假期,你#高考后最想感谢的人#是谁?戳↓↓告别这段不可复制的高考时光! ​
    </p>
    <!-- 通过标签名查找:标签选择器 -->
    <p>
        【战疫情 斗暴雨 今日全国多地高考结束】“高三打基础,高四985”2019年高考后一位考生的“幽默”回答令人印象深刻。除北京、天津、山东等地,以及受严重洪涝灾害影响推迟考试的歙县外,延迟了一个月举行的高考,在多地落下帷幕。7月8日是2020高考的第二天,有的考生紧绷的身心终于可以缓解,而有的考生仍在苦战。#新京报直播#在安徽黄山歙县、甘肃兰州、北京等地,探访考点情况及考生状态,记录2020不平凡的高考“表情”。
    </p>
    <p class="test">
        蘑菇屋是个神奇的地方
        里面住着天使
        一花一草都在对你微笑
    </p>
    <script>
        /* 通过id查找:id选择器 */
        var x = document.getElementById("demo");
        document.write(x.innerHTML);
        document.write("<br>");
        /* 通过标签名查找:标签选择器 */
        var y = document.getElementsByTagName("p");
        document.write(y[1].innerHTML);
        document.write("<br>");
        /* 通过class名查找:类选择器 */
        var z = document.getElementsByClassName("test");
        document.write(z[0].innerHTML);
    </script>
</body>
</html>

改变HTML元素

HTML DOM 允许 JavaScript 改变 HTML 元素的内容。

JavaScript 能够创建动态的 HTML 内容:

在 JavaScript 中,document.write() 可用于直接向 HTML 输出流写内容。

修改 HTML 内容的最简单的方法是使用 innerHTML 属性

如需改变 HTML 元素的内容,请使用这个语法:

document.getElementById(id).innerHTML = 新的 HTML
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p id="demo">
        【高考结束时,你是什么心情?[挤眼]】随着外语考试到点的铃声响起,目前,#多地2020高考结束#。来说说,高考结束时,你是什么心情?#高考英语# #高考英语作文钉子户# 高考结束时,你是什么心情? ​
    </p>
    <br>
    <button onclick="changeInnerHtml()">按钮</button>

    <script>
        function changeInnerHtml() {
            document.getElementById("demo").innerHTML = "哈哈,你被代替了。换我来。";
        }
    </script>
</body>
</html>

如需改变 HTML 元素的属性,请使用这个语法:

document.getElementById(id).attribute = 新属性值
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <a href="https:www.bilibili.com">跳转到b站</a>
    <hr>
    <button onclick="changeAttribute()">修改超链接的打开页面</button>
    <script>
        function changeAttribute() {
            document.getElementsByTagName("a")[0].target = "_blank";
        }
    </script>
</body>
</html>

如需改变 HTML 元素的样式,请使用这个语法:

document.getElementById(id).style.property = 新样式
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>
        【致敬 感恩 雨中护航】7月8日下午17时许,2020年高考结束的最后时刻,绥德突降大雨,在学校周边执勤的民警冒着大雨坚守执勤岗位,守护莘莘学子高考圆满结束。这一幕引来了学生家长的致敬,上前为其举起了雨伞。致敬,感恩!
    </p>
    <button onclick="changeHtmlStyle()">按钮</button>
    <script>
        function changeHtmlStyle() {
            document.getElementsByTagName("p")[0].style.fontSize = "20px";
            document.getElementsByTagName("p")[0].style.lineHeight = "30px";
            document.getElementsByTagName("p")[0].style.color = "red";
            document.getElementsByTagName("p")[0].style.fontFamily = "楷体";
        }
    </script>
</body>
</html>

3.4、JavaScript的DOM对象、DOM事件和JS事件对象event的属性和方法

DOM事件

HTML DOM 使 JavaScript 有能力对 HTML 事件做出反应。

我们可以在事件发生时执行 JavaScript,比如当用户在 HTML 元素上点击时。

如需在用户点击某个元素时执行代码,请向一个 HTML 事件属性添加 JavaScript 代码:

onclick = JavaScript代码

HTML 事件的例子:

  • 当用户点击鼠标时
  • 当网页已加载时
  • 当图像已加载时
  • 当鼠标移动到元素上时
  • 当输入字段被改变时
  • 当提交 HTML 表单时
  • 当用户触发按键时

HTML DOM 允许您使用 JavaScript 来向 HTML 元素分配事件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>点击按钮执行<em>displayDate()</em>函数</p>
    <button>按钮</button>
    <p id="demo"></p>

    <script>
        document.getElementsByTagName("button")[0].onclick = function () {
            var date = new Date();
            var str = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate() + " " + date.getHours() + ":" 
                + date.getMinutes() + ":" + date.getSeconds();
            document.getElementById("demo").innerHTML = str; 
        }
    </script>
</body>
</html>

删除已有的HTML元素

先获取元素的父节点,然后通过父节点删除自己。

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div>
        <p id="p1">这是一个段落。</p>
        <button>按钮</button>
    </div>

    <script>
        document.getElementsByTagName("button")[0].onclick = function () {
            var child = document.getElementById("p1");
            var parent = child.parentElement;
            parent.removeChild(child);
        };
    </script>
</body>

</html>

DOM事件

获取焦点失去焦点

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="text"><span id="sa"></span>
    <script>
        var ele = document.getElementsByTagName('input')[0];
        ele.onfocus = function() {
            document.getElementById("sa").innerText = "获取焦点";
            console.log("获取焦点");
        }
        ele.onblur = function () {
            document.getElementById("sa").innerHTML = "失去焦点";
            console.log("失去焦点");
        }
    </script>
</body>
</html>

键盘事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="text" onkeypress="keyPress(event)"> <!-- 传递事件对象event -->

    <script>
        var ele = document.getElementsByTagName("input")[0];
        ele.onkeydown = function() {
            console.log('键盘被按下');
        }
        ele.onkeyup = function() {
            console.log("按键被松开");
        }
        /* ele.onkeypress = function() {
            // 上面两个的综合
            console.log("按键按下并松开");
        } */
        function keyPress(event) {
            console.log('按键' + event.keyCode + '按下并松开');
            // event.keyCode 获取按键键码的ASCII
        }
    </script>
</body>
</html>

鼠标事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #demo {
            width: 300px;
            height: 500px;
            background-color: red;
        }
    </style>
</head>
<body>
    <div id="demo" onmousedown="mousedown(event)">

    </div>

    <script>
        var ele = document.getElementById("demo");
        function mousedown(event) {
            // 鼠标按下
            console.log(event.button);
            // 获取鼠标按下的是左键/右键
            ele.style.backgroundColor = "green";
        }
        ele.onmouseup = function () {
            // 鼠标松开
            ele.style.backgroundColor = "red";
        }
        ele.onmouseover = function () {
            // 鼠标移上
            ele.style.height = "300px";
        }
        ele.onmouseout = function () {
            // 鼠标移开
            ele.style.height = "500px";
        }

        ele.onmousemove = function () {
            // 鼠标移动
            console.log("鼠标移动");
        }
    </script>
</body>
</html>

单击事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button id="demo">按钮</button>

    <script>
        var ele = document.getElementById("demo");
        ele.onclick = function () {
            console.log("点击事件");
        }
        ele.ondblclick = function () {
            console.log("双击事件");
        }
    </script>
</body>
</html>

表单事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="#" method="GET">
        用户名:<input type="text" name="username">
        密码:<input type="text" name="password">
        <input type="submit" value="注册">
        <input type="reset" value="重置">
    </form>

    <script>
        var ele = document.getElementsByTagName("form")[0];
        ele.onsubmit = function () {
            // return false; 禁止表单数据提交  return true;  允许表单提交
            return true;
        }
        ele.onreset = function () {
            console.log("重置表单数据");
        }
        ele.oninput = function () {
            // 边输入边校验,一般不采用
            console.log("表单输入数据");
        }
    </script>
</body>
</html>

加载事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        window.onload = function () {
            console.log(document.getElementById("demo"));
        }
    </script>
</head>
<body>
    <div id="demo">

    </div>
</body>
</html>

其他事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="#" method="GET">
        <select name="" id="">
            <option value="basketball">篮球</option>
            <option value="football">足球</option>
            <option value="ping-pong">乒乓球</option>
        </select>
    </form>

    <script>
        var ele = document.getElementsByTagName("select")[0];
        ele.onchange = function () {
            console.log(ele.value);
        }
    </script>
</body>
</html>

JS事件对象event

event事件对象由浏览器来创建,我们可以直接来使用。

属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            width: 300px;
            height: 500px;
            border: 1px black solid;
        }
    </style>
</head>
<body>
    <div onclick="mydiv(event)">
        <button>按钮</button>
    </div>
    
    <script>
        /*
        currentTarget:   获取的是绑定了该事件的元素对象
		target :  获取的是触发了该事件的元素对象 
        */
        function mydiv(event) {
            var e = event.currentTarget;
            console.log(e);
            var v = event.target;
            console.log(v);
            // 点击div,第一个输出div对象,第二个输出div对象
            // 点击button,第一个输出idv,第二个输出button
        }
    </script>
</body>
</html>

方法

阻止事件冒泡

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #d1 {
            width: 300px;
            height: 300px;
            background-color: red;
        }
        #d2 {
            width: 200px;
            height: 200px;
            background-color: blue;
        }
        #d3 {
            width: 100px;
            height: 100px;
            background-color: yellow;
        }
    </style>
</head>
<body>
    <div id="d1" onclick="mytest1(event)">
        <div id="d2" onclick="mytest2(event)">
            <div id="d3" onclick="mytest3(event)">

            </div>
        </div>
    </div>

    <script>
        /* function mytest1() {
            console.log(1);
        }
        function mytest2() {
            console.log(2);
        }
        function mytest3() {
            console.log(3);
        } */

        /* 
        点击id=d3的div时,控制台输出3 2 1
        点击id=d2的div时,控制台输出2 1
        点击id=d1的div时,控制台输出1
         */

        function mytest1(e) {
            console.log(1);
        }
        function mytest2(e) {
            e.stopPropagation();
            console.log(2);
        }
        function mytest3(e) {
            e.stopPropagation();
            console.log(3);
        }
        /* 
        点击id=d3、d2、d1的div时,控制台只输出3、2、1。
         */
    </script>
</body>
</html>

阻止元素的默认行为

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <a href="https://www.bilibili.com">跳转到哔哩哔哩首页</a>

    <script>
        var ele = document.getElementsByTagName("a")[0];
        ele.onclick = function (event) {
            console.log("aaa");
            event.preventDefault();
        }
    </script>
</body>
</html>
相关标签: 前端三剑客