写给女朋友看的JavaScript教程

1. 啥是 javascript

1.1 简介

JavaScript 是运行在浏览器上的脚本语言,简称 JS。也就是说我们按照它的规范写一段 JS 代码,然后用浏览器打开,我们就能看到运行之后的效果了。

JS 还可以放在 HTML 代码中,浏览器会解释并执行 HTML 和 JS 代码。

那学这玩意有什么用?

比如有一天你想给女朋友做个表白网站,来证明一下自己的技术水平。

但是因为你之前只学了 html 和 css,再加上审美不是多好,可能你做成了这个B样:

女朋友看完你做的网站立马把你微信拉黑了。后来你奋发图强学会了JS,学会了如何制作特效,于是你又用 JS 给女朋友做了个表白网站:

女朋友看完又跟你和好了。

我们从上面坎坷的爱情故事中知道 JS 可以制作动态效果,可以挽救一段支离破碎的爱情。

哈哈哈,有点扯淡了。

其实JS的案例在我们日常生活中很常见,例如淘宝首页的轮播图:

登录网站时的账号校验:

这些网页的动态效果都是用 JS 技术完成的。

如果把 html 比作网页的骨架,那么 css 就是网页的外观样式。而 JS 就是人与网页交互之后产生的动态效果。

1.2 规范

JS 代码规范:

  • HTML 中关于 JS 的代码必须位于 script 标签之间。
  • JS 代码可以位于 bodyhead 标签中。
  • HTML 页面中可以包含多个 script 标签。

例如:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>一颗雷布斯</title>
    <script>
        document.write("<h1>好好学习,天天向上!</h1>");
    </script>
</head>

<body>
    <script>
        document.write("<h2>人生贵在坚持,难在坚持!</h2>");
    </script>
    <script>
        document.write("<h3>马上2022年了,当时立的flag实现了吗?</h3>");
    </script>
</body>
</html>
复制代码

运行结果:

2. 变量

变量就像一个房子,里面可以存东西。

JS 中使用 var 关键字声明变量,例如:

var name;
复制代码

声明之后我们可以给变量赋值,例如:

name = "一颗雷布斯";
复制代码

我们还可以在声明的同时给变量赋值,例如:

var name = "一颗雷布斯";
复制代码

我们还可以在一行语句中声明多个变量,例如:

var name ="一颗雷布斯",age = 23,school = "哈尔滨佛教大学";
复制代码

:在 JS 代码中,如果我们使用了未赋值的变量,那么变量的值将会是undefined,意思是未定义的。

3. JS 三要素

3.1 ECMAScript

ECMAScript 规定了 JS 语言的组成部分:语法、类型、语句、关键字、保留字、操作符、对象。

说白了 ECMAScript 定义了 JS 都有啥东西,需要遵守啥规范。ECMAScript 最新版本是 ES6 。

3.2 DOM

3.2.1 DOM 简介

当我们写的 HTML 代码被浏览器加载运行时,浏览器会创建页面的文档对象模型:Document Object Model,简称 DOM。

DOM 是树形结构的,它长这个样子:

从上面可以看出,DOM 模型其实就是 HTML 代码的框架。

那 JS 中的 DOM 模型干啥用的?

DOM 模型告诉我们如何使用 JS 代码操作 HTML 中的元素以及元素的属性和文本信息

例如通过 JS 代码动态修改 img 标签里的图片、修改 p 标签里面的文本信息等。

从上图我们可以看出 DOM 节点分为三大类:元素节点、属性节点、文本节点。其中文本节点、属性节点都属于元素节点的子节点。

如果把 DOM 模型当做一棵树,那元素节点就是树枝,而属性节点和文本节点就是果子。所以我们要想摘到果子,必须先找到果子所在的树枝。

也就是说我们要想修改属性节点和文本节点的值,必须先找到他们所在的元素节点。例如要想修改 P 标签的文本信息,必须先找到是哪个 P 标签。

那如何使用 JS 代码修改元素的属性值和文本信息呢?

3.2.2 获取元素节点

要想摘果子,必先找树枝。首先我们先看一下 JS 中获取元素节点的常用方法:

  1. 根据 id 属性获取元素节点
