Java研学-JavaScript 进阶

news2024/12/24 21:41:57

一 JS 的 DOM

1 概述

  DOM 是 Document Object Model 文档对象模型的缩写。根据 W3C 的 DOM 规范,它是一种与浏览器,平台,语言无关的接口,能够动态地修改 XML 和 HTML。
  D:文档 – HTML文档 或 XML 文档
  O:对象 – document 对象的属性和方法
  M:模型

2 HTML DOM

  DOM 是将 HTML 文档视为树结构, 定义访问和操作 HTML 文档的标准方法; DOM 树:节点(node)的层次。文档节点(document)、元素节点、属性节点、文本节点; DOM 把一个文档表示
为一棵家族树(父,子,兄弟)
家族树

3 获取元素

① document 变量

  document 是 js 自定义的文档对象,当浏览器加载 HTML 网页时自动创建,自上而下每解析一行标签存入一行标签到 document 对象中。故获取元素对象时需注意执行到获取代码时,标签是否已经加载到 document 对象中。

② windown.onload 函数

  j浏览器加载完 HTML 页面时会调用 onload 函数。可将代码放到该函数中,当浏览器加载完 HTML 再执行。

<script>
windown.onload = function(){
// 操作标签
}
</script>

③ 元素获取方式

  通过元素 Id getElementById,返回拥有指定 id 的第一个元素,如果不存在则返回 null

  通过标签名字 getElementsByTagName,返回一个包括所有给定标签名称的元素集合,如果没有
匹配的元素,返回一个空集。

  通过 class 名字 getElementsByClassName,返回一个包含所有指定class名称的元素集合,可以
在任意元素上调用该方法。

  只有元素被加载到 document 中才可以获取

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>获取元素</title>
</head>
<body>
    <div id="div1" class="divClass">第一个盒子</div>
    <div id="div2" class="divClass">第二个盒子</div>
  <script>
      // 获取元素对象,先要获取文档对象document(html加载时自动创建)
      // 元素加载后就会存到document,文档加载完成执行函数
      window.onload=function (){
          //根据id获取元素:只能获取一个元素(id元素在html中必须唯一)
          var box1=  document.getElementById("div2");
          // 这句话会最后执行
          console.log(box1)
      }
      //根据id获取元素:只能获取一个元素
      var box1=  document.getElementById("div2");
      // console.log(box1)
     //根据元素的标签名称获取:可以获取页面的多个元素(获得一个集合)
      var boxs= document.getElementsByTagName("div");
      // 通过下标获取某个元素
      // console.log(boxs[0])
      //根据元素的class属性获取:可以获取页面的多个元素(class值可重复)
      var divs= document.getElementsByClassName("divClass");
      console.log(divs)
  </script>
</body>
</html>

4 操作元素节点属性

标准属性操作

      1.获取属性值:
       元素对象[“属性名”]
       元素对象.属性名
       元素对象.getAttribute("属性名")
       
     2.设置属性值:
         元素对象[”属性名”] = 值
         元素对象.属性名 = 值
         元素对象.setAttribute("属性名",)

自定义属性操作

       获取属性值: 元素对象.getAttribute("属性名")
       设置属性值: 元素对象.setAttribute("属性名",)

例子

<!-- 元素 -->
<div id="div1" class="div" style="background-color: yellow;">div1</div>
<input type="checkbox" id="cb" checked="checked" />
<script>
      //获取元素属性:div 的id属性值获取
      // var div1= document.getElementById("div1");
      var div1= document.getElementsByTagName("div")[0];//通过下标获取集合的元素对象
      console.log(div1["id"])
      console.log(div1.id)
      console.log(div1.getAttribute("id"))
      //获取class
      console.log(div1.className)
      //获取样式
      console.log(div1.style.backgroundColor)

      //设置元素的属性
      div1.id="div2";
      console.log(div1)

      //设置自定义属性,只能使用setAttribute,来给属性设置值
      // div1.email="aaa@123.com";
      div1.setAttribute("eamil","huang@123.com")
      console.log(div1)
      console.log(div1.getAttribute("eamil"))

      //布尔类型的属性获取
      var input = document.getElementById("cb");
      //属性名和属性值相同的属性,此时使用JS获取到的属性值是 true/false
      console.log(input.getAttribute("checked")) //checked
      console.log(input.checked) //true
      console.log(input["checked"]) //true
