Javaweb梳理18——JavaScript

今日目标

  • 掌握 JavaScript 的基础语法
  • 掌握 JavaScript 的常用对象(Array、String)
  • 能根据需求灵活运用定时器及通过 js 代码进行页面跳转
  • 能通过DOM 对象对标签进行常规操作
  • 掌握常用的事件
  • 能独立完成表单校验案例

18.1 JavaScript简介

JavaScript 是一门跨平台、面向对象的脚本语言,而Java语言也是跨平台的、面向对象的语言,只不过Java是编译语言,是需要编译成字节码文件才能运行的;JavaScript是脚本语言,不需要编译,由浏览器直接解析并执行。
JavaScript 是用来控制网页行为的,它能使网页可交互;那么它可以做什么呢?如改变页面内容、修改指定元素的属性值、对表单进行校验等,下面是这些功能的效果展示:
1.改变页面内容
在这里插入图片描述
当我点击上面左图的 点击我 按钮,按钮上面的文本就改为上面右图内容,这就是js 改变页面内容的功能。
2. 修改指定元素的属性值
在这里插入图片描述当我们点击上图的 开灯 按钮,效果就是上面右图效果;当我点击 关灯 按钮,效果就是上面左图效果。其他这个功能中有两张灯泡的图片(使用img标签进行展示),通过修改 img 标签的 src 属性值改变展示的图片来实现。
3. 对表单进行校验
在这里插入图片描述
在上面左图的输入框输入用户名,如果输入的用户名是不满足规则的就展示右图(上) 的效果;如果输入的用户名是满足规则的就展示右图(下) 的效果。

JavaScript 和 Java 是完全不同的语言,不论是概念还是设计,只是名字比较像而已。但是基础语法类似,所以我们有java的学习经验,再学习JavaScript 语言就相对比较容易些。

JavaScript(简称:JS) 在 1995 年由 Brendan Eich 发明,并于 1997 年成为一部 ECMA 标准。ECMA 规定了一套标准 就叫 ECMAScript ,所有的客户端校验语言必须遵守这个标准,当然 JavaScript 也遵守了这个标准。ECMAScript 6 (简称ES6) 是最新的 JavaScript 版本(发布于 2015 年),我们的课程就是基于最新的 ES6 进行讲解。

18.2 JavaScript引入方式


JavaScript 引入方式就是 HTML 和 JavaScript 的结合方式。JavaScript引入方式有两种:
  • 内部脚本:将 JS代码定义在HTML页面中
  • 外部脚本:将 JS代码定义在外部 JS文件中,然后引入到 HTML页面中

18.2.1 内部脚本

在 HTML 中,JavaScript 代码必须位于 <script></script> 标签之间
代码如下:
alert(数据) 是 JavaScript 的一个方法,作用是将参数数据以浏览器弹框的形式输出出来。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>alert("hello js1");
</script>
</body>
</html>

效果如下:
在这里插入图片描述
从结果可以看到 js 代码已经执行了。

提示:

  • 在 HTML 文档中可以在任意地方,放置任意数量的
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script>alert("hello js1");</script>
</head>
<body><script>alert("hello js1");
</script></body>
</html>
<script>alert("hello js1");
</script>
  • 一般把脚本置于 元素的底部,可改善显示速度
    因为浏览器在加载页面的时候会从上往下进行加载并解析。 我们应该让用户看到页面内容,然后再展示动态的效果。

18.2.2 外部脚本

第一步:定义外部 js 文件。如定义名为 demo.js的文件
项目结构如下:
在这里插入图片描述
demo.js 文件内容如下:

alert("hello js");

第二步:在页面中引入外部的js文件
在页面使用 script 标签中使用 src 属性指定 js 文件的 URL 路径。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script src="../js/demo.js"></script>
</body>
</html>

注意:

  • 外部脚本不能包含 <script> 标签
    在js文件中直接写 js 代码即可,不要在 js文件 中写 script 标签
  • <script> 标签不能自闭合
    在页面中引入外部js文件时,不能写成 <script src="../js/demo.js" />

18.2.3 JavaScript基础语法

18.2.3.1 书写语法
  • 区分大小写:与 Java 一样,变量名、函数名以及其他一切东西都是区分大小写的

  • 每行结尾的分号可有可无

    如果一行上写多个语句时,必须加分号用来区分多个语句。

  • 注释
    • 单行注释:// 注释内容
    • 多行注释:/* 注释内容 */

注意:JavaScript 没有文档注释

  • 大括号表示代码块
    下面语句大家肯定能看懂,和 java 一样 大括号表示代码块。
if (count == 3) { alert(count); 
} 
18.2.3.2 输出语句

js可以通过以下方式进行内容的输出,只不过不同的语句输出到的位置不同

  • 使用 window.alert() 写入警告框
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>window.alert("hello js");//写入警告框
</script>
</body>
</html>

上面代码通过浏览器打开,我们可以看到如下图弹框效果
在这里插入图片描述

  • 使用 document.write() 写入 HTML 输出
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>document.write("hello js 2~");//写入html页面
</script>
</body>
</html>
  • 使用 console.log() 写入浏览器控制台
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><script>console.log("hello js 3");//写入浏览器的控制台
</script>
</body>
</html>

上面代码通过浏览器打开,我们可以在不能页面上看到 console.log(内容) 输出的内容,它是输出在控制台了,而怎么在控制台查看输出的内容呢?在浏览器界面按 F12 就可以看到下图的控制台
在这里插入图片描述

18.2.3.2 变量

JavaScript中用var关键字(variable的缩写)来声明变量。格式var 变量名=数据值;。而在JavaScript是一门弱类型语言,变量可以存放不同类型的值;如下在定义变量时赋值为数字数据,还可以将变量的值改为字符串类型的数

var test = 20;
test = "张三";

js 中的变量名命名也有如下规则,和java语言基本都相同

  • 组成字符可以是任何字母、数字、下划线(_)或美元符号($)
  • 数字不能开头
  • 建议使用驼峰命名
    JavaScript中var关键字有点特殊,有以下地方和其他语言不一样
  • 作用域:全局变量
{var age=20;
}
alert(age);  // 在代码块中定义的age 变量,在代码块外边还可以使用
  • 变量可以重复定义
{var age = 20;var age = 30;//JavaScript 会用 30 将之前 age 变量的 20 替换掉
}
alert(age); //打印的结果是 30

针对如上的问题,ESMAScript6新增了let关键字来定义变量。,但是所声明的变量,只在let关键字所在的代码块内有效,且不允许重复声明。
例如:

{let age = 20;
}
alert(age); 

运行上面代码,浏览器并没有弹框输出结果,说明这段代码是有问题的。通过 F12 打开开发者模式可以看到如下错误信息
在这里插入图片描述
而如果在代码块中定义两个同名的变量,IDEA 开发工具就直接报错了
在这里插入图片描述
ECMAScript 6 新增了 const关键字,用来声明一个只读的常量。一旦声明,常量的值就不能改变。 通过下面的代码看一下常用的特点就可以了
在这里插入图片描述
我们可以看到PI这个常量重新赋值时报错了

18.2.3.3 数据类型

JavaScript中提供了两种数据类型:原始类型和引用类型

使用typeof运算符可以获取数据类型
alert(typeof age);以弹框的形式将age变量的数据类型输出
原始数据类型

  • number:数字(整数、小数、NaN(Not a Number))
var age = 20;
var price = 99.8;alert(typeof age); // 结果是 : number
alert(typeof price);// 结果是 : number

注意: NaN是一个特殊的number类型的值

  • string:字符、字符串,单双引皆可
var ch='a';
var name='张三';
var addr="北京";alert(typeof ch); //结果是 string
alert(typeof name); //结果是 string
alert(typeof addr); //结果是 string

==注意:==在js中双引号和单引号都表示字符串类型的数据

  • boolean:布尔。true,false
var flag=true;
var flag2=false;alert(typeof flag);  //结果是boolean
alert(typeof flag2);  //结果是boolean
  • null:对象为空
var obj=null;alert(typeof obj);  //结果是object

为什么打印上面的obj变量的数据类型,结果是object;这个官方给出了解释,下面是从官方文档截的图
在这里插入图片描述
-undefined:当声明的变量未初始化时,该变量的默认值是undefined

var a;
aleart(typeof a);//结果是undefined

18.3运算符

JavaScript提供了如下的运算符。大部分和Java语言都是一样的,不同的是JS关系运算符中的==和===,我们只演示这两个的区别,其他运算符将不做演示

  • 一元运算符:++,–
  • 算术运算符:+,-,*,/,%
  • 赋值运算符:=,+=,-=
  • 关系运算符:>,<,>=,<=,!=,==,===
  • 逻辑运算符:&&,||,!
  • 三元运算符:条件表达式?true_value:false_value

18.3.1 ==和===区别

概述:

  • ==:
    1.判断类型是否一样,如果不一样,则进行类型转换
    2. 再去比较其值
  • ===:js中的全等于
  • 1.判断类型是否一样,如果不一样,直接返回false
  • 2.再去比较其值
    代码:
var age1 = 20;
var age2 = "20";alert(age1 == age2);// true
alert(age1 === age2);// false

18.3.2 类型转换

上面讲解==运算符时,会发生类型转换,所以接下来我们详细地讲解JavaScript的类型转换

  • 其他类型转换为number

    • string转换为number类型:按照字符串的字面值,转为数字。如果字面值不是数字,则转为NaN
      将string转换为number有两种方式:
      • 使用+正号运算符
      var str=+"20"
      alert(str+1)  //21
      
      • 使用parseInt()函数(方法):
      var flag=+false
      alert(flag);  	//0
      
  • 其他类型转为boolean类型

    • 0和NaN转为false其他的数字转为true
    • string类型转换为boolean类型:空字符串转为false,其他的字符串转为true
    • null类型转为boolean类型是false
    • undefined转换为boolean类型是false
      代码如下:
// var flag = 3;
// var flag = "";
var flag = undefined;if(flag){alert("转为true");
}else {alert("转为false");
}

使用场景:
在 Java 中使用字符串前,一般都会先判断字符串不是null,并且不是空字符才会做其他的一些操作,JavaScript也有类型的操作,代码如下:

var str = "abc";//健壮性判断
if(str != null && str.length > 0){alert("转为true");
}else {alert("转为false");
}

但是由于 JavaScript 会自动进行类型转换,所以上述的判断可以进行简化,代码如下:

var str = "abc";//健壮性判断
if(str){alert("转为true");
}else {alert("转为false");
}

18.3 流程控制语句

JavaScript 中提供了和 Java 一样的流程控制语句,如下

  • if
  • switch
  • for
  • while
  • dowhile

18.3.1 if 语句

var count = 3;
if (count == 3) {alert(count);
}

18.3.2 switch 语句

var num=3;
switch(num){case 1:alert("星期一");break;case 2:alert("星期二");break;case 3:alert("星期三");break;case 4:alert("星期四");break;case 5:alert("星期五");break;case 6:alert("星期六");break;case 7:alert("星期日");break;default:alert("输入的星期有误");break;
}

18.3.3 for循环语句

var sum=0;
for(let i=1;i<=100;i++){
//建议for循环小括号中定义的变量使用let
sum+=i;
}
alert(sum);

18.3.4 while循环语句

var sum=0;
var i=1;
while(i<=100){sum+=i;i++;
}
alert(sum);

18.3.5 dowhile循环语句

var sum = 0;
var i = 1;
do {sum += i;i++;
}
while (i <= 100);
alert(sum);

18.4函数

函数(就是Java中的方法)是被设计为执行特定任务的代码块;JavaScript 函数通过 function 关键词进行定义。

18.4.1 定义格式

函数定义格式有两种:

  • 方式1
function 函数名(参数1,参数2...){要执行的代码}
  • 方式2
var 函数名=function(参数列表){要执行代码
}

注意:

  • 形式参数不需要类型,因为JavaScript是弱类型语言
function add(a, b){   
return a + b;
}

上述函数的参数a和b不需要定义数据类型,因为每个参数前加上var也没有任何意义
返回值也不需要定义类型,可以在函数内部直接使用return返回即可

18.4.2 函数调用

函数调用函数:
函数名称(实际参数列表);
eg:

let result = add(10,20);

注意:

  • JS中,函数调用可以传递任意个数参数
  • 例如 let result=add(1,2,3);
    它是将数据1传递给了变量a,将数据2传递给了变量b,而数据3没有变量接收
    4.JavaScript常用对象
    JavaScript提供了很多对象供使用者来使用。这些对象总共分类三类
  • 基本对象
    在这里插入图片描述
  • BOM对象
    在这里插入图片描述
  • DOM对象
    DOM 中的对象就比较多了,下图只是截取部分
    在这里插入图片描述
    这小节我们先学习基本对象,而我们先学习 Array 数组对象和 String 字符串对象。

