详解JavaScript(ECMAScript与DOM)(下)

简介: 详解JavaScript(ECMAScript与DOM)(下)

十一. DOM操作

11.1 DOM的概念

DOM编程思想指的是通过操作文档对象模型(DOM)来动态地改变HTML文档的内容、结构和样式的编程方法。DOM是一种和平台和语言无关的API,用于访问和操作HTML和XML文档的内容和结构。

DOM编程思想的核心是将HTML文档视为一个对象树(DOM树),通过JavaScript代码来操作这个对象树实现对文档的动态改变。

11.2 DOM树

简述:

浏览器把HTML文档从服务器上下载下来之后就开始按照从上到下的顺序读取HTML标签。每一个标签都会被封装成一个对象

而第一个读取到的肯定是根标签html,然后是它的子标签head,再然后是head标签里的子标签……所以从html标签开始,整个文档中的所有标签都会根据它们之间的父子关系被放到一个树形结构的对象中。

以上的对象中包含了所有标签对象的整个树形结构,该对象就是JavaScript中的一个可以直接使用的内置对象document

例如:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        function f() {
            var arrs=new Array();
            arrs[0]=10;
            arrs[1]="java";
            //压入数据
            arrs.push(12);
            arrs.push("mysq1");
            console.log(arrs)
            var splice = arrs.splice(1,2);
            console.log(splice);
        }
    </script>
</head>
<body>
<p>天空之花</p>
<input type="button" value="点我" onclick="f()">
</body>
</html>

以上的HTML标签会被解析如下所示:

11.3 各个组成部分的类型

整个文档中的一切都可以看做Node。各个具体组成部分的具体类型可以看做Node类型的子类。

其实严格来说,JavaScript并不支持真正意义上的继承,这里借用Java中的继承概念,从逻辑上来帮助我们理解各个类型之间的关系。

组成部分 节点类型 具体类型
整个文档 文档节点 Document
HTML标签 元素节点 Element
HTML标签内的文本 文本节点 Text
HTML标签内的属性 属性节点 Attr
注释 注释节点 Comment

11.4 查询

①在整个文档范围内查询元素节点

功能 API 返回值
根据id值查询 document.getElementById(“id值”) 一个具体的元素节
根据标签名查询 document.getElementsByTagName(“标签名”) 元素节点数组
根据name属性值查询 document.getElementsByName(“name值”) 元素节点数组
根据类名查询 document.getElementsByClassName(“类名”) 元素节点数组

从文档中找id属性值为username的元素(标签)

代码演示如下:

document.getElementById("username");

从文档中查找标签名为input的元素节点数组

代码演示如下:

document.getElementsByTagName("input");

从文档中查找name属性值为aaa的元素节点数组

document.getElementsByName("aaa");

从文档中查询相应类名的元素节点数组(一般前端人员主要使用)

代码演示如下:

document.getElementsByclassName();

②在具体元素节点范围内查找子节点

功能 API 返回值
查找子标签 element.children 返回子标签数组
查找第一个子标签 element.firstElementChild 标签对象
查找最后一个子标签 element.lastElementChild 节点对象

③查找指定元素节点的父节点

功能 API 返回值
查找指定元素节点的父标签 element.parentElement 标签对象

④查找指定元素节点的兄弟节点

功能 API 返回值
查找前一个兄弟标签 node.previousElementSibling 标签对象
查找后一个兄弟标签 node.nextElementSibling 标签对象

⑤查询案例

部分代码演示如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
        <div id="div1">
            <input type="text" id="username" name="aa"><br>
            <input type="text" id="password" name="aa"><br>
            <input type="text" id="email" name="aa"><br>
            <input type="text" id="address" name="d"><br>
        </div>
        <input type="button" value="提交" id="btn1"/>
        <input type="button" value="重置" id="btn2"/>
        <script>
             //btn2 已经加载了
             var  e =  document.getElementById("btn2");
             console.log(e);
             //使用 DOMContentLoaded 事件来等待 DOM 加载完成后再执行代码。在事件处理程序中,你可以访问 DOM 元素并执行任何必要的操作。
             document.addEventListener("DOMContentLoaded",
                 function() {
                  //通过 document.getElementById() 方法获取页面上具有指定 ID 的元素,并将它存储在 btn2 变量中。
                 let btn2 = document.getElementById("btn2");
               /*
                 这段代码首先检查 ID 为 “btn2” 的按钮是否存在,然后再设置它的 onclick 属性。
                 如果按钮存在,它将设置 onclick 属性为一个函数,该函数将在单击按钮时执行。
                 */
                 if (btn2) {
                     btn2.onclick = function () {
                         var div1 = document.getElementById("div1");
                         var children = div1.children;
                         console.log(children.length);
                         //如果要查找div标签中前两个元素
                         for (var i = 0; i < 2; i++) {
                             console.log(children[i]);
                         }
                         //获取第一个子标签
                         console.log(div1.firstElementChild);
                         //获取最后一个子标签
                         console.log(div1.lastElementChild);
                     }
                 }
             });
        </script>