</script>

5 Node 对象的属性和方法

① 常用属性

属性名描述
firstChild指向在子节点列表中的第一个节点
lastChild指向在子节点列表中的最后一个节点
childNodes所有子节点的列表
previousSibling指向前一个兄弟节点,如果这个节点就是第一个,那么该值为null
nextSibling指向后一个兄弟节点,如果这个节点就是最后一个,那么该值为null
parentNode父节点

② 常用方法

方法名描述
hasChildNodes()是否包含子节点
appendChild(node)将节点添加到子节点列表的末尾
removeChild(node)从子节点中删除node
replaceChild(newNode,oldNode)替换子节点
insertBefore(newNode,refNode)在一个子节点前插入一个新的子节点,在refNode元素前插入newNode

③ 灵活操作DOM

<body>
<span id="span1">span1</span>
<span id="span2">span2</span>
<span id="span3">span3</span>
<div id="div1" style="background-color: orange">1</div>
<div id="div2" style="background-color: hotpink">2</div>
<div id="div3" style="background-color: cadetblue;">3</div>
<button onclick="fun1()">把span1添加到div1</button>
<button onclick="fun2()">把span添加到div2</button>
<button onclick="fun3()">新建span元素添加到div3</button><br/>
<select id="character" size="7">
    <option id="item1">大黄</option>
    <option id="item2">小黄</option>
    <option id="item3">小白</option>
    <option id="item4">自由人</option>
</select>
<button onclick="fun4()">在小黄之前插入小小黄</button>
<button onclick="fun5()">把小黄换成小黑</button>
<button onclick="fun6()">删除小白</button><br/>

<script>
    //把span1添加到div1
    function fun1(){
            var div1 = document.getElementById("div1");
            var span1 = document.getElementById("span1");
            div1.appendChild(span1);
    }

    //把span添加到div2
    function  fun2(){
       var div2 = document.getElementById("div2");
       var spans = document.getElementsByTagName("span");
       //遍历集合对象
        for(var i=0;i<spans.length;i++){
            //js数组长度可变:我们考虑每次获取数组的第一个元素即可
            div2.appendChild(spans[0])
        }
    }

    //新建span元素添加到div3
    function fun3(){
        var div3 = document.getElementById("div3");
        //新建元素
        var span= document.createElement("span");
        //元素设置内容
        span.innerHTML="新建span元素";
        div3.appendChild(span);
    }

    //在小黄之前插入小小黄
     function fun4(){
        //获取小黄
         var item2 = document.getElementById("item2");
         //创建小小黄
         var option = document.createElement("option");
         //把元素作为文本加入到另一个元素中,这种方式会覆盖之前的文本
         option.innerHTML="小小黄";
         //获取下拉框对象
         var el = document.getElementById("character");
         //在小黄之前插入小小黄
         el.insertBefore(option,item2);
     }
     //把小黄换成小黑
    function fun5(){
        var el = document.getElementById("character");
        var item2 = document.getElementById("item2");
        var option = document.createElement("option");
        option.innerHTML="小黑";
        el.replaceChild(option,item2);
    }
    //删除小白
    function fun6(){
        var el = document.getElementById("character");
        var item3 = document.getElementById("item3");
        el.removeChild(item3);
    }
</script>
</body>

二 事件处理

1 事件驱动编程

  通过触碰按钮状态(产生事件),执行操作(调用函数)。当对象处于某种状态时,可以发出一个消息通知,然后对应的程序即可执行

2 事件驱动编程的核心对象

① 事件源
  发出事件通知,发出消息;也就是事件主体(通常指元素和标签);
② 事件名称
  发出什么样的通知的名称,比如鼠标到我头上了,我被别人点了一下;
③ 事件响应函数
  此事件会调用那个函数,当这个事件发生时要执行什么样的操作;
④ 事件对象
  当事件发生时,会产生一个描述该事件的具体对象,包括具体的参数等一起发给响应函数,响应函数可通过事件对象来了解事件的详细信息