18.5 Array对象

JavaScript Array对象用于定义数组

18.5.1 定义格式

数组的定义格式有两种:

  • 方式1
var 变量名=new Array(元素列表);

例如:

var arr=new Array(1.2.3);
//1,2,3是存储在数组中的数据(元素)
  • 方式2
var arr=[1,2,3];   //1,2,3是存储在数组中的数据(元素)

注意:Java中的数组静态初始化使用的是{}定义,而JavaScript中使用的是[]定义

18.5.2 元素访问

访问数组中的元素和Java语言的一样,格式如下:

arr[索引]=;

代码演示:

//方式一
var arr=new Array(1,2,3);
//alert(arr);//方式二
var arr2=[1,2,3];
//alert(arr2);//访问
arr2[0]=10;
alert(arr2);

18.5.3 特点

JavaScript中的数组相当于java中集合。数组的长度是可以变化的,而JavaScript是弱类型,所以可以存储任意的类型的数据
例如如下代码:

//变长
var arr3=[1,2,3];
arr3[10]=10;
alert(arr3[10]);  //10
alert(arr3[9]); //undefined

上面代码在定义数组中给了三个元素,又给索引是10的位置添加了数据10,那么索引3索引9位置的元素是什么呢?我们之前就介绍了,在JavaScriprt中没有赋值的话,默认就是undefined
如果给arr3数组添加字符串的数据,也是可以添加成功的

arr3[5] = "hello";
alert(arr3[5]); // hello

18.5.4 属性

Array对象提供了很多属性,如下图是官方文档截取的。
在这里插入图片描述
而我们只讲解 length 属性,该数组可以动态的获取数组的长度。而有这个属性,我们就可以遍历数组了

var arr=[1,2,3];
for(let i=0;i<arr.length;i++){
alert(arr[i]);
}

18.5.5 方法

Array 对象同样也提供了很多方法,如下图是官方文档截取的
在这里插入图片描述
而我们在课堂中只演示 push 函数和 splice 函数。

  • push 函数:给数组添加元素,也就是在数组的末尾添加元素
    参数表示要添加的元素
//push:添加方法
var arr5=[1,2,3];
arr5.push(10);
alert(arr5);  //数组的元素是{1,2,3,10}
  • splice 函数:删除元素
    参数1:索引。表示从哪个索引位置删除。
    参数2:个数。表示删除几个元素
//splice:删除元素
var arr5=[1,2,3];
arr5.splice(0,1);  //从0索引位置开始删除,删除一个元素
alert(arr5);  //{2,3}

18.6 String对象

String对象的创建方式有两种

  • 方式1:
var 变量名=new String(s);
  • 方式2:
var 变量名="数组";

属性:
String对象提供了很多属性,下面给大家列举了一个属性length,该属性适用于动态的获取字符串的长度
在这里插入图片描述
函数:

String对象提供了很多函数(方法),下面给大家列举了两个方法。
在这里插入图片描述
String对象还有一个函数trim(),该方法在文档中没有体现,但是所有的浏览器都支持,它是用来去掉字符串两端的空格
代码演示:

var str4='      abc        ' ;
alert(1+str4+1);

上面代码会输出内容 1 abc 1,很明显可以看到 abc 字符串左右两边是有空格的。接下来使用 trim() 函数
var str4 = ’ abc ';
alert(1 + str4.trim() + 1);
trim() 函数在以后开发中还是比较常用的,例如下图所示是登陆界面
在这里插入图片描述
用户在输入用户名和密码时,可能会习惯的输入一些空格,这样在我们后端程序中判断用户名和密码是否正确,结果肯定是失败。所以我们一般都会对用户输入的字符串数据进行去除前后空格的操作。

18.7 自定义对象

在 JavaScript 中自定义对象特别简单,下面就是自定义对象的格式:

var 对象名称 = {属性名称1:属性值1,属性名称2:属性值2,...,函数名称:function (形参列表){},...
};

调用属性的格式:

对象名.属性名

调用函数的格式:

对象名.函数名()

接下来通过代码演示一下,让大家体验一下 JavaScript 中自定义对象

var person={name:"zhangsan",age:23,eat:function(){alert("干饭~");
}
};alert(person.name);  //zhangsan
alert(person.age);  //23person.eat();  //干饭~

18.8 BOM

BOM:Browser Object Model浏览器对象模型,也就是JavaScript将浏览器的各个组成部分封装为对象

我们要操作浏览器的各个组成部分就可以通过操作 BOM 中的对象来实现。比如:我现在想将浏览器地址栏的地址改为 https://www.itheima.com 就可以通过使用 BOM 中定义的 Location 对象的 href 属性,代码: location.href = "https://itheima.com";

BOM 中包含了如下对象:

  • Window:浏览器窗口对象
  • Navigator:浏览器对象
  • Screen:屏幕对象
  • History:历史记录对象
  • Location:地址栏对象
    下图是 BOM 中的各个对象和浏览器的各个组成部分的对应关系
    在这里插入图片描述
    BOM 中的 Navigator 对象和 Screen 对象基本不会使用,所以我们的课堂只对 WindowHistoryLocation 对象进行讲解。

18.8.1 Window对象

window 对象是 JavaScript 对浏览器的窗口进行封装的对象。

18.8.1.1 获取window对象

该对象不需要创建直接使用 window,其中 window. 可以省略。比如我们之前使用的 alert() 函数,其实就是 window 对象的函数,在调用是可以写成如下两种

  • 显式使用 window 对象调用
window.alert("abc");
  • 隐式调用
alert("abc");
18.8.1.2 window对象属性

window 对象提供了用于获取其他 BOM 组成对象的属性
在这里插入图片描述
也就是说,我们想使用 Location 对象的话,就可以使用 window 对象获取;写成 window.location,而 window. 可以省略,简化写成 location 来获取 Location 对象。

18.8.1.3 window对象函数

window 对象提供了很多函数供我们使用,而很多都不常用;下面给大家列举了一些比较常用的函数
在这里插入图片描述

setTimeout(function,毫秒值) : 在一定的时间间隔后执行一个function,只执行一次
setInterval(function,毫秒值) :在一定的时间间隔后执行一个function,循环执行
confirm代码演示:

// confirm(),点击确定按钮,返回true,点击取消按钮,返回false
var flag = confirm("确认删除?");alert(flag);