</body>
</html>

11.5 操作标签体的内容(双标签)

①获取内容

element.innerText     获得纯文本
element.innerHTML     获得纯文本+html标签

②赋值

element,innerText="纯文本"
element.innerHTML="文本中的标签可以被识别"

11.6 操作属性(单标签和双标签都可以)

①取属性值

element.属性名

②赋属性值

element.属性名=值

11.7 dom操作之新建和删除

API 功能
document.createElement(“标签名”) 创建元素节点并返回,但不会自动添加到文档中
document.createTextNode(“文本值”) 创建文本节点并返回,但不会自动添加到文档中
element.appendChild(ele) 将ele添加到element所有子节点后面
parentEle.insertBefore(newEle,targetEle) 将newEle插入到targetEle前面
parentEle.replaceChild(newEle, oldEle) 用新节点替换原有的旧子节点
element.remove() 删除某个标签

增删案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul id="ul1">
    <li>武汉</li>
    <li id="sh">上海</li>
    <li>深圳</li>
    <li id="gz">广州</li>
</ul>
<input type="button" value="添加城市" id="citys">
<script>
    document.getElementById("citys").onclick=function () {
       //1.创建新城市纽约,把它放到ul标签中的末尾
        var li =   document.createElement("li");//创建元素
        li.innerText="纽约";
        /*var text=document.createTextNode("纽约");//创建文本节点
          li.appendchild(text);*/
        //追加至末尾
        var  ul1 =  document.getElementById("ul1");
        ul1.appendChild(li);
        //把纽约放到上海前面
      /*
        var sh = document.getElementById("sh");
        ul1.insertBefore(li,sh);
      */
      //用纽约将广州替换
        var gz = document.getElementById("gz");
        ul1.replaceChild(li,gz);
        //删除url
        ul1.remove();
    }
</script>
</body>
</html>

十二.事件绑定

12.1 事件的概念

  • HTML 事件是发生在 HTML 元素上的“事情”, 是浏览器或用户做的某些事情
  • 事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行。

12.2 事件的绑定方式

①动态绑定

代码演示如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <input type="button" value="点我" id="btn01"/>
    <script>
        document.getElementById("btn01").onclick=function (ev) {
            var flag=confirm("确认删除吗?");
            if (flag){
                alert("已成功删除")
            }else {
                alert("未成功删除")
            }
            console.log(flag)
        }
    </script>
</body>
</html>

在js代码内获得需要绑定的元素对象

var btne1=document.getElementById("btne1");

为该元素绑定事件类型

btne1.οnclick=function 函数名() {
  代码体
}

②静态绑定

代码演示如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        function fun01(a,b) {
            alert("调用到fun01函数"+a+"\t"+b)
        }
    </script>
</head>
<body>
<input type="button" value="按钮" onclick="fun01(10,'java')" >
</body>
</html>

在需要添加事件的元素上,设置属性

<body>
<input type="button" value="按钮" onclick="fun01(10,'java')" >
</body>

准备一个有名函数

function fun1(a,b){
  alert("调用到fun01函数"+a+b);
}

12.3 事件的类型

onclick单击事件

ondblclick双击事件

tips:

event:事件对象

event.target 事件作用在的那个元素对象上

附注:常见事件(了解)

属性 此事件发生在何时…
onclick 当用户点击某个对象时调用的事件句柄。
ondblclick 当用户双击某个对象时调用的事件句柄。
onchange 域的内容被改变。
onblur 元素失去焦点。
onfocus 元素获得焦点。
onload 一张页面或一幅图像完成加载。
onsubmit 确认按钮被点击;表单被提交。
onkeydown 某个键盘按键被按下。
onkeyup 某个键盘按键被松开。
onmousedown 鼠标按钮被按下。
onmouseup 鼠标按键被松开。
onmouseout 鼠标从某元素移开。
omouseover 鼠标移到某元素之上。
onmousemove 鼠标被移动。

12.4 综合案例:动态表格

案例需求:

① 创建一个table,初始化用户的一些信息(编号、姓名、性别等)

② 创建一个表单,用户输入用户的信息

③ 表单中创建添加按钮,点击添加按钮,输入的用户信息追加到表格内

④ 每条用户信息后都有一个删除的超链接,点击删除,删除当前用户信息

案例图解如下:

代码演示如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>动态表格</title>
    <script>
            //删除用户
            function f() {
              var elementById = document.getElementById(event.target.id);
              var parentElement = elementById.parentElement.parentElement;
              parentElement.remove();
            }
            //添加用户
            function f1() {
                //1.新建一行外加四个单元格
                var tr = document.createElement("tr");
                var td1 = document.createElement("td");
                var td2 = document.createElement("td");
                var td3 = document.createElement("td");
                var td4 = document.createElement("td");
                //2.新建三个文本框
                var text01 = document.getElementById("text01");
                var text02 = document.getElementById("text02");
                var text03 = document.getElementById("text03");
                //3.用户会写内容到文本框中,我们将文本框中的内容写到td中,然后tr追加td
                td1.innerText=text01.value
                tr.appendChild(td1)
                td2.innerText=text02.value
                tr.appendChild(td2)
                td3.innerText=text03.value
                tr.appendChild(td3)
                td4.innerHTML="<input type='button' value='删除'  id='btn' οnclick='f()'/>"
                tr.appendChild(td4)
                //5.将tr添加至table1表中
                document.getElementById("table1").appendChild(tr);
                //每次输入用户信息,文本框就自动清空·
                text01.value=" ";
                text02.value=" ";
                text03.value=" ";
            }
    </script>
