JavaScript基础
什么是JS
JS的作用
JS的组成
JS,全称JavaScript,是一种直译式脚本语言,是一种动态类型、弱类型、基于对象的脚本语言,内置支持类型。
JS语言和Java语言对比:
| 对比 | Java | JS |
|---|---|---|
| 运行环境 | JVM虚拟机 | JS引擎,是浏览器的一部分 |
| 是否跨平台运行 | 跨平台 | 跨平台 |
| 语言类型 | 强类型语言 | 弱类型,动态类型语言 |
| 是否需要编译 | 需要编译,是编译型语言 | 不需要编译,是解释型语言 |
| 是否区分大小写 | 区分大小写 | 区分大小写 |
具体来说,有两部分作用:
JS代码可以操作浏览器(BOM):进行网址跳转、历史记录切换、浏览器弹窗等等
JS代码可以操作网页(DOM):操作HTML的标签、标签的属性、样式、文本等等
注意:JS的是在浏览器内存中运行时操作,并不会修改网页源码,所以刷新页面后网页会还原
标签,把js代码写在标签体里<script>
//在这里写js代码
script>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>js引入方式-内部jstitle>
<script>
//操作浏览器弹窗
alert("hello, world");
script>
head>
<body>
body>
html>
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U8hvOJYZ-1663547106626)(img/1571279916433.png)]](https://1000bd.com/contentImg/2023/11/08/083621471.png)
.js标签引入外部js文件<script src="js文件的路径">script>
创建一个my.js文件,编写js代码
第1步:创建js文件
第2步:设置js文件名称
第3步:编写js代码
alert("hello, world! 来自my.js");
my.js文件DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>js引入方式-外部jstitle>
<script src="../js/my.js">script>
head>
<body>
body>
html>
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PkajohFa-1663547035189)(img/1571279953863.png)]](https://1000bd.com/contentImg/2023/11/08/083621475.png)
外部脚本
一个script标签,不能既引入外部js文件,又在标签体内写js代码。
<script src="../js/my.js">
alert("hello");
script>
<script src="../js/my.js">script>
<script>
alert("hello");
script>
alert(): 弹出警示框
console.log(): 向控制台打印日志
document.write(); 文档打印. 向页面输出内容.
按F12打开开发者工具
找到Source窗口,在左边找到页面,如下图

如果代码执行中出现异常信息,会在控制台Console窗口显示出来

点击可以定位到异常位置

alert();
console.log();
document.write();
int i = 10; var i = 10; 或者 i = 10;
String a = "哈哈"; let str = "哈哈"; 或者 str = "哈哈"; 或者 str = "哈哈"
...
注意:
1.var或者可以省略不写,建议保留
2.最后一个分号可以省略,建议保留
3.同时定义多个变量可以用","隔开,公用一个‘var’关键字. var c = 45,d='qwe',f='68';
1.五种原始数据类型
| 数据类型 | 描述 | 示例 |
|---|---|---|
number | 数值类型 | 1, 2, 3, 3.14 |
boolean | 布尔类型 | true, false |
string | 字符串类型 | "hello", ‘hello’ |
object | 对象类型 | new Date(), null |
undefined | 未定义类型 | var a; |
2.typeof操作符
作用: 用来判断变量是什么类型
写法:typeof(变量名) 或 typeof 变量名
null与undefined的区别:
null: 对象类型,已经知道了数据类型,但对象为空。
undefined:未定义的类型,并不知道是什么数据类型。
3.小练习
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script type="text/javascript">
var i = 5; //整数
var f = 3.14; //浮点
var b = true; //布尔
var c = 'a'; //字符串
var str = "abc"; //字符串
var d = new Date(); //日期
var u; //未定义类型
var n = null; //空
document.write("整数:" + typeof(i) + "
");
document.write("浮点 :" + typeof(f) + "
");
document.write("布尔:" + typeof(b) + "
");
document.write("字符:" + typeof(c) + "
");
document.write("字符串:" + typeof(str) + "
");
document.write("日期:" + typeof(d) + "
");
document.write("未定义的类型:" + typeof(u) + "
");
document.write("null:" + typeof(n) + "
");
</script>
</body>
</html>
字符串转换成数字类型
var i = 3;
var j = "6";
alert(j-i);//结果是3, "6" ==> 6
alert(j*i);//结果是18,
alert(j/i);//结果是2,
var i = 2;
var j = 5;
alert(j/i);
== 比较数值, === 比较数值和类型var i = 2;
var j = "2";
alert(i==j); // ==比较的仅仅是数值, true
alert(i===j); // ===比较的是数值和类型.false
<script>
//将数据装到表格中
document.write("")
for(let j=1;j<=9;j++){
//一行
document.write("")
for(let i=1;i<=j;i++){
//一个单元格
document.write("")
//每一个乘法表达式就是td中的内容
document.write(j+"x"+i+"="+(j*i))
document.write(" ")
}
document.write(" ")
}
document.write("
")
</script>
var a = 6;
if(a==1)
{
alert('语文');
}
else if(a==2)
{
alert('数学');
}
else
{
alert('不补习');
}
<script>
var str = "java";
switch (str){
case "java":
alert("java");
break;
case "C++":
alert("C++");
break;
case "Android":
alert("Android");
break;
}
</script>
var 定义function 函数名(形参列表){
函数体
[return 返回值;]
}
var result = 函数名(实参列表);
<script>
//js的函数的作用:为了封装代码,在要使用这些代码的地方直接调用函数
//js的函数的声明方式:1. 普通函数(命名函数) 2.匿名函数
//普通函数: function 函数名(参数名,参数名...){函数体},函数没有返回值类型,没有参数类型
function total(a,b,c) {
console.log("arguments数组中的数据:"+arguments.length)
console.log(a+","+b+","+c)
return a+b+c
}
//调用函数
//var num = total(1,2,3);
//console.log(num)
//js的函数还有俩特点:1. 函数声明时候的参数个数和函数调用时候传入的参数个数,可以不一致;因为函数内部有一个arguments数组,用于存放传入的参数
//2. js的函数是没有重载的,同名函数后面的会覆盖前面的
function total(a,b) {
return a+b
}
var num = total(1,2,3);
console.log(num)
script>
匿名函数,也叫回调函数,类似于Java里的函数式接口里的方法
function(形参列表){
函数体
[return 返回值;]
}
语法
function 函数名(参数列表){
函数体
[return ...]
}
function(参数列表){
函数体
[return ...]
}
特点
| 属性 | 此事件发生在何时… |
|---|---|
| onclick | 当用户点击某个对象时调用的事件句柄。 |
| ondblclick | 当用户双击某个对象时调用的事件句柄。 |
| onchange | 域的内容被改变。 |
| onblur | 元素失去焦点。 |
| onfocus | 元素获得焦点。 |
| onload | 一张页面或一幅图像完成加载。 |
| onsubmit | 确认按钮被点击;表单被提交。 |
| onkeydown | 某个键盘按键被按下。 |
| onkeypress | 某个键盘按键被按住。 |
| onkeyup | 某个键盘按键被松开。 |
| onmousedown | 鼠标按钮被按下。 |
| onmouseup | 鼠标按键被松开。 |
| onmouseout | 鼠标从某元素移开。 |
| omouseover | 鼠标移到某元素之上。 |
| onmousemove | 鼠标被移动。 |
说白了设置标签的属性
<标签 属性="js代码,调用函数">标签>
<script>
标签对象.事件属性 = function(){
//执行一段代码
}
script>
点击事件
需求: 没点击一次按钮 弹出hello…
<input type="button" value="按钮" onclick="fn1()">
<input type="button" value="另一个按钮" id="btn">
<script>
//当点击的时候要调用的函数
function fn1() {
alert("我被点击了...")
}
//给另外一个按钮,绑定点击事件:
//1.先根据id获取标签
let btn = document.getElementById("btn");
//2. 设置btn的onclick属性(绑定事件)
//绑定命名函数
//btn.onclick = fn1
//绑定匿名函数
btn.onclick = function () {
console.log("点击了另外一个按钮")
}
</script>
获得焦点(onfocus)和失去焦点(onblur)
需求:给输入框设置获得和失去焦点
var ipt = document.getElementById("ipt");
//绑定获取焦点事件
ipt.onfocus = function () {
console.log("获取焦点了...")
}
//绑定失去焦点事件
ipt.onblur = function () {
console.log("失去焦点了...")
}
内容改变(onchange)
需求: 给select设置内容改变事件
<body>
<!--内容改变(onchange)-->
<select onchange="changeCity(this)">
<option value="bj">北京</option>
<option value="sh">上海</option>
<option value="sz">深圳</option>
</select>
</body>
<script>
function changeCity(obj) {
console.log("城市改变了"+obj.value);
}
</script>
window.onload = function () {
//浏览器窗体加载完毕之后要执行的代码写到这里面
}
//给输入框绑定键盘按键按下和抬起事件
ipt.onkeydown = function () {
//当按键按下的时候,数据并没有到达输入框
//输出输入框里面的内容
//console.log(ipt.value)
}
ipt.onkeyup = function () {
//输出输入框的内容:当键盘按键抬起的时候,数据已经到达了输入框
console.log(ipt.value)
}
//给输入框绑定鼠标移入事件
ipt.onmouseover = function () {
console.log("鼠标移入了...")
}
//给输入框绑定鼠标移出事件
ipt.onmouseout = function () {
console.log("鼠标移出了...")
}
1. 绑定事件的方式:
1. 通过在标签上设置标签的属性,进行绑定,也就是通过命名函数(普通函数)进行绑定
2. 通过js代码获取到标签,然后设置标签的属性进行绑定,也就是通过匿名函数绑定事件
2. JS的常见的事件介绍:
1. onclick
2. ondblclick
3. onmouseover
4. onmouseout
5. onfocus 获取焦点
6. onblur 失去焦点
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
用我们自己的话来说: 正则表达式用来校验字符串是否满足一定的规则的公式
var reg = new RegExp("正则表达式")当正则表达式中有"/"那么就使用这种var reg = /正则表达式/一般使用这种声明方式| 方法 | 描述 | 参数 | 返回值 |
|---|---|---|---|
test(string) | 校验字符串的格式 | 要校验的字符串 | boolean,校验通过返回true |
| 符号 | 作用 |
|---|---|
| \d | 数字 |
| \D | 非数字 |
| \w | 英文字符:a-zA-Z0-9_ |
| \W | 非英文字符 |
| . | 通配符,匹配任意字符 |
| {n} | 匹配n次 |
| {n,} | 大于或等于n次 |
| {n,m} | 在n次和m次之间 |
| + | 1~n次 |
| * | 0~n次 |
| ? | 0~1次 |
| ^ | 匹配开头 |
| $ | 匹配结尾 |
| [a-zA-Z] | 英文字母 |
| [a-zA-Z0-9] | 英文字母和数字 |
| [xyz] | 字符集合, 匹配所包含的任意一个字符 |
需求:
步骤:
<script>
//1.出现任意数字3次
//a. 创建正则表达式
var reg1 = /^\d{3}$/; //出现任意数字3次
//b. 校验字符串
var str1 = "3451";
var flag1 = reg1.test(str1);
//alert("flag1="+flag1);
//2.只能是英文字母的, 出现6~10次之间
var reg2 =/^[a-zA-Z]{6,10}$/;
var str2 = "abcdef11g";
//alert(reg2.test(str2));
//3 用户名:只能由英文字母和数字组成,长度为4~16个字符,并且以英文字母开头
var reg3 =/^[a-zA-Z][a-zA-Z0-9]{3,15}$/;
var str3 = "zs";
// alert(reg3.test(str3));
//4. 手机号码: 以1开头, 第二位是3,4,5,6,7,8,9的11位数字
//var reg4 =/^1[3456789]\d{9}$/i; //忽略大小写的
var reg4 =/^1[3456789]\d{9}$/; //不忽略大小写的
var str4 = "188245899";
alert(reg4.test(str4));
</script>
var arr = new Array(size)var arr = new Array(element1, element2, element3, ...)var arr = [element1, element2, element3, ...];一般采用这种方式创建Listconsole.log(value) //1.数组定义方式
//1.1 方式一 new Array(size);
var array01 = new Array(4);
array01[0] = 1;
array01[1] = 2;
array01[2] = 3;
array01[3] = 99;
//1.2 方式二 new Array(ele,ele...);
var array02 = new Array(1, 2, 3, 99);
//1.3 方式三 [ele,ele]
var array03 = [1, 2, 3, 99];
//2.数组特点 ①js里面数组可以存放不同类型的数据 ②js里面的数组可变, 没有越界的概念
var array04 = [1, 2, 3, "哈哈"];
//console.log(array04[0]); //1
//console.log(array04[3]); //"哈哈"
//console.log(array04[5]); //在Java里面是数组越界 js里面是undefined
console.log(array04.length); //4
array04[6] = "你好"; //[1,2,3,"哈哈",undefined,undefined,"你好"]
console.log(array04.length); //7
| 方法 | 描述 |
|---|---|
| concat() | 连接两个或更多的数组,并返回结果。 |
| join() | 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。 |
| reverse() | 颠倒数组中元素的顺序。 |
//3.常用的方法
//3.1 concat() 连接两个或更多的数组,并返回结果。【重点】
var array05 = [1, 2, 3, 4];
var array06 = ["哈哈", "你好", 100, 200];
var array07 = array05.concat(array06);
console.log(array07);
//3.2 join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。
var str = array05.join("**");
console.log(str);
//3.3 reverse() 颠倒数组中元素的顺序。
array06 = array06.reverse();
console.log(array06);
//4.二维数组
//方式一:
var citys = new Array(3);
citys[0] = ["深圳", "广州", "东莞", "惠州"];
citys[1] = ["武汉", "黄冈", "黄石", "鄂州", "荆州"];
citys[2] = ["济南", "青岛", "烟台", "淄博", "聊城"];
var citys02 = [
["深圳", "广州", "东莞", "惠州"],
["武汉", "黄冈", "黄石", "鄂州", "荆州"],
["济南", "青岛", "烟台", "淄博", "聊城"]
];
for (var i = 0; i < citys02.length; i++) {
var cityArray = citys02[i];
console.log(cityArray);
for(var j = 0;j<=cityArray.length;j++){
console.log(cityArray[j]);
}
}
var array = new Array(size); //定义了没有赋值
var array = new Array(ele,ele,ele); //定义了并且赋值了
var array = [ele,ele,ele]; //定义了并且赋值了
创建当前日期:var date = new Date()
创建指定日期:var date = new Date(年, 月, 日)
注意:月从0开始,0表示1月
创建指定日期时间:var date = new Date(年, 月, 日, 时, 分, 秒)
注意:月从0开始,0表示1月
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>日期title>
head>
<body>
<script>
//创建当前日期
var date1 = new Date();
console.log(date1);
//创建指定日期: 2019-11-11
var date2 = new Date(2019, 10, 11);
console.log(date2);
//创建指定日期时间:2019-11-11 20:10:10
var date3 = new Date(2019, 10, 11, 20, 10, 10);
console.log(date3);
script>
body>
html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fJVa7Dcs-1663547035201)(img/1571473450137.png)]
| 方法 | 描述 |
|---|---|
| Date() | 返回当日的日期和时间。 |
| getDate() | 从 Date 对象返回一个月中的某一天 (1 ~ 31)。 |
| getDay() | 从 Date 对象返回一周中的某一天 (0 ~ 6)。 |
| getMonth() | 从 Date 对象返回月份 (0 ~ 11)。 |
| getFullYear() | 从 Date 对象以四位数字返回年份。 |
| getHours() | 返回 Date 对象的小时 (0 ~ 23)。 |
| getMinutes() | 返回 Date 对象的分钟 (0 ~ 59)。 |
| getSeconds() | 返回 Date 对象的秒数 (0 ~ 59)。 |
| getMilliseconds() | 返回 Date 对象的毫秒(0 ~ 999)。 |
| getTime() | 返回 1970 年 1 月 1 日至今的毫秒数(时间戳)。 |
| parse() | 返回1970年1月1日午夜到指定日期(字符串)的毫秒数。 |
| setDate() | 设置 Date 对象中月的某一天 (1 ~ 31)。 |
| setMonth() | 设置 Date 对象中月份 (0 ~ 11)。 |
| setFullYear() | 设置 Date 对象中的年份(四位数字)。 |
| setYear() | 请使用 setFullYear() 方法代替。 |
| setHours() | 设置 Date 对象中的小时 (0 ~ 23)。 |
| setMinutes() | 设置 Date 对象中的分钟 (0 ~ 59)。 |
| setSeconds() | 设置 Date 对象中的秒钟 (0 ~ 59)。 |
| setMilliseconds() | 设置 Date 对象中的毫秒 (0 ~ 999)。 |
| setTime() | 以毫秒设置 Date 对象。 |
| toLocaleString() | 根据本地时间格式,把 Date 对象转换为字符串。 |
<script>
//1.创建日期对象
var myDate = new Date();
//2.调用方法
console.log("年:" + myDate.getFullYear());
console.log("月:" + (myDate.getMonth()+1));
console.log("日:" + myDate.getDate());
console.log("时:" + myDate.getHours());
console.log("分:" + myDate.getMinutes());
console.log("秒:" + myDate.getSeconds());
console.log("毫秒:" + myDate.getMilliseconds());
console.log(myDate.toLocaleString()); //打印本地时间 2019-12-06 12:02:xx
//console.log(myDate);
//获取某个时间的时间戳
var time = myDate.getTime();
console.log(time)
//需求:计算到11放假还有多少天
var date5 = new Date(2020,9,1);
var date6 = new Date(2020,6,9);
var totalTime = date5.getTime() - date6.getTime();
var days = totalTime/(1000*60*60*24);
console.log(days)
</script>
Browser Object Model ,浏览器对象模型. 为了便于对浏览器的操作,JavaScript封装了浏览器中各个对象,使得开发者可以方便的操作浏览器中的各个对象。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BkJR6H9p-1663547035202)(img/tu_1.bmp)]
| 方法 | 作用 |
|---|---|
| alert() | 显示带有一段消息和一个确认按钮的警告框 |
| confirm() | 显示带有一段消息以及确认按钮和取消按钮的对话框 |
| prompt() | 弹出输入框 |
| setInterval(‘函数名()’,time) | 按照指定的周期(以毫秒计)来调用函数或计算表达式 |
| setTimeout(‘函数名()’,time) | 在指定的毫秒数后调用函数或计算表达式 |
| clearInterval() | 取消由 setInterval() 设置的 Interval()。 |
| clearTimeout() | 取消由 setTimeout() 方法设置的 timeout。 |
//1. 警告框
//window.alert("hello")
//2. 确认框
/*let flag = confirm("你确定要删除吗?");
console.log(flag)*/
//3. 输入框
let age = prompt("请输入你的年龄");
if (parseInt(age) >= 18) {
alert("可以访问")
}else {
alert("请大一点了再访问")
}
//定时器的话就是隔一段事件执行一个任务
//1. setTimeout(),只执行一次的定时器,其实也就相当于一个延时器
//第一个参数是要执行的匿名函数,第二个参数是执行时间
/*setTimeout(function () {
document.write("hello world")
},3000)*/
//2. setInterval(),循环执行的定时器
//第一个参数是要执行的匿名函数,第二个参数是间隔时间,该方法的返回值是这个定时器id
let i = 0
var id = setInterval(function () {
i ++
document.write("你好世界
")
//我们还有一个方法,clearInterval(定时器的id)清除定时器
if (i == 5) {
clearInterval(id)
}
},2000);
| 属性 | 作用 |
|---|---|
| appName | 返回浏览器的名称 |
| appVersion | 返回浏览器的平台和版本信息 |
| 方法 | 作用 |
|---|---|
| width | 返回显示器屏幕的分辨率宽度 |
| height | 返回显示屏幕的分辨率高度 |
| 方法 | 作用 |
|---|---|
| back() | 加载 history 列表中的前一个 URL |
| forword() | 加载 history 列表中的下一个 URL |
| go() | 加载 history 列表中的某个具体页面 |
| 属性 | 作用 |
|---|---|
| host | 设置或返回主机名和当前 URL 的端口号 |
| href | 设置或返回完整的 URL |
| port | 设置或返回当前 URL 的端口号 |
location.href; 获得路径
location.href = “http://www.baidu.com”; 设置路径,跳转到百度页面
documentElementAttributeText[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7vJ3od0B-1663547035203)(img\dom树.png)]
一切皆节点, 一切皆对象
| 方法 | 描述 | 返回值 |
|---|---|---|
document.getElementById(id) | 根据id获取标签 | Element对象 |
document.getElementsByName(name) | 根据标签name获取一批标签 | Element类数组 |
document.getElementsByTagName(tagName) | 根据标签名称获取一批标签 | Element类数组 |
document.getElementsByClassName(className) | 根据类名获取一批标签 | Element类数组 |
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>获取标签的方法介绍title>
head>
<body>
<div id="d1" name="n1">hello div1div>
<div class="c1">hello div2div>
<span class="c1">hello span1span>
<span name="n1">hello span2span>
<script>
//根据id获取标签
//console.log(document.getElementById("d1"))
//根据name获取标签的数组
//console.log(document.getElementsByName("n1"))
//根据标签名获取标签
//console.log(document.getElementsByTagName("div"))
//根据类名获取标签
//console.log(document.getElementsByClassName("c1"))
//扩展俩方法:1. 获取单个标签
//console.log(document.querySelector("#d1"))
//2. 获取多个标签
console.log(document.querySelectorAll("span"))
script>
body>
html>
| 方法 | 描述 | 返回值 |
|---|---|---|
document.createElement(tagName) | 创建标签 | Element对象 |
parentElement.appendChild(sonElement) | 插入标签 | |
element.remove() | 删除标签 |
<body>
<ul id="city">
<li>北京li>
<li id="sh">上海li>
<li>深圳li>
<li>广州li>
ul>
<input type="button" value="添加" onclick="addCity()">
<input type="button" value="删除" onclick="removeCity()">
<script>
//点击添加按钮,往城市列表的最后面添加"长沙"
function addCity() {
//1. 创建一个li标签
var liElement = document.createElement("li");
//2. 设置li标签体的文本内容为"长沙"
liElement.innerText = "长沙"
//3. 往id为city的ul中添加一个子标签
//3.1 获取id为city的ul
var city = document.getElementById("city");
//3.2 往city里面添加子标签
city.appendChild(liElement)
}
//点击删除按钮,删除上海
function removeCity() {
//要删除某一个标签: 那个标签.remove()
document.getElementById("sh").remove()
}
script>
body>
document.createElement(tagName) 创建标签 Element对象document.createTextNode("文本") 创建文本节点parentElement.appendChild(sonElement) 插入标签element.remove() 删除标签标签对象.innerHTML标签对象.innerHTML = "新的HTML代码";
innerHTML是覆盖式设置,原本的标签体内容会被覆盖掉;DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>操作标签体title>
head>
<body>
<div id="city"><h1>北京h1>div>
<script>
//获取id为city的那个标签的标签体的内容
var innerHTML = document.getElementById("city").innerHTML;
console.log(innerHTML)
//设置id为city的标签体的内容
document.getElementById("city").innerHTML = "深圳
"
script>
body>
html>
标签对象.innerHTML;
标签对象,innerHTML = "html字符串";
Element对象提供了操作属性的方法| 方法名 | 描述 | 参数 |
|---|---|---|
getAttribute(attrName) | 获取属性值 | 属性名称 |
setAttribute(attrName, attrValue) | 设置属性值 | 属性名称, 属性值 |
removeAttribute(attrName) 了解即可 | 删除属性 | 属性名称 |
<body>
<input type="password" id="pwd">
<input type="button" value="显示密码" onmousedown="showPassword()" onmouseup="hidePassword()">
<script>
//目标:按住显示密码按钮的时候,就显示密码框中的密码; 按键松开的时候,就隐藏密码
//1. 给按钮绑定onmousedown事件
function showPassword() {
//让密码框的密码显示: 修改密码框的type属性为text
document.getElementById("pwd").setAttribute("type","text")
}
//2. 给按钮绑定onmouseup事件
function hidePassword() {
//就是设置密码框的type为password
document.getElementById("pwd").setAttribute("type","password")
//getAttribute(属性名),根据属性名获取属性值
var type = document.getElementById("pwd").getAttribute("type");
console.log(type)
}
script>
body>
getAttribute(attrName) 获取属性值setAttribute(attrName, attrValue) 设置属性值removeAttribute(attrName) 删除属性