在这里插入图片描述
下图是 confirm() 函数的效果。当我们点击 确定 按钮,flag 变量值记录的就是 true ;当我们点击 取消 按钮,flag 变量值记录的就是 false
而以后我们在页面删除数据时候如下图每一条数据后都有 删除 按钮,有可能是用户的一些误操作,所以对于删除操作需要用户进行再次确认,此时就需要用到 confirm() 函数。
在这里插入图片描述
定时器代码演示:

setTimeout(function (){alert("hehe");
},3000);

当我们打开浏览器,3秒后才会弹框输出 hehe,并且只会弹出一次。

setInterval(function (){alert("hehe");
},2000);

当我们打开浏览器,每隔2秒都会弹框输出 hehe

18.8.1.4 案例

需求:每隔1秒,灯泡切换一次状态
在这里插入图片描述
需求说明:
有如下页面效果,实现定时进行开灯、关灯功能
在这里插入图片描述
初始页面环境

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JavaScript演示</title>
</head>
<body><input type="button" onclick="on()" value="开灯">
<img id="myImage" border="0" src="../imgs/off.gif" style="text-align:center;">
<input type="button" onclick="off()" value="关灯"><script>function on(){document.getElementById('myImage').src='../imgs/on.gif';}function off(){document.getElementById('myImage').src='../imgs/off.gif'}</script>
</body>
</html>

代码实现:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>JavaScript演示</title>
</head>
<body><input type="button" onclick="on()" value="开灯">
<img id="myImage" border="0" src="../imgs/off.gif" style="text-align:center;">
<input type="button" onclick="off()" value="关灯"><script>function on(){document.getElementById('myImage').src='../imgs/on.gif';}function off(){document.getElementById('myImage').src='../imgs/off.gif'}//定义一个变量,用来记录灯的状态,偶数是开灯状态,奇数是关灯状态var x = 0;//使用循环定时器setInterval(function (){if(x % 2 == 0){//表示是偶数,开灯状态,调用 on() 函数on();}else {  //表示是奇数,关灯状态,调用 off() 函数off();}x ++;//改变变量的值},1000);</script>
</body>
</html>
18.8.2 History对象

History 对象是 JavaScript 对历史记录进行封装的对象。

  • History 对象的获取
    使用 window.history获取,其中window. 可以省略
  • History 对象的函数
    在这里插入图片描述
    这两个函数我们平时在访问其他的一些网站时经常使用对应的效果,如下图
    在这里插入图片描述
    当我们点击向左的箭头,就跳转到前一个访问的页面,这就是 back() 函数的作用;当我们点击向右的箭头,就跳转到下一个访问的页面,这就是 forward() 函数的作用。

18.8.3 Location对象

4
Location 对象是 JavaScript 对地址栏封装的对象。可以通过操作该对象,跳转到任意页面。

18.8.3.1 获取Location对象

使用 window.location获取,其中window. 可以省略

window.location.方法();
location.方法();
18.8.3.2 Location对象属性

Location对象提供了很对属性。以后常用的只有一个属性 href
在这里插入图片描述
代码演示:

alert("要跳转了");
location.href = "https://www.baidu.com";

在浏览器首先会弹框显示 要跳转了,当我们点击了 确定 就会跳转到 百度 的首页。

18.8.4 案例

需求:3秒跳转到百度首页
分析:

  1. 3秒跳转,由此可以确定需要使用到定时器,而只跳转一次,所以使用 setTimeOut()
  2. 要进行页面跳转,所以需要用到 location 对象的 href 属性实现

代码实现:

document.write("3秒跳转到首页..."); 
setTimeout(function (){location.href = "https://www.baidu.com"
},3000);

18.9 DOM

18.9.1 概述

DOM:Document Object Model 文档对象模型。也就是 JavaScript 将 HTML 文档的各个组成部分封装为对象。
DOM 其实我们并不陌生,之前在学习 XML 就接触过,只不过 XML 文档中的标签需要我们写代码解析,而 HTML 文档是浏览器解析。封装的对象分为

  • Document:整个文档对象
  • Element:元素对象
  • Attribute:属性对象
  • Text:文本对象
  • Comment:注释对象
    如下图,左边是 HTML 文档内容,右边是 DOM 树
    在这里插入图片描述
    作用:

JavaScript 通过 DOM, 就能够对 HTML进行操作了

  • 改变 HTML 元素的内容
  • 改变 HTML 元素的样式(CSS)
  • 对 HTML DOM 事件作出反应
  • 添加和删除 HTML 元素
    DOM相关概念:

DOM 是 W3C(万维网联盟)定义了访问 HTML 和 XML 文档的标准。该标准被分为 3 个不同的部分:

  1. 核心 DOM:针对任何结构化文档的标准模型。 XML 和 HTML 通用的标准

    • Document:整个文档对象

    • Element:元素对象

    • Attribute:属性对象

    • Text:文本对象

    • Comment:注释对象

  2. XML DOM: 针对 XML 文档的标准模型

  3. HTML DOM: 针对 HTML 文档的标准模型

    该标准是在核心 DOM 基础上,对 HTML 中的每个标签都封装成了不同的对象

    • 例如:<img> 标签在浏览器加载到内存中时会被封装成 Image 对象,同时该对象也是 Element 对象。
    • 例如:<input type='button'> 标签在浏览器加载到内存中时会被封装成 Button 对象,同时该对象也是 Element 对象。

18.9.2 获取 Element对象

HTML 中的 Element 对象可以通过 Document 对象获取,而 Document 对象是通过 window 对象获取。
Document 对象中提供了以下获取 Element 元素对象的函数

  • getElementById():根据id属性值获取,返回单个Element对象
  • getElementsByTagName():根据标签名称获取,返回Element对象数组
  • getElementsByName():根据name属性值获取,返回Element对象数组
  • getElementsByClassName():根据class属性值获取,返回Element对象数组
  • 代码演示:

下面有提前准备好的页面:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><img id="light" src="../imgs/off.gif"> <br><div class="cls">传智教育</div>   <br><div class="cls">黑马程序员</div> <br><input type="checkbox" name="hobby"> 电影<input type="checkbox" name="hobby"> 旅游<input type="checkbox" name="hobby"> 游戏<br><script>//在此处书写js代码</script>
</body>
</html>
  1. 根据 id 属性值获取上面的 img 元素对象,返回单个对象
var img = document.getElementById("light");
alert(img);

在这里插入图片描述
从弹框输出的内容,也可以看出是一个图片元素对象。

  1. 根据标签名称获取所有的 div 元素对象
var img = document.getElementById("light");
alert(img);
  1. 获取所有的满足 name = 'hobby' 条件的元素对象