<!--p元素是事件源;click是事件名称-->
<p style="color: red" id="p1" onclick="shout(event);">Hello world!</p>
<script>
//响应函数
function shout(e){//响应函数,监听函数
alert(e.clientX);//e事件对象
}
</script>

3 事件类型

① 鼠标事件

属性名描述
onclick当用户点击某个对象时调用的事件
ondblclick当用户双击某个对象时调用的事件
onmousedown鼠标按钮被按下
onmouseleave当鼠标指针移出元素时触发
onmousemove鼠标被移动
onmouseover鼠标移到某元素之上
onmouseout鼠标从某元素移开
onmouseup鼠标按键被松开

② 键盘事件

属性名描述
onkeydown某个键盘按键被按下
onkeypress某个键盘按键被按下并松开
onkeyup某个键盘按键被松开

③ 表单事件

属性名描述
onblur元素失去焦点时触发
onchange该事件在表单元素的内容改变时触发
onfocus元素获取焦点时触发
onsubmit表单提交时触发
<body>
    <h3>用户表单</h3>
    <form action="">
       <p>账号:<input type="text" onblur="fnBlur()" onfocus="fnFocus()"></p>
        <p>
            日历:
            <select>
                <option value="">2020</option>
                <option value="">2021</option>
                <option value="">2022</option>
            </select>
        </p>
        <p>
            备忘录:
            <textarea id="per" cols="30" rows="5"></textarea>
        </p>
        <p>
            明信片:
            <img id="headImg" src="img/1.jpg" width="200px" height="200px">
        </p>
       <p><input type="button" value="提交"></p>
    </form>

<script>
    //事件绑定:1 html元素上使用事件名称绑定
    function fnBlur(){
        console.log("触发失去焦点函数")
    }

    function fnFocus(){
        console.log("触发获取焦点函数")
    }

    //事件绑定:2 元素对象.事件名绑定
    var per = document.getElementById("per");
    per.onchange=function (){
        console.log("变了")
    }
    //事件绑定:对象.addEventListener() 事件方法绑定
    var pic = document.getElementById("headImg");
    //将事件以方法的方式绑定
    pic.addEventListener("click",function (){
       //点击切换图片
       pic.src="img/2.jpg";
    })
</script>
</body>

4 事件绑定方式

  元素是不自带事件的, 为元素添加功能的时候, 需要先绑定上对应的事件(三种方式), 然后用户触发元素对应的事件时,执行之前绑定好的响应函数
① 在元素上使用onXxx属性绑定

// HTML,JS 交错在一起,维护性差
<input type="button" value="点" onclick="alert('OK');"/>

② 通过元素对象的事件属性绑定

<!--在该元素被加载完的时候没有绑定事件-->
<input type="button" value="点" id="btn"/>
//使用JS代码为元素绑定事件
//HTML 和 JS 完全分离开来,便于后期维护
//在input元素被加载后再根据id获取这个元素
//元素被加载后,再执行JS代码, 才能绑定成功
var btn = document.getElementById("btn");
btn.onclick = function(){
alert("OK");
}

// 或使用文档加载事件,在整个html文档加载完成之后再获取元素,绑定事件
window.onload = function(){
//这个函数中的代码会在整个文档加载完成之后再执行
//此时获取元素,可行
var btn = document.getElementById("btn");
btn.onclick = function(){
alert("OK");
}}

  方式一和二不能为元素绑定多次相同的事件,通过为事件属性赋值的响应函数实现,后面的赋值会将前面的覆盖掉,若要为元素绑定多次相同的事件,可使用方式三

③ 通过元素对象的方法绑定事件
  IE和非IE因浏览器兼容问题导致使用方法不同
IE

// IE 事件名称前必须加"on",多次添加监听后,触发顺序: 先添加的后执行
// EventName 事件名 fnHandler 事件响应函数
attachEvent [Object].attachEvent("EventName",fnHandler);

// fnHandler : 移除时,传入的"事件响应函数",必须和添加时传入的是同一个(通过相同标识符引用的那个函数) 匿名函数,每次创建的都不同
[Object].detachEvent("EventName",fnHandler);
// 