var 变量 = document.getElementById("id的值")
复制代码

例如:

<body>
    <p id="p1">中国人不骗中国人!</p>
    <script>
      var p = document.getElementById("p1");
      console.log(p);
    </script>
</body>
复制代码

注:

我们可以使用 console.log() 在浏览器的控制台输出结果。
就像我们在 java 中使用 System.out.print() 一样。
复制代码

运行结果:

注: 我们知道 id 属性是唯一的,所以如果在 html 中定义了 id 属性一样的多个元素,JS 代码只会获取第一个元素。

  1. 根据 name 属性获取元素节点
var 变量 = document.getElementsByName("name的值");
复制代码

例如:

<body>
    <button name="btn1">我是个时髦的按钮</button>
    <script>
      var btn = document.getElementsByName("btn1");
      console.log(btn);
    </script>
</body>
复制代码

运行结果:

  1. 根据标签名获取元素节点
var 变量 = document.getElementsByTagName("标签");
复制代码

例如:

<body>
    <p>床前明月光</p>
    <button>我是个时髦的按钮</button>
    <script>
      var btn = document.getElementsByTagName("button");
      console.log(btn);
    </script>
</body>
复制代码

运行结果:

  1. 根据 class 属性获取元素节点
var 变量 = document.getElementsByClassName("class的值");
复制代码

例如:

<body>
    <p class="p1">床前明月光</p>
    <button class="b1">我是个时髦的按钮</button>
    <script>
      var p = document.getElementsByClassName("p1");
      console.log(p);
    </script>
</body>
复制代码

运行结果:

注:后面三个获取的元素节点都是数组类型。

3.2.3 获取/设置属性值

拿到元素节点后,我们就可以操作它的属性了。

  1. 获取属性节点的值:getAttribute
var 变量 = 元素节点.getAttribute("属性名");
复制代码

例一:

<body>
    <p id="p1" name="静夜思">床前明月光</p>
    <script>
      var p = document.getElementById("p1");
      var name = p.getAttribute("name");
      console.log(name);
    </script>
</body>
复制代码

运行结果:

例二:

<body>
    <p class="p2" name="李白">床前明月光</p>
    <script>
        // 注意:getElementsByClassName  getElementsByName getElementsByTagName 获取的元素节点是数组
      var p = document.getElementsByClassName("p2");
      var name = p[0].getAttribute("name");
      console.log(name);
    </script>
</body>
复制代码

运行结果:

  1. 设置属性节点
  元素节点.setAttribute("属性名","属性值");
复制代码

例如:

<body>
    <p id="p1" name="哈哈哈哈哈哈哈哈哈">床前明月光</p>
    <script>
        // 注意:getElementsByClassName  getElementsByName getElementsByTagName 获取的元素节点是数组
      var p = document.getElementById("p1");
      p.setAttribute("name","没错,我就是李白!")
      console.log(p.getAttribute("name"));
    </script>
</body>
复制代码

运行结果:

3.2.4 修改 CSS 样式

  1. 使用 .style 设置单个属性

例如:

<body>
    <p id="p1" name="哈哈哈哈">床前明月光</p>
    <p id="p2" name="吼吼吼吼">床前明月光</p>
    <script>
        // 注意:getElementsByClassName  getElementsByName getElementsByTagName 获取的元素节点是数组
        var p = document.getElementById("p2");
        p.style.fontSize = "20px";
    </script>
</body>
复制代码

注:属性名要用驼峰命名法

  1. 使用 .style 设置多个属性

例如:

<body>
    <p id="p1" name="哈哈哈哈">床前明月光</p>
    <p id="p2" name="吼吼吼吼">床前明月光</p>
    <script>
        // 注意:getElementsByClassName  getElementsByName getElementsByTagName 获取的元素节点是数组
        var p = document.getElementById("p2");
        p.style = "font-size:30px;color:red";
    </script>
</body>
复制代码

运行结果:

3.2.5 获取/设置文本信息

  • .innerText:获取或设置节点里面的文字内容;

例如:

<body>
    <p id="p1" name="哈哈哈哈">床前明月光</p>
    <p id="p2" name="吼吼吼吼">疑是地上霜</p>
    <script>
        // 注意:getElementsByClassName  getElementsByName getElementsByTagName 获取的元素节点是数组
        var p = document.getElementById("p2");
        console.log(p.innerText);
        p.innerText="举头望明月";
        console.log(p.innerText);
    </script>
</body>
复制代码

运行结果:

  • .innerHTML:获取或设置节点里面的HTML代码;

例如:

<body>
    <p id="p1" name="哈哈哈哈">床前明月光</p>
    <p id="p2" name="吼吼吼吼">疑是地上霜</p>
    <script>
        // 注意:getElementsByClassName  getElementsByName getElementsByTagName 获取的元素节点是数组
        var p = document.getElementById("p2");
        console.log(p.innerHTML);
        p.innerHTML="<h1>哈哈哈哈哈哈</h1>";
        console.log(p.innerHTML);
    </script>
</body>
复制代码

运行结果:

3.3 BOM

BOM 全称 Browser Object Model ,也就是浏览器对象模型 。主要是和浏览器打交道。

BOM 定义了操作浏览器的一些规范:包括对象和对象的方法。

3.3.1 window 对象

在浏览器中有个最高级的对象:window,它相当于皇上。

页面中所有东西都属于浏览器,也都属于 window 对象,所以我们可以使用 window 对象操作所有的对象和方法。

window 相当于一个全局的变量,因为页面中一切都属于 window ,所以它可以省略。

相关方法

  1. 弹出框:alert

例如:

<body>
    <script>
       window.alert("我爱我的祖国!!!");
    </script>
</body>
复制代码

运行结果:

因为 window 是一个全局变量,所以可以省略,效果一样。例如:

<body>
    <script>
      alert("两岸猿声啼不住,轻舟已过万重山!");
    </script>
</body>
复制代码

运行结果:

2. 确认框:confirm

例如:

<body>
    <script>
      confirm("你确定你要做我女朋友吗?");
    </script>
</body>
复制代码

运行效果:

  1. 控制台打印:console
<body>
    <script>
      window.console.log("你是电!");
      // window 是全局变量,可以省略
      console.log("我是光!")
    </script>
</body>
复制代码

运行结果:

  1. 间隔一段时间操作一次:setInterval

语法格式:

setInterval("函数",间隔的毫秒数);
复制代码

例如:

<script>
  setInterval(
      function (){
          document.writeln("我爱你中国!");
      }
  ,300);
</script>
复制代码

运行结果:

  1. 延迟一段时间之后再操作:setTimeout()

语法格式:

setTimeout("函数",延迟的毫秒数);
复制代码

例如:

<script>
  setTimeout(
      function () {
          document.writeln("床前明月光,<br>");
      }
      , 1000);
  setTimeout(
      function () {
          document.writeln("疑是地上霜。<br>");
      }
      , 2000);
  setTimeout(
      function () {
          document.writeln("举头望明月,<br>");
      }
      , 3000);
  setTimeout(
      function () {
          document.writeln("低头思故乡。<br>");
      }
      , 4000);
</script>
复制代码

运行结果:

  1. window.onload

该方法用于在网页加载完毕后立刻执行的操作,即当 html 加载完毕后,立刻执行某个方法等。

因为页面中的代码一般情况下按照从上到下,从左到右的顺序执行。

如果 script 标签在元素标签的前面,这时候 html 页面还没有加载完毕,还没有构建 DOM 树形模型。那么 JS 代码就获取不到元素节点,就会报错。例如:

<body>
    <script>
        var p = document.getElementById("p1");
        document.write(p.innerText);
    </script>
    <p id="p1">改革春风吹满地,中国人民真争气!</p>
</body>
复制代码

所以当使用 js 代码获取页面中的元素节点时,如果 script 标签在元素的前面,需要加 window.onload。如果 script 在元素节点后面,就不需要加 window.onload。

使用方法:

  1. 把 JS 中要执行的程序放在如下代码中:
  window.onload = function () { 
            要执行的代码;
        }
复制代码

例如:

<body>
    <script>
        window.onload = function () {
            var p = document.getElementById("p1");
            document.write(p.innerText);
        }
    </script>
    <p id="p1">改革春风吹满地,中国人民真争气!</p>
</body>
复制代码
  1. 在 body 标签里面执行:

先将要执行的代码放到一个函数里面,然后在 body 标签使用 onload 加载该方法,例如:

<body onload="getText()">
    <script>
        function getText() {
            var p = document.getElementById("p1");
            document.write(p.innerText);
        }
    </script>
    <p id="p1">改革春风吹满地,中国人民真争气!</p>
</body>
复制代码

3.3.2 doument 对象

document 对象是 window 的子对象,我们在前面获取元素节点的时候讲过,这里就不再赘述了。

3.3.3 loation 对象

location 对象是 window 的子对象,包含有关当前 URL 的信息。

我们可以通过 window.location 属性来访问,当然也可以省略 window。

  1. 跳转到新页面

语法格式:

 window.location= "新页面";
 window.location.href="新页面";
复制代码

例如:

<body>
    <script>
        window.location= "https://www.baidu.com/";
    </script>
</body>
复制代码
  1. 刷新页面
location.reload();
复制代码

4. 输出语句

我们在前面讲过使用 alert 可以弹出信息,使用 innerHTML 可以修改文本信息,使用 console.log() 在浏览器控制台打印信息。

其实 JS 还可以使用 write 方法将内容直接写到 HTML 页面中,语法格式:

document.write("内容");
复制代码

例如:

<script>
    document.write("<h2>改革春风吹满地,</h2>");
    document.write("<h2>中国人民真争气。<h2>");
</script>
复制代码

运行结果:

5. 数据类型

JS 中主要包含一下几种数据类型:

数据类型 描述
String 字符串
Number 数字
Boolean 布尔
Null 空值
Undefined 未定义
Object 对象
Array 数组
Function 函数

6.对象

6.1 属性

前面我们在学 java 的时候讲过类与对象的关系,JS 中的对象和 JAVA 中的对象是一样的,都拥有属性和方法。

在 JS 中,对象也是一个变量。对象可以包含多个属性,每个属性也是一个变量。属性用 name:value 表示。例如:

 var user = { name: "Jay", age: "42", job: "singer" };
复制代码

有了对象,那我们如何获取对象的属性呢?有两种方式:

  1. 方式一
对象.属性名
复制代码

例如:

<script>
  var person = { name: "Jay", age: "42", job: "singer" };
  document.write("<h3>姓名:"+person.name+"</h3>");
  document.write("<h3>年龄:"+person.age+"</h3>");
  document.write("<h3>职业:"+person.job+"</h3>");
  document.write("<h1>5年都没发新专辑了!!</h1>");
</script>
复制代码

运行结果:

  1. 方式二
对象["属性名"];
复制代码

例如:

<script>
    var person = { name: "Jay", age: "42", job: "singer" };
    document.write("<h3>姓名:"+person["name"]+"</h3>");
</script>
复制代码

运行结果:

6.2 方法

除了属性,对象还可以拥有方法,创建对象方法的语法格式:

方法名:function(){ 代码 }
复制代码

例如:

var person = {
    firstName: "Kobe",
    lastName : "Bryant",
    job:"basketball star",
    fullName : function() 
    {
         return this.firstName + " " + this.lastName;
      }
};
复制代码

访问对象的方法:

对象.方法名()
复制代码

例如:

<script>
  var person = {
      firstName: "Kobe",
      lastName: "Bryant",
      job: "basketball star",
      fullName: function () {
          return this.firstName + " " + this.lastName;
      }
  };
   document.write("完整名字:"+person.fullName());
</script>
复制代码

运行结果:

7. 函数

JS 中的函数其实就是方法,它可以被重复调用。当调用函数时,会执行函数中的代码块。

函数的语法格式:

function 函数名(参数)
{
    // 代码
}
复制代码

注: 关键字 function 必须小写。

调用函数的语法格式:

函数名(参数);
复制代码

例一:调用无参无返回值函数