//3. getElementsByName:根据name属性值获取,返回Element对象数组
var hobbys = document.getElementsByName("hobby");
for (let i = 0; i < hobbys.length; i++) {alert(hobbys[i]);
}
  1. 获取所有的满足 class='cls' 条件的元素对象
//4. getElementsByClassName:根据class属性值获取,返回Element对象数组
var clss = document.getElementsByClassName("cls");
for (let i = 0; i < clss.length; i++) {alert(clss[i]);
}

18.9.3 HTML Element对象使用

HTML 中的 Element 元素对象有很多,不可能全部记住,以后是根据具体的需求查阅文档使用。

下面我们通过具体的案例给大家演示文档的查询和对象的使用;下面提前给大家准备好的页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><img id="light" src="../imgs/off.gif"> <br><div class="cls">传智教育</div>   <br><div class="cls">黑马程序员</div> <br><input type="checkbox" name="hobby"> 电影<input type="checkbox" name="hobby"> 旅游<input type="checkbox" name="hobby"> 游戏<br><script>//在此处写js低吗</script>
</body>
</html>
  1. 点亮灯泡

此案例由于需要改变 img 标签 的图片,所以我们查询文档,下图是查看文档的流程:
在这里插入图片描述
代码实现:

//1,根据 id='light' 获取 img 元素对象
var img = document.getElementById("light");
//2,修改 img 对象的 src 属性来改变图片
img.src = "../imgs/on.gif";
  1. 将所有的 div 标签的标签体内容替换为 呵呵
//1,获取所有的 div 元素对象
var divs = document.getElementsByTagName("div");
/*style:设置元素css样式innerHTML:设置元素内容*/
//2,遍历数组,获取到每一个 div 元素对象,并修改元素内容
for (let i = 0; i < divs.length; i++) {//divs[i].style.color = 'red';divs[i].innerHTML = "呵呵";
}
  1. 使所有的复选框呈现被选中的状态
    此案例我们需要看复选框元素对象有什么属性或者函数是来操作复选框的选中状态,下图是文档的查看
    在这里插入图片描述
//1,获取所有的复选框元素对象
var hobbys = document.getElementsByName("hobby");
//2,遍历数组,通过将 复选框 元素对象的 checked 属性值设置为 true 来改变复选框的选中状态
for (let i = 0; i < hobbys.length; i++) {hobbys[i].checked = true;
}

18.10 事件监听

要想知道什么是事件监听,首先先聊聊什么是事件?
HTML 事件是发生在 HTML 元素上的“事情”。比如:页面上的 按钮被点击鼠标移动到元素之上按下键盘按键 等都是事件。
事件监听是JavaScript 可以在事件被侦测到时执行一段逻辑代码。例如下图当我们点击 开灯 按钮,就需要通过 js 代码实现替换图片
在这里插入图片描述
再比如下图输入框,当我们输入了用户名 光标离开 输入框,就需要通过 js 代码对输入的内容进行校验,没通过校验就在输入框后提示 用户名格式有误!
在这里插入图片描述

18.10.1 事件绑定

JavaScript 提供了两种事件绑定方式:

  • 方式一:通过 HTML标签中的事件属性进行绑定
    如下面代码,有一个按钮元素,我们是在该标签上定义 事件属性,在事件属性中绑定函数。onclick 就是 单击事件 的事件属性。onclick='on()' 表示该点击事件绑定了一个名为 on() 的函数
<input type="button" onclick='on()'>

下面是点击事件绑定的 on() 函数

function on(){alert("我被点了");
}
  • 方式二:通过 DOM 元素属性绑定
    如下面代码是按钮标签,在该标签上我们并没有使用 事件属性,绑定事件的操作需要在 js 代码中实现
<input type="button" id="btn">

下面 js 代码是获取了 id='btn' 的元素对象,然后将 onclick 作为该对象的属性,并且绑定匿名函数。该函数是在事件触发后自动执行

document.getElementById("btn").onclick = function (){alert("我被点了");
}

代码演示:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><!--方式1:在下面input标签上添加 onclick 属性,并绑定 on() 函数--><input type="button" value="点我" onclick="on()"> <br><input type="button" value="再点我" id="btn"><script>function on(){alert("我被点了");}//方式2:获取 id="btn" 元素对象,通过调用 onclick 属性 绑定点击事件document.getElementById("btn").onclick = function (){alert("我被点了");}</script>
</body>
</html>

18.10.2 常见事件

上面案例中使用到了 onclick 事件属性,那都有哪些事件属性供我们使用呢?下面就给大家列举一些比较常用的事件属性

事件属性名说明
onclick鼠标单击事件
onblur元素失去焦点
onfocus元素获得焦点
onload某个页面或图像被完全加载
onsubmit当表单提交时触发该事件
onmouseover鼠标被移到某元素之上
onmouseout鼠标从某元素移开
  • onfocus 获得焦点事件。
    如下图,当点击了输入框后,输入框就获得了焦点。而下图示例是当获取焦点后会更改输入框的背景颜色。在这里插入图片描述
  • onblur 失去焦点事件。
  • 如下图,当点击了输入框后,输入框就获得了焦点;再点击页面其他位置,那输入框就失去焦点了。下图示例是将输入的文本转换为大写。
    在这里插入图片描述
  • onmouseout 鼠标移出事件。
  • onmouseover 鼠标移入事件。
  • 如下图,当鼠标移入到苹果图片上时,苹果图片变大;当鼠标移出苹果图片时,苹果图片变小。
    在这里插入图片描述
  • onsubmit 表单提交事件
    如下是带有表单的页面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><form id="register" action="#" ><input type="text" name="username" /><input type="submit" value="提交"></form><script></script>
</body>
</html>