非IE

// 非IE 直接使用事件(操作)名称,没有on,多次添加监听后,触发顺序: 先添加的先执行
addEventListener[Object].addEventListener("EventName",fnHandler);

// 移除时,传入的"事件响应函数",必须和添加时传入的是同一个(通过相同标识符引用的那个函数) 匿名函数,每次创建的都不同
[Object].removeEventListener("EventName",fnHandler);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1320185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

物联网在能源管理中的应用——青创智通工业物联网解决方案

随着全球能源资源的日益紧张和环境问题的日益突出&#xff0c;能源管理已成为当今社会的重要议题。物联网技术的快速发展为能源管理提供了新的解决方案。本文将介绍物联网在能源管理中的应用及其优势。 一、物联网在能源管理中的应用 1. 智能电网 智能电网是物联网在能源管理中…

【基于BP神经网络的房价预测系统设计与实现】

基于BP神经网络的房价预测系统设计与实现 摘要1. 引言2. 数据获取与预处理3. 数据分析与可视化4. 系统功能设计4.1 用户登录注册4.2 房价数据展示4.3 房价变化趋势4.4 各区房价对比4.5 房间数和朝向分析4.6 房价预测 5. 创新点与意义6. 结论与展望结尾 摘要 本文介绍了一项基于…

Video anomaly detection with spatio-temporal dissociation 论文阅读

Video anomaly detection with spatio-temporal dissociation 摘要1.介绍2.相关工作3. Methods3.1. Overview3.2. Spatial autoencoder3.3. Motion autoencoder3.4. Variance attention module3.5. Clustering3.6. The training objective function 4. Experiments5. Conclusio…

骨传导耳机跟开放式耳机有什么关系?骨传导耳机和气传导耳机谁更值得入手?

开放式耳机是指开放双耳佩戴的耳机&#xff0c;骨传导耳机也算开放式耳机的一种&#xff0c;除了骨传导耳机外&#xff0c;还有气传导耳机&#xff0c;这两种耳机都算开放式耳机&#xff0c;不过传声方式有所不同。 骨传导耳机&#xff1a;通过颅骨震动来进行传导声音&#xff…

更长的 GPT-4 对话 token 上限,如何影响我的翻译工作流?

&#xff08;注&#xff1a;本文为小报童精选文章&#xff0c;已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 顺便聊聊生成式 AI 对你将来的工作流究竟有什么影响。 惊喜 Setapp 里面的 Typingmind 终于可以支持 128K token 窗口的 GPT-4 Turbo 了。只要…

5G工业物联网网关,比4G工业网关强在哪里?

​随着5G技术的广泛应用&#xff0c;越来越多的行业开始探索如何利用5G网络提升效率和创新能力。其中&#xff0c;工业物联网领域是受益最大的领域之一。作为连接物联网设备和网络的关键组件&#xff0c;5G工业物联网网关在这个变革中发挥着至关重要的作用。本文将深入探讨5G工…

Linux+Docker+Gitee+Jenkins自动化部署.NET Core服务

目录 一、安装Jenkins 1、跟新yum包 2、查询镜像 3、拉取镜像 4、创建Jenkins工作目录&#xff0c;并将容器内目录挂载到此目录上 5、启动Jenkins容器 二、Jenkins配置 1、Jenkins安装gitee码云插件 2、创建私人令牌 3、Jenkins添加全局凭据 4、系统配置 三、构建任…

运筹学经典问题(七):旅行商问题(TSP)

问题描述 给定一系列城市和每对城市之间的距离&#xff0c;求解访问每座城市一次并回到起始城市的最短回路。 数学建模 集合&#xff1a; V V V&#xff1a;城市集合 常量&#xff1a; c i j c_{ij} cij​&#xff1a;城市 i i i到城市 j j j之间距离, i ≠ j i \neq j i…

Unity SRP 管线【第四讲:URP 阴影】

URP 全文源码解析参照 引入 在UniversalRenderer.cs/ line 505行处 此处已经准备好了所有渲染数据&#xff08;所有数据全部存储在了renderingData中&#xff09; 我们只用renderingData中的数据初设置mainLightShadows bool mainLightShadows m_MainLightShadowCasterPass…

