3. JS

3.JavaScript

1. JavaScript简介

JavaScript 是一门跨平台、面向对象的脚本语言,而Java语言也是跨平台的、面向对象的语言,只不过Java是编译语言,是需要编译成字节码文件才能运行的;JavaScript是脚本语言,不需要编译,由浏览器直接解析并执行。

  • 改变页面内容

在这里插入图片描述

当我点击上面左图的 点击我 按钮,按钮上面的文本就改为上面右图内容,这就是js 改变页面内容的功能。

  • 修改指定元素的属性值
    在这里插入图片描述

    当我们点击上图的 开灯 按钮,效果就是上面右图效果;当我点击 关灯 按钮,效果就是上面左图效果。其他这个功能中有两张灯泡的图片(使用img标签进行展示),通过修改 img 标签的 src 属性值改变展示的图片来实现。

  • 对表单进行校验

在这里插入图片描述

2,JavaScript引入方式

JavaScript 引入方式就是 HTML 和 JavaScript 的结合方式。JavaScript引入方式有两种:

  • 内部脚本:将 JS代码定义在HTML页面中
  • 外部脚本:将 JS代码定义在外部 JS文件中,然后引入到 HTML页面中

2.1 内部脚本

在 HTML 中,JavaScript 代码必须位于 <script></script> 标签之间

2.2 外部脚本

第一步:定义外部 js 文件。如定义名为 demo.js的文件

项目结构如下:

在这里插入图片描述

demo.js 文件内容如下:

alert("hello js");

第二步:在页面中引入外部的js文件

在页面使用 script 标签中使用 src 属性指定 js 文件的 URL 路径。

3. JavaScript基础语法

3.1 输出语句

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

  • 使用 window.alert() 写入警告框

在这里插入图片描述

使用 document.write() 写入 HTML 输出
在这里插入图片描述

使用 console.log() 写入浏览器控制台

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3tfaKKXb-1666091173787)(D:\typora\java路线学习\java Web\图片\image-20220928185536553.png)]

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
    

针对如上的问题,==ECMAScript 6 新增了 let 关键字来定义变量。==它的用法类似于 var,但是所声明的变量,只在 let 关键字所在的代码块内有效,且不允许重复声明。(即局部变量且不重复)

例如:

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

运行上面代码,浏览器并没有弹框输出结果,说明这段代码是有问题的。通过 F12 打开开发者模式可以看到如下错误信息

而如果在代码块中定义两个同名的变量,IDEA 开发工具就直接报错了

在这里插入图片描述

ECMAScript 6 新增了 const关键字,用来声明一个只读的常量。一旦声明,常量的值就不能改变。 通过下面的代码看一下常用的特点就可以了

在这里插入图片描述

3.3 运算符

JavaScript 提供了如下的运算符。大部分和 Java语言 都是一样的,不同的是 JS 关系运算符中的 =====

3.5.1 ==和===区别

概述:

  • ==:

    1. 判断类型是否一样,如果不一样,则进行类型转换

    2. 再去比较其值

  • ===:js 中的全等于

    1. 判断类型是否一样,如果不一样,直接返回false
    2. 再去比较其值

代码:

var age1 = 20;
var age2 = "20";

alert(age1 == age2);// true
alert(age1 === age2);// false
3.5.2 类型转换
  • 其他类型转为number

    • string 转换为 number 类型:按照字符串的字面值,转为数字。如果字面值不是数字,则转为NaN

      将 string 转换为 number 有两种方式:

      • 使用 + 正号运算符:

        var str = +"20";
        alert(str + 1) //21
        
      • 使用 parseInt() 函数(方法):

        var str = "20";
        alert(parseInt(str) + 1);
        

      建议使用 parseInt() 函数进行转换。

    • boolean 转换为 number 类型:true 转为1,false转为0

      var flag = +false;
      alert(flag); // 0
      
  • 其他类型转为boolean

    • number 类型转换为 boolean 类型:0和NaN转为false,其他的数字转为true
    • string 类型转换为 boolean 类型:空字符串转为false,其他的字符串转为true
    • null类型转换为 boolean 类型是 false
    • undefined 转换为 boolean 类型是 false

3.6 流程控制语句

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

  • if
  • switch
  • for
  • while
  • dowhile

3.7 函数

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