</head>
<body>
<table border="1" cellspacing="0px" width="250px"  align="center" id="table1">
    <tr>
        <th>序号</th>
        <th>用户</th>
        <th>性别</th>
        <th>操作</th>
    </tr>
    <tr id="table1_tr1">
        <td>1</td>
        <td>张三</td>
        <td>男</td>
        <td>
            <input type="button" value="删除" id="btn01" onclick="f()">
        </td>
    </tr>
    <tr id="table1_tr2">
        <td>2</td>
        <td>李四</td>
        <td>女</td>
        <td>
            <input type="button" value="删除" id="btn02" onclick="f()">
        </td>
    </tr>
    <tr id="table1_tr3">
        <td>3</td>
        <td>王五</td>
        <td>不详</td>
        <td>
            <input type="button" value="删除" id="btn03" onclick="f()">
        </td>
    </tr>
</table>
<table border="0" cellspacing="0px" width="250px"  align="center" id="table2">
    <tr>
        <td>序号</td>
        <td colspan="3"><input type="text" id="text01"> </td>
    </tr>
    <tr>
        <td>姓名</td>
        <td colspan="3"><input type="text" id="text02"></td>
    </tr>
    <tr>
        <td>性别</td>
        <td colspan="3"><input type="text" id="text03"></td>
    </tr>
    <tr>
        <td colspan="4" align="center"><input type="button" value="添加用户" id="btn04" onclick="f1()"></td>
    </tr>
</table>
</body>
</html>

相关文章
|
1天前
|
前端开发 JavaScript 数据安全/隐私保护
前端javascript的DOM对象操作技巧,全场景解析(二)
前端javascript的DOM对象操作技巧,全场景解析(二)
|
1天前
|
移动开发 缓存 JavaScript
前端javascript的DOM对象操作技巧,全场景解析(一)
前端javascript的DOM对象操作技巧,全场景解析(一)
|
1天前
|
JavaScript 前端开发
JavaScript DOM 文档对象模型(获取、改变html元素)
JavaScript DOM 文档对象模型(获取、改变html元素)
|
8天前
|
JavaScript 前端开发 UED
深入解析JavaScript原生操作DOM技术
【4月更文挑战第22天】本文深入探讨JavaScript原生DOM操作技术,包括使用`getElement*`方法和CSS选择器获取元素,借助`createElement`与`appendChild`动态创建及插入元素,修改元素内容、属性和样式,以及删除元素。通过掌握这些技术,开发者能实现页面动态交互,但应注意避免过度操作DOM以优化性能和用户体验。
|
12天前
|
JavaScript 前端开发
JavaScript Dom方法
JavaScript Dom方法
36 2
|
12天前
|
JavaScript 前端开发 API
JavaScript DOM 文档对象模型
JavaScript DOM 文档对象模型
|
16天前
|
存储 JavaScript 前端开发
JavaScript DOM 操作:解释一下 cookie、sessionStorage 和 localStorage 的区别。
Cookie是服务器发送至客户端的文本信息,会随每个请求发送回服务器,适合控制会话状态但可能暴露隐私。SessionStorage仅在当前会话中存储数据,关闭浏览器后清除,适合临时存储如登录状态。LocalStorage则持久保存数据,即使关闭浏览器也不会清除,适用于存储长期设置。三种方式各有侧重,应按需求选择。
16 0
|
16天前
|
JavaScript 前端开发 安全
JavaScript DOM 操作:解释一下浏览器的同源策略。
**同源策略**是浏览器安全基石,它阻止脚本跨不同协议、域名或端口访问资源,防止恶意行为。例如,HTTP页面无法直接用JS获取HTTPS页面内容。**CORS**允许跨域请求,但需服务器配合设置,通过`document.domain`属性可配置,但仍受限于服务器配置。
16 4
|
16天前
|
JavaScript 前端开发
JavaScript DOM 操作:如何检测浏览器是否支持某个特性?
【4月更文挑战第15天】使用Modernizr库检测浏览器特性:添加 `<script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>` 到HTML,然后通过 `Modernizr.localstorage` 进行检测,如支持localStorage则执行相应代码,否则执行备用逻辑。
15 0
|
5月前
|
XML JavaScript 前端开发
Javaweb之javascript的DOM对象的详细解析
1.5.3 DOM对象 1.5.3.1 DOM介绍 DOM:Document Object Model 文档对象模型。也就是 JavaScript 将 HTML 文档的各个组成部分封装为对象。
44 0