tamper编写

借鉴 sqlmap之tamper脚本编写_sqlmap tamper编写-CSDN博客 先看一个tamper的例子 栗子 escapequotes.py #!/usr/bin/env python""" Copyright (c) 2006-2023 sqlmap developers (https://sqlmap.org/) See the file LICENSE for copying permission "&…

Prometheus全面学习教程

一、Prometheus概述 1、Prometheus介绍 Prometheus 是一个开源的服务监控系统和时序数据库&#xff0c;其提供了通用的数据模型和快捷数据采集、存储和查询接口。它的核心组件Prometheus server会定期从静态配置的监控目标或者基于服务发现自动配置的自标中进行拉取数据&…

【期刊出版征稿】2024年艺术、教育和管理国际学术会议(ICAEM2024)

2024年艺术、教育和管理国际学术会议 2024 International Conference on Arts, Education and Management&#xff08;ICAEM2024&#xff09; 2024年艺术、教育和管理国际学术会议&#xff08;ICAEM2024&#xff09;将于2024年2月02-04日在马来西亚-吉隆坡召开。会议主题主要…

【TI毫米波雷达】上电时序、串口回环BUG及SOP模式不正常工作的解决方案(LP87524电源PMIC芯片的BUCK供电时序配置)

【TI毫米波雷达】雷达上电时序及SOP模式不正常工作的解决方案&#xff08;LP87524电源PMIC芯片的BUCK供电时序配置&#xff09; 文章目录 上电时序上电以后的雷达串口回环问题延迟上电时序LP87524电源PMIC芯片的BUCK供电时序LP87524电源PMIC芯片的BUCK默认供电输出附录&#x…

18.NAT

NAT IP v4 &#xff1a;32bit IP v6&#xff1a; 128bit 一个公网地址支持6000个用户使用上网 运营商只维护公网地址&#xff0c;会将私网地址丢弃 一般部署在路由器或防火墙上面 方法一 NAT配置 使用公网接口地址 在路由器的出口GE&#xff3f;0/0口进行配置 然后PC2…

简洁易懂的Yolov7本地训练自己的数据并onnx推理

YOLOV7 官方代码Yolov7 测试官方案例 1、下载下来先按照github教程下载yolov7.pt权重 2、pycharm&#xff08;或其他&#xff09;打开detect文件&#xff0c;修改权重路径和推理图片的路径&#xff0c;分别是 parser.add_argument(--weights, nargs, typestr, defaultyolov…

[LLM]nanoGPT---训练一个写唐诗的GPT

karpathy/nanoGPT: The simplest, fastest repository for training/finetuning medium-sized GPTs. (github.com) 原有模型使用的莎士比亚的戏剧数据集, 如果需要一个写唐诗机器人&#xff0c;需要使用唐诗的文本数据&#xff0c; 一个不错的唐诗&#xff0c;宋词数据的下载…

东南亚Shopee:东南亚领先的电商平台

Shopee是东南亚地区最著名的电商平台之一&#xff0c;成立于2015年。作为新加坡互联网公司Sea Group&#xff08;原名Garena&#xff09;的一部分&#xff0c;Shopee在东南亚市场拥有广泛的业务覆盖范围&#xff0c;包括新加坡、马来西亚、泰国、印度尼西亚、越南和菲律宾等国家…

源码编译 METIS 以及 GKlib 在Linux ubuntu上

1. GKlib 构建 $ git clone --recursive gitgithub.com:Kleenelan/GKlib.git $ cd GKlib/ $ make config ccgcc openmpset $ make $ make install源码构建了 GKlib 的 openmp 版本&#xff0c;以便充分使用多核的算力&#xff1b; make config ccgcc openmpset 的效果图&#…

QT-可拖拉绘图工具

QT-可拖拉绘图工具 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include "diagramscene.h" #include "arrow.h"#include <QTextCursor> #include <QGraphicsSceneMouseEvent> #include <QDebug>QPen const Diagr…

Windows本地搭建开源企业管理套件Odoo并实现公网访问

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…