<script>
  // 1. 定义无参数无返回值函数
  function confirmInfo() {
      confirm("杰伦你明年要发新专辑了吗?");
  }
  // 2. 调用函数
  confirmInfo();
</script>
复制代码

运行结果:

例二:调用有参数函数

<script>
  // 1. 定义有参数无返回值的函数
  function printInfo(name) {
      document.write("一个叫<span style='color:red;font-size:20px'>"+name+"</span>的歌手竟然5年不发新专辑!");
  }
  // 2. 调用函数
  printInfo("周杰伦");
</script>
复制代码

运行结果:

例三:调用有返回值函数

 <script>
  // 1. 定义有参数有返回值的函数
  function printInfo(name) {
     return name;
  }
  // 2. 调用函数
  var singer =  printInfo("周杰伦");
  document.write("一个叫<h1 style='color:red;font-size:20px'>"+singer+"</h1>的歌手竟然5年不发新专辑!");
</script>
复制代码

运行结果:

8. 内置函数

除了自定义函数,JS 还内置一些函数。

8.1 日期函数

日期函数用于处理日期和时间。

例如:

<script>
  var d = new Date();
  // 获取当年年份
  var year = d.getFullYear();
  // 获取当前月份,js 中月份是个特殊值, 介于0 ~11
  var month = d.getMonth() + 1;
  // 获取当前天数
  var day = d.getDate();
  // 返回星期几
  var week = d.getDay();
  // 返回小时
  var hour = d.getHours();
  // 返回分钟
  var minute = d.getMinutes();
  // 返回秒
  var second = d.getSeconds();
  // 返回当前时间的时间戳
  var time = d.getTime();
  document.write("中国标准时间:"+d+"<br>");
  document.write("时间戳:"+time+"<br>");
  document.write(year + "-" + month + "-" + day + " " + hour + ":" + minute+":"+second+"  星期 "+week);
  // 刷新页面
  location.reload();
</script>
复制代码

运行结果:

8.2 数组函数

创建数组方式:

方式一:

var animals = new Array();
animals[0] = "cat";      
animals[1] = "dog";
animals[2] = "pig";
复制代码

方式二:

var animals = new Array("cat","dog","pig");
复制代码

方式三:

var animals = ["cat","dog","pig"];
复制代码

下面用案例讲解 JS 中操作数组的方法:

8.2.1 返回数组长度

   var arr= [1,12,8,30];
   var len = arr.length;
   console.log(len);//结果为4
复制代码

8.2.2 将数组合并成字符串

  var arr= [1,12,8,30];
  var str = arr.join(",");
  console.log(str)
复制代码

打印结果:

8.2.3 添加元素:push 和 unshift

  • push 是在数组尾部添加元素
  • unshift 是在数组头部添加元素
 var arr = [1,12,8,30];
 arr.push(99);
 arr.unshift(100);
 console.log(arr);
复制代码

打印结果:

8.2.4 替换元素:splice

  • 第一个参数,要替换的元素的下标。注:数组下标从0开始
  • 第二个参数:替换的元素的个数,从第一个下标开始
  • 第三个参数:要替换成什么
 var arr = [1,12,8,30];
 arr.splice(2,1,"66");
 console.log(arr);
复制代码

打印结果:

8.2.5 删除元素:pop 和 splice

  • pop 是删除数组最后一个元素
  • splice 是根据元素下标删除元素,第一个参数:要删除的元素的初始坐标,第二个参数:要删除的元素个数
var arr = [1,12,8,30];
arr.pop();// 删除 30
arr.splice(0,1);// 删除 1
console.log(arr);
复制代码

打印结果:

8.2.6 数组倒序

var arr = [1,12,8,30];
arr.reverse();
console.log(arr);
复制代码

打印结果:

8.2.7 过滤条件返回新的数组:filter

 var arr = [1,12,8,30];
 const newArr = arr.filter(item => item >2);
 console.log(arr);
 console.log(newArr);
复制代码

打印结果:

8.2.8 合并多个数组:concat

var a = [1,12,8,30];
var b = [666,777];
var c = a.concat(b);
console.log(c);
复制代码

打印结果:

8.2.9 返回指定数组:slice

  • slice 不会改变原来数组的值
  • 第一个参数:要返回的数组的初始坐标
  • 第二个参数:返回数组元素的个数
var arr = [1,12,8,30];
var newArr = arr.slice(0,2);
console.log(arr);
console.log(newArr);
复制代码

打印结果:

9. 事件

事件是发生在 HTML 页面上的事情,我们可以使用 JS 来处理这些事件。

事件可以是浏览器的行为,也可以是用户的行为。例如浏览器加载页面时、用户点击按钮时都可以触发一些事件。

注: JS 中触发一个事件之后,一般会调用函数执行其中的一些代码。

下面讲一下常见的 HTML 事件:

9.1 点击事件:onclick

<body>
  <button onclick="alertInfo()">点击弹出信息</button>
  <script>
      function alertInfo(){
        alert("希望你在2022年好事成真!");
      }
  </script>
</body>
复制代码

运行结果:

9.2 元素改变:onchange

<body>
 <label >姓名:</label> <input type="text" value="张无忌" onchange="alertInfo(this.value)">
  <script>
      function alertInfo(value){
        alert(value);
      }
  </script>
</body>
复制代码

运行结果:

9.3 鼠标悬浮:onmouseover

当鼠标移动到该区域,就会触发该事件。

<body>
  <p onmousemove="alertInfo()">女朋友你把鼠标移过来!</p>
  <script>
      function alertInfo(){
        alert("女朋友我爱你!");
      }
  </script>
</body>
复制代码

运行结果:

9.4 鼠标移开:onmouseout

当鼠标离开该区域,就会触发该事件。

<body>
  <p onmouseleave="alertInfo()">女朋友可千万别把鼠标移走!</p>
  <script>
      function alertInfo(){
        alert("爱我别走!");
      }
  </script>
</body>
复制代码

运行结果:

9.5 用户按下键盘按键:onkeydown

<body>
  <input type="text" name="" id="" onkeydown="alertInfo()">
  <script>
      function alertInfo(){
        alert("祝你考研上岸!考公上岸!暴富!");
      }
  </script>
</body>
复制代码

9.6 失去焦点:οnblur

鼠标离开该输入框就会触发该事件。

<body>
  <input type="text" name="" id="" onblur="alertInfo()">
  <script>
      function alertInfo(){
        alert("祝你考研上岸!考公上岸!暴富!");
      }
  </script>
</body>
复制代码

运行结果:

9.7 获取焦点:οnfοcus

当鼠标点击输入框就会触发该事件

<body>
  <input type="text" value="测试获取焦点" onfocus="testOnfocus()"/>
  <script>
      function testOnfocus(){
        alert("祝你考研上岸!考公上岸!暴富!");
      }
  </script>
</body>
复制代码

运行结果:

10. JSON

JSON 是一种格式,通常用于服务端向前端传递数据 。

JSON 语法规则:

  • 数据为 键/值 对
  • 数据由逗号分隔
  • 大括号保存对象
{"name":"jay", "job":"singer"}, 
复制代码
  • 方括号保存数组
[
    {"name":"jay", "job":"singer"}, 
    {"name":"jj", "job":"singer"}
]
复制代码

11. JS 小案例:轮播图

轮播图就是隔一段时间就会切换一张图片。

所以我们要想做轮播图,只需要三步:

  • 页面先初始化一张照片
  • 调用时间间隔函数 setInterval,然后修改图片的 src 属性的值
  • 当显示最后一张照片时,就替换成第一张照片

例如:

<body>
  <!-- 1.初始化一张照片 -->
  <img style="width:600px;height:350px" src="image/1.jpg" width="100%" id="img1" />
  <script>
    // 2. 每隔一段时间调用修改图片的方法
    setInterval("changeImg()", 1000);
   
    var i = 0
    // 3. 修改图片
    function changeImg() {
      i++;
      // 修改图片路径
      document.getElementById("img1").src = "image/" + i + ".jpg";
      // 当为最后一张图片时,就替换成第一张图片
      if (i == 3) {
        i = 0;
      }
    }
  </script>
</body>
复制代码

运行结果:

猜你喜欢

转载自juejin.im/post/7039917131626414088