如上代码的表单,当我们点击 提交 按钮后,表单就会提交,此处默认使用的是 GET 提交方式,会将提交的数据拼接到 URL 后。现需要通过 js 代码实现阻止表单提交的功能,js 代码实现如下:

  1. 获取 form 表单元素对象。
  2. form 表单元素对象绑定 onsubmit 事件,并绑定匿名函数。
  3. 该匿名函数如果返回的是true,提交表单;如果返回的是false,阻止表单提交。
 document.getElementById("register").onsubmit = function (){//onsubmit 返回true,则表单会被提交,返回false,则表单不提交return true;}

如上代码的表单,当我们点击 提交 按钮后,表单就会提交,此处默认使用的是 GET 提交方式,会将提交的数据拼接到 URL 后。现需要通过 js 代码实现阻止表单提交的功能,js 代码实现如下:

  1. 获取form表单氧元素对象
  2. 给form表单元素对象绑定onsubmit事件,并绑定匿名函数
  3. 该匿名函数如果返回的是true,提交表单;如果返回的是false,阻止表单提交。
document.getElementById("register").onsubmit=function(){
//onsubmit返回true,则表单会被提交,返回false,则表单不提交
return true;
}

18.11 表单验证案例

在这里插入图片描述
有如下注册页面,对表单进行校验,如果输入的用户名、密码、手机号符合规则,则允许提交;如果不符合规则,则不允许提交。
完成以下需求:

  1. 当输入框失去焦点时,验证输入内容是否符合要求

  2. 当点击注册按钮时,判断所有输入框的内容是否都符合要求,如果不合符则阻止表单提交

18.11.1 环境准备

下面是初始页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>欢迎注册</title><link href="../css/register.css" rel="stylesheet">
</head>
<body><div class="form-div"><div class="reg-content"><h1>欢迎注册</h1><span>已有帐号?</span> <a href="#">登录</a></div><form id="reg-form" action="#" method="get"><table><tr><td>用户名</td><td class="inputs"><input name="username" type="text" id="username"><br><span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span></td></tr><tr><td>密码</td><td class="inputs"><input name="password" type="password" id="password"><br><span id="password_err" class="err_msg" style="display: none">密码格式有误</span></td></tr><tr><td>手机号</td><td class="inputs"><input name="tel" type="text" id="tel"><br><span id="tel_err" class="err_msg" style="display: none">手机号格式有误</span></td></tr></table><div class="buttons"><input value="注 册" type="submit" id="reg_btn"></div><br class="clear"></form></div><script></script>
</body>
</html>

18.11.2 验证输入框

此小节完成如下功能:

  • 校验用户名。当用户名输入框失去焦点时,判断输入的内容是否符合长度是 6-12 位 规则,不符合使 id='username_err' 的span标签显示出来,给出用户提示。
  • 校验密码。当密码输入框失去焦点时,判断输入的内容是否符合 长度是 6-12 位 规则,不符合使 id='password_err' 的span标签显示出来,给出用户提示。
    校验手机号。当手机号输入框失去焦点时,判断输入的内容是否符合 长度是 11 位 规则,不符合使 id='tel_err' 的span标签显示出来,给出用户提示。
    代码如下:
//1. 验证用户名是否符合规则
//1.1 获取用户名的输入框
var usernameInput = document.getElementById("username");//1.2 绑定onblur事件 失去焦点
usernameInput.onblur = function () {//1.3 获取用户输入的用户名var username = usernameInput.value.trim();//1.4 判断用户名是否符合规则:长度 6~12if (username.length >= 6 && username.length <= 12) {//符合规则document.getElementById("username_err").style.display = 'none';} else {//不符合规则document.getElementById("username_err").style.display = '';}
}//1. 验证密码是否符合规则
//1.1 获取密码的输入框
var passwordInput = document.getElementById("password");//1.2 绑定onblur事件 失去焦点
passwordInput.onblur = function() {//1.3 获取用户输入的密码var password = passwordInput.value.trim();//1.4 判断密码是否符合规则:长度 6~12if (password.length >= 6 && password.length <= 12) {//符合规则document.getElementById("password_err").style.display = 'none';} else {//不合符规则document.getElementById("password_err").style.display = '';}
}//1. 验证手机号是否符合规则
//1.1 获取手机号的输入框
var telInput = document.getElementById("tel");//1.2 绑定onblur事件 失去焦点
telInput.onblur = function() {//1.3 获取用户输入的手机号var tel = telInput.value.trim();//1.4 判断手机号是否符合规则:长度 11if (tel.length == 11) {//符合规则document.getElementById("tel_err").style.display = 'none';} else {//不合符规则document.getElementById("tel_err").style.display = '';}
}

18.11.3 验证表单

    var regform = document.getElementById('reg-form');regform.onsubmit = testsubmit;function testsubmit() {var flag = checkUsername() && checkPassword() && checkTel();return flag;}

首先获得表单的DOM对象,之后通过onsubmit事件,使用dom.οnsubmit=函数名进行绑定,需要注意的是函数名不要带括号。

onsubmit 事件绑定的函数需要对输入的 用户名密码手机号 进行校验,这些校验我们之前都已经实现过了,这里我们还需要再校验一次吗?

不需要,只需要对之前校验的代码进行改造,把每个校验的代码专门抽象到有名字的函数中,方便调用;并且每个函数都要返回结果来去决定是提交表单还是阻止表单提交,代码如下:

//1. 验证用户名是否符合规则
//1.1 获取用户名的输入框
var usernameInput = document.getElementById("username");//1.2 绑定onblur事件 失去焦点
usernameInput.onblur = checkUsername;function checkUsername() {//1.3 获取用户输入的用户名var username = usernameInput.value.trim();//1.4 判断用户名是否符合规则:长度 6~12var flag = username.length >= 6 && username.length <= 12;if (flag) {//符合规则document.getElementById("username_err").style.display = 'none';} else {//不合符规则document.getElementById("username_err").style.display = '';}return flag;
}//1. 验证密码是否符合规则
//1.1 获取密码的输入框
var passwordInput = document.getElementById("password");//1.2 绑定onblur事件 失去焦点
passwordInput.onblur = checkPassword;function checkPassword() {//1.3 获取用户输入的密码var password = passwordInput.value.trim();//1.4 判断密码是否符合规则:长度 6~12var flag = password.length >= 6 && password.length <= 12;if (flag) {//符合规则document.getElementById("password_err").style.display = 'none';} else {//不合符规则document.getElementById("password_err").style.display = '';}return flag;
}//1. 验证手机号是否符合规则
//1.1 获取手机号的输入框
var telInput = document.getElementById("tel");//1.2 绑定onblur事件 失去焦点
telInput.onblur = checkTel;function checkTel() {//1.3 获取用户输入的手机号var tel = telInput.value.trim();//1.4 判断手机号是否符合规则:长度 11var flag = tel.length == 11;if (flag) {//符合规则document.getElementById("tel_err").style.display = 'none';} else {//不合符规则document.getElementById("tel_err").style.display = '';}return flag;
}

onsubmit 绑定的函数需要调用 checkUsername() 函数、checkPassword() 函数、checkTel() 函数。

    var regform = document.getElementById('reg-form');regform.onsubmit = testsubmit;function testsubmit() {var flag = checkUsername() && checkPassword() && checkTel();return flag;}

18.12 RegExp对象

RegExp 是正则对象。正则对象是判断指定字符串是否符合规则。

18.12.1 创建对象

正则对象有两种创建方式:

  • 直接量方式:注意不要加引号
var reg = /正则表达式/;

创建 RegExp 对象

var reg = new RegExp("正则表达式");

18.12.2 函数

test(str) :判断指定字符串是否符合规则,返回 true或 false

18.12.3 正则表达式

从上面创建正则对象的格式中可以看出不管哪种方式都需要正则表达式,那么什么是正则表达式呢?

正则表达式定义了字符串组成的规则。也就是判断指定的字符串是否符合指定的规则,如果符合返回true,如果不符合返回false。

正则表达式是和语言无关的。很多语言都支持正则表达式,Java语言也支持,只不过正则表达式在不同的语言中的使用方式不同,js 中需要使用正则对象来使用正则表达式。
正则表达式常用的规则如下:

  • ^:表示开始
  • $:表示结束
  • [ ]:代表某个范围内的单个字符,比如: [0-9] 单个数字字符
  • .:代表任意单个字符,除了换行和行结束符
  • \w:代表单词字符:字母、数字、下划线(),相当于 [A-Za-z0-9]
  • \d:代表数字字符: 相当于 [0-9]

量词:

  • +:至少一个
  • *:零个或多个
  • ?:零个或一个
  • {x}:x个
  • {m,}:至少m个
  • {m,n}:至少m个,最多n个

代码演示:

// 规则:单词字符,6~12
//1,创建正则对象,对正则表达式进行封装
var reg = /^\w{6,12}$/;var str = "abcccc";
//2,判断 str 字符串是否符合 reg 封装的正则表达式的规则
var flag = reg.test(str);
alert(flag);

18.12.4 改进表单校验案例

表单校验案例中的规则是我们进行一系列的判断来实现的,现在学习了正则对象后,就可以使用正则对象来改进这个案例。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>欢迎注册</title><link href="../css/register.css" rel="stylesheet">
</head>
<body><div class="form-div"><div class="reg-content"><h1>欢迎注册</h1><span>已有帐号?</span> <a href="#">登录</a></div><form id="reg-form" action="#" method="get"><table><tr><td>用户名</td><td class="inputs"><input name="username" type="text" id="username"><br><span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span></td></tr><tr><td>密码</td><td class="inputs"><input name="password" type="password" id="password"><br><span id="password_err" class="err_msg" style="display: none">密码格式有误</span></td></tr><tr><td>手机号</td><td class="inputs"><input name="tel" type="text" id="tel"><br><span id="tel_err" class="err_msg" style="display: none">手机号格式有误</span></td></tr></table><div class="buttons"><input value="注 册" type="submit" id="reg_btn"></div><br class="clear"></form></div><script>//1. 验证用户名是否符合规则//1.1 获取用户名的输入框var usernameInput = document.getElementById("username");//1.2 绑定onblur事件 失去焦点usernameInput.onblur = checkUsername;function checkUsername() {//1.3 获取用户输入的用户名var username = usernameInput.value.trim();//1.4 判断用户名是否符合规则:长度 6~12,单词字符组成var reg = /^\w{6,12}$/;var flag = reg.test(username);//var flag = username.length >= 6 && username.length <= 12;if (flag) {//符合规则document.getElementById("username_err").style.display = 'none';} else {//不合符规则document.getElementById("username_err").style.display = '';}return flag;}//1. 验证密码是否符合规则//1.1 获取密码的输入框var passwordInput = document.getElementById("password");//1.2 绑定onblur事件 失去焦点passwordInput.onblur = checkPassword;function checkPassword() {//1.3 获取用户输入的密码var password = passwordInput.value.trim();//1.4 判断密码是否符合规则:长度 6~12var reg = /^\w{6,12}$/;var flag = reg.test(password);//var flag = password.length >= 6 && password.length <= 12;if (flag) {//符合规则document.getElementById("password_err").style.display = 'none';} else {//不合符规则document.getElementById("password_err").style.display = '';}return flag;}//1. 验证手机号是否符合规则//1.1 获取手机号的输入框var telInput = document.getElementById("tel");//1.2 绑定onblur事件 失去焦点telInput.onblur = checkTel;function checkTel() {//1.3 获取用户输入的手机号var tel = telInput.value.trim();//1.4 判断手机号是否符合规则:长度 11,数字组成,第一位是1//var flag = tel.length == 11;var reg = /^[1]\d{10}$/;var flag = reg.test(tel);if (flag) {//符合规则document.getElementById("tel_err").style.display = 'none';} else {//不合符规则document.getElementById("tel_err").style.display = '';return flag;}//1. 获取表单对象var regForm = document.getElementById("reg-form");//2. 绑定onsubmit 事件regForm.onsubmit = function () {//挨个判断每一个表单项是否都符合要求,如果有一个不合符,则返回falsevar flag = checkUsername() && checkPassword() && checkTel();return flag;}
</script>
</body>
</html>

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

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

相关文章

android 使用MediaPlayer实现音乐播放--权限请求

在Android应用中&#xff0c;获取本地音乐文件的权限是实现音乐扫描功能的关键步骤之一。随着Android版本的不断更新&#xff0c;从Android 6.0&#xff08;API级别23&#xff09;开始&#xff0c;应用需要动态请求权限&#xff0c;而到了android 13以上需要的权限又做了进一步…

GPT系列文章

GPT系列文章 GPT1 GPT1是由OpenAI公司发表在2018年要早于我们之前介绍的所熟知的BERT系列文章。总结&#xff1a;GPT 是一种半监督学习&#xff0c;采用两阶段任务模型&#xff0c;通过使用无监督的 Pre-training 和有监督的 Fine-tuning 来实现强大的自然语言理解。在 Pre-t…

NUXT3学习日记四(路由中间件、导航守卫)

前言 在 Nuxt 3 中&#xff0c;中间件&#xff08;Middleware&#xff09;是用于在页面渲染之前或导航发生之前执行的函数。它们允许你在路由切换时执行逻辑&#xff0c;像是身份验证、重定向、权限控制、数据预加载等任务。中间件可以被全局使用&#xff0c;也可以只在特定页…

汽车免拆诊断案例 | 2012款路虎揽胜运动版柴油车加速无力

故障现象  一辆2012款路虎揽胜运动版车&#xff0c;搭载3.0T柴油发动机&#xff08;型号为306DT&#xff09;&#xff0c;累计行驶里程约为10.2万km。车主进厂反映&#xff0c;车辆行驶中加速无力&#xff0c;且发动机故障灯异常点亮。 故障诊断 接车后试车&#xff0c;发动…

网络安全与加密

1.Base64简单说明描述&#xff1a;Base64可以成为密码学的基石&#xff0c;非常重要。特点&#xff1a;可以将任意的二进制数据进行Base64编码结果&#xff1a;所有的数据都能被编码为并只用65个字符就能表示的文本文件。65字符&#xff1a;A~Z a~z 0~9 / 对文件进行base64编码…

C语言:数组转换指针的时机

1、指针数组 如果一个数组中的所有元素保存的都是指针&#xff0c;那么我们就称它为指针数组&#xff0c;指针数组的定义形式一般为&#xff1a; dataType *arrayName[length];[ ]的优先级高于*&#xff0c;该定义形式应该理解为&#xff1a; dataType *(arrayName[length])…

UE5 DownloadImage加载jpg失败的解决方法

DownloadImage加载jpg失败的解决方法 现象解决方案具体方法 现象 用UE自带的 DownloadImage 无法下载成功&#xff0c;从 failure 引脚出来。 接入一个由监控器自动保存起的图像&#xff0c;有些可以正常加载成功&#xff0c;有些无法加载成功。 经调查问题出现在&#xff0c;…

使用 helm 部署 gitlab

一、下载 Gitlab chart 进入 artifacthub 官网 选择你想要的版本&#xff08;我选择的chart版本是 8.4.0 , gitlab 版本是17.4.0 &#xff09; 进入到控制台&#xff0c;添加helm仓库 如果你想不改任何配置&#xff0c;你可以执行安装命令&#xff0c;等待安装即可helm instal…

FreeRTOS信号量(一)

目录 什么是信号量&#xff1f; 1.信号量简介 2.二值信号量 2.1二值信号量简介 1. 首先&#xff0c;创建时&#xff0c;二值信号量默认无效 2. 之后中断释放信号量 3.信号量获取成功 4、任务再次进入阻塞态 2.2 创建二值信号量 1、函数vSemaphoreCreateBinary () 2、…

51单片机-独立按键与数码管联动

独立键盘和矩阵键盘检测原理及实现 键盘的分类&#xff1a;编码键盘和非编码键盘 键盘上闭合键的识别由专用的硬件编码器实现&#xff0c;并产生键编码号或键值的称为编码键盘&#xff0c;如&#xff1a;计算机键盘。靠软件编程识别的称为非编码键盘&#xff1b;在单片机组成…

springboot课程答疑系统(代码+数据库+LW)

摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应师生交流形式的网站。本文介绍了课程答疑系统的开发全过程。通过分析企业对于课程答疑系统的需求&#xff0c;创建了一个计算机管理课程答疑系统的方案。文章…

解锁业务成功:大数据和 AI 如何协作以释放战略洞察

在当今这个数据主导的时代&#xff0c;大数据与AI的协同作用对于寻求竞争优势的组织而言愈发关键。大数据以其庞大的数据量、多样化的数据类型以及高速的数据生成能力&#xff0c;为AI算法提供了丰富的原材料&#xff0c;助力其挖掘出有价值的洞见&#xff0c;推动明智决策的制…

24.UE5枚举,怪物分类,龙卷风技能

2-26 枚举、怪物分类、龙旋风技能、掉落概率_哔哩哔哩_bilibili 目录 1.枚举 1.1枚举类型的创建 1.2 将枚举类型绑定到怪物蓝图上 1.3枚举类型的使用 1.3.1创建新的掉落物 1.3.2更改怪物掉落逻辑 2.龙卷风技能 2.1输入映射 2.2龙卷风发射物的创建 2.3龙卷风伤害逻辑…

故障字故障码 简单介绍

一、故障字 1.1故障字的概念 故障字&#xff08;Fault Word&#xff09;是一种常用的技术术语&#xff0c;主要应用在工业控制、嵌入式系统和通信领域&#xff0c;用于表示系统状态或故障信息。它是一个以位为单位的编码方式&#xff0c;每个位&#xff08;bit&#xff09;对应…

鸿蒙系统ubuntu开发环境搭建

在RISC-V等平台移植鸿蒙系统OpenHarmony&#xff0c;需要使用linux环境进行代码的编译&#xff0c;为兼顾日常办公需要&#xff0c;可采用WindowsUbuntu虚拟机的混合开发的环境&#xff0c;通过网络及文件夹共享&#xff0c;在主机和虚拟机之间共享文件数据。 工具准备&#x…

二叉树oj题解析

二叉树 二叉树的最近公共祖先什么是最近公共祖先&#xff1f;leetcode中求二叉树中最近公共祖先解题1.解题2. 根据二叉树创建字符串 二叉树的最近公共祖先 什么是最近公共祖先&#xff1f; 最近的公共祖先指的是这一棵树中两个节点中深度最大的且公共的祖先节点就是最近祖先节…

优先算法 —— 双指针系列 - 移动零

1. 移动零 题目链接&#xff1a; 283. 移动零 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/move-zeroes/description/ 2. 算法原理 其实像移动零这种类型的题目都有一个名字叫做数组划分&#xff08;数组分块&#xff09;&#xff0c;就是说先给一个…

C语言——数组逐元素操作练习

定义一个能容纳10个元素的整形数组a&#xff0c;从键盘读取9个整数存放到前9个数组元素中。 一. 从键盘读取一个整数n和位置p(0<p<8)&#xff0c;插入n到数组a中&#xff0c;插入位置&#xff1a;下标p。要求插入点及后续的数组元素都要后移动。 代码如下&#xff1a; …

【ArcGISPro】根据yaml构建原始Pro的conda环境

使用场景 我们不小心把原始arcgispro-py3的conda环境破坏了,我们就可以使用以下方法进行修复 查找文件 在arcgis目录下找到yaml文件 如果没找到请复制以下内容到新的yaml文件 channels: - esri - defaults dependencies: - anyio=4.2.0=py311haa95532_0 - appdirs=1.4.4=p…

解决IDEA报包不存在,但实际存在的问题

前言 最近在把一个亿老项目交割给同事&#xff0c;同事在导入项目运行时遇到IDEA报包不存在&#xff0c;但实际存在的问题&#xff0c;最终通过以下方式解决 现象 在IDEA里启动运行项目&#xff0c;报某个类有问题&#xff0c;引入的包不存在。 点击这个引入的包&#xff0c;可…