3.7.1 定义格式

函数定义格式有两种:

  • 方式1

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

    var 函数名 = function (参数列表){
        要执行的代码
    }
    

注意:

  • 形式参数不需要类型。因为JavaScript是弱类型语言

    function add(a, b){
        return a + b;
    }
    

    上述函数的参数 a 和 b 不需要定义数据类型,因为在每个参数前加上 var 也没有任何意义。

  • 返回值也不需要定义类型,可以在函数内部直接使用return返回即可

3.7.2 函数调用

函数调用函数:

函数名称(实际参数列表);

eg:

let result = add(10,20);

注意:

  • JS中,函数调用可以传递任意个数参数

  • 例如 let result = add(1,2,3);

    它是将数据 1 传递给了变量a,将数据 2 传递给了变量 b,而数据 3 没有变量接收

4. JavaScript常用对象

4.1 Array对象

方式一
var arr = new Array(1,2,3);
alert(arr);

方式二
var arr2 = [1,2,3];
//alert(arr2);

访问
arr2[0] = 10;
alert(arr2)

4.1.1 特点

JavaScript 中的数组相当于 Java 中集合。数组的长度是可以变化的,而 JavaScript 是弱类型,所以可以存储任意的类型的数据。

例如如下代码:

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

上面代码在定义数组中给了三个元素,又给索引是 10 的位置添加了数据 10,那么 索引3索引9 位置的元素是什么呢?我们之前就介绍了,在 JavaScript 中没有赋值的话,默认就是 undefined

如果给 arr3 数组添加字符串的数据,也是可以添加成功的

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

Array 对象提供了很多属性,如下图是官方文档截取的

在这里插入图片描述

而我们只讲解 length 属性,该数组可以动态的获取数组的长度。而有这个属性,我们就可以遍历数组了

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

Array 对象同样也提供了很多方法,如下图是官方文档截取的
在这里插入图片描述

4.2 String对象

String对象的创建方式有两种

  • 方式1:

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

    var 变量名 = "数组"; 
    

属性:

String对象提供了很多属性,下面给大家列举了一个属性 length ,该属性是用于动态的获取字符串的长度

在这里插入图片描述

函数:

String对象提供了很多函数(方法),下面给大家列举了两个方法。
在这里插入图片描述

String对象还有一个函数 trim() ,该方法在文档中没有体现,但是所有的浏览器都支持;它是用来去掉字符串两端的空格。

trim() 函数在以后开发中还是比较常用的,例如登陆界面

4.3 自定义对象

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

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

调用属性的格式:

对象名.属性名

调用函数的格式:

对象名.函数名()

5. BOM

BOM 中包含了如下对象:

  • Window:浏览器窗口对象
  • Navigator:浏览器对象
  • Screen:屏幕对象
  • History:历史记录对象
  • Location:地址栏对象

5.1 Window对象

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

5.1.1 获取window对象

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

  • 显式使用 window 对象调用

    window.alert("abc");
    
  • 隐式调用

    alert("abc")
    
5.1.2 window对象属性

window 对象提供了用于获取其他 BOM 组成对象的属性

在这里插入图片描述

也就是说,我们想使用 Location 对象的话,就可以使用 window 对象获取;写成 window.location,而 window. 可以省略,简化写成 location 来获取 Location 对象。

5.1.3 window对象函数

window 对象提供了很多函数供我们使用,而很多都不常用;下面给大家列举了一些比较常用的函数

在这里插入图片描述

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

5.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>

5.2 History对象

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

  • History 对象的获取

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

  • History 对象的函数

    在这里插入图片描述

    这两个函数我们平时在访问其他的一些网站时经常使用对应的效果,如下图

    在这里插入图片描述

    当我们点击向左的箭头,就跳转到前一个访问的页面,这就是 back() 函数的作用;当我们点击向右的箭头,就跳转到下一个访问的页面,这就是 forward() 函数的作用。

5.3.2 Location对象属性

Location对象提供了很对属性。以后常用的只有一个属性 href

在这里插入图片描述
image-20210815225707580

代码演示:

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

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

5.3.3 案例

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

分析:

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

代码实现:

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

6. DOM

6.1 概述

封装的对象分为

  • Document:整个文档对象
  • Element:元素对象
  • Attribute:属性对象
  • Text:文本对象
  • Comment:注释对象

如下图,左边是 HTML 文档内容,右边是 DOM 树

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2vLNOgmy-1666091173787)(D:\typora\java路线学习\java Web\图片\image-20210815231028430.png)]

作用:

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

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

6.2 获取 Element对象

HTML 中的 Element 对象可以通过 Document 对象获取,而 Document 对象是通过 window 对象获取。

Document 对象中提供了以下获取 Element 元素对象的函数

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

7. 事件监听

7.1 概述

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

  • 方式一:通过 HTML标签中的事件属性进行绑定

    如下面代码,有一个按钮元素,我们是在该标签上定义 事件属性,在事件属性中绑定函数。onclick 就是 单击事件 的事件属性。onclick='on()' 表示该点击事件绑定了一个名为 on() 的函数

    <input type="button" οnclick='on()’>
    

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

    function on(){
    	alert("我被点了");
    }
    
  • 方式二:通过 DOM 元素属性绑定

    如下面代码是按钮标签,在该标签上我们并没有使用 事件属性,绑定事件的操作需要在 js 代码中实现

    <input type="button" id="btn">
    

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

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

7.2 常见事件

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

事件属性名说明
onclick鼠标单击事件
onblur元素失去焦点
onfocus元素获得焦点
onload某个页面或图像被完成加载
onsubmit当表单提交时触发该事件
onmouseover鼠标被移到某元素之上
onmouseout鼠标从某元素移开
  • onfocus 获得焦点事件。

    如下图,当点击了输入框后,输入框就获得了焦点。而下图示例是当获取焦点后会更改输入框的背景颜色。

    在这里插入图片描述

  • onblur 失去焦点事件。

    如下图,当点击了输入框后,输入框就获得了焦点;再点击页面其他位置,那输入框就失去焦点了。下图示例是将输入的文本转换为大写。

    在这里插入图片描述

  • onmouseout 鼠标移出事件。

  • onmouseover 鼠标移入事件。

    如下图,当鼠标移入到 苹果 图片上时,苹果图片变大;当鼠标移出 苹果图片时,苹果图片变小。

    在这里插入图片描述

  • onsubmit 表单提交事件

8,表单验证案例

8.1 需求

在这里插入图片描述

有如下注册页面,对表单进行校验,如果输入的用户名、密码、手机号符合规则,则允许提交;如果不符合规则,则不允许提交。

完成以下需求:

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

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

8.2 环境准备

。。。

8.3 验证输入框

此小节完成如下功能:

  • 校验用户名。当用户名输入框失去焦点时,判断输入的内容是否符合 长度是 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~12
    if (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~12
    if (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 判断手机号是否符合规则:长度 11
    if (tel.length == 11) {
        //符合规则
        document.getElementById("tel_err").style.display = 'none';
    } else {
        //不合符规则
        document.getElementById("tel_err").style.display = '';
    }
}

8.3 验证表单

当用户点击 注册 按钮时,需要同时对输入的 用户名密码手机号 ,如果都符合规则,则提交表单;如果有一个不符合规则,则不允许提交表单。实现该功能需要获取表单元素对象,并绑定 onsubmit 事件

//1. 获取表单对象
var regForm = document.getElementById("reg-form");

//2. 绑定onsubmit 事件
regForm.onsubmit = function () {
    
}

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~12
    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~12
    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
    var 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() 函数。

//1. 获取表单对象
var regForm = document.getElementById("reg-form");

//2. 绑定onsubmit 事件
regForm.onsubmit = function () {
    //挨个判断每一个表单项是否都符合要求,如果有一个不合符,则返回false

    var flag = checkUsername() && checkPassword() && checkTel();

    return flag;
}

document.getElementById(“tel”);

//1.2 绑定onblur事件 失去焦点
telInput.onblur = checkTel;

function checkTel() {
//1.3 获取用户输入的手机号
var tel = telInput.value.trim();

//1.4 判断手机号是否符合规则:长度 11
var 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()` 函数。

```js
//1. 获取表单对象
var regForm = document.getElementById("reg-form");

//2. 绑定onsubmit 事件
regForm.onsubmit = function () {
    //挨个判断每一个表单项是否都符合要求,如果有一个不合符,则返回false

    var flag = checkUsername() && checkPassword() && checkTel();

    return flag;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值