JavaScript 基础了解

JavaScript

简介

  • JS是一种脚本语言

  • ECMAScript

    • JS 核心语法:ES 规范 / ECMA - 262 标准
  • DOM:Document Object Model;文档对象模型

    • 对网页中节点进行增删改的过程
    • HTML 文档被当作一颗 DOM 树看待
      • var domObj = document.getElementById("id")
  • BOM:Browser Object Model;浏览器模型对象

    • 关闭浏览器、打开浏览器新窗口、后退、前进、地址栏地址等都是 BOM 编程
  • DOM 和 BOM

    • DOM 顶级对象:document;页面对象

    • BOM 顶级对象:window,窗口对象

    • 实际上 BOM 包括 DOM

ECMAScript

  • JS 是事件驱动型语言,依靠事件驱动执行对应程序
    • JS 中有很多事件,事件对应都有事件句柄作为 html 标签属性存在
  • JS 中有内置对象可以直接使用
    • window:代表浏览器对象
      • 函数 alert:弹窗
        • window.alert('弹窗消息'):进行弹窗
        • window 可以省略
    • 内置对象 document:代表当前 html 页面
  • JS 中字符串使用双引号 "",或单引号 '' 表示
    • 匹配最近的相同类型引号,所以外层引号和内层不能相同
  • JS 中一条语句结束后可以使用 ; 也可以不用
嵌入 JS
事件
  • HTML 中嵌入 JS 代码方式一:事件

    • 鼠标单击事件:click
    • 对应事件句柄 onclick 作为 html 的标签属性存在
    <body>
        <input type="button" value="0" onclick="直接写 js 代码">
        <!-- 单击弹窗事件 -->
        <input type="button" value="1" onclick="window.alter('二狗')">
        <input type="button" value="2" onclick="alter('二狗')">
    </body>
    
    • onclick = "js 代码"
      • 页面加载时 js 代码并不执行,仅将代码注册到对应事件上
      • 单击事件发生的时候 js 代码自动被浏览器调用执行
脚本块
  • HTML 中嵌入 JS 代码方式二:脚本块

    • <!-- type 类型默认定义是 text/javascript -->
      <script type="text/javascript">
      	// 脚本块内部可以写 js 代码,加载页面时直接执行
          window.alert("二狗"); 
      </script>
      
  • 暴露在脚本块中的程序在页面加载时执行

    • 遵循自上而下的顺序逐行执行,不需额外事件
      • 自定义函数未调用时不执行
    • alert 函数会阻塞页面加载,确定之后才会继续执行语句
  • 脚本块可以放到页面任何位置,甚至 <html>标签之外

    • 脚本块在页面中出现次数没有要求
引入
  • HTML 中嵌入 JS 代码方式三:引入外部独立的 js 文件

    • <body>
      	<script tup="text/javascript" src="js/1.js">
          	// 引用文件时写在脚本块中内容不被执行
          </script> <!-- 结束标签不能省略 -->
          <!-- 再次单独使用脚本块会继续执行 -->
      </body>
      
  • js 代码写在单独的文件中,在需要时进行引用

    • src="js/1.js":通过外部 js 文件路径引用
  • 引用外部 js 文件时文件中代码会遵循自上而下顺序依次执行

    • 同一个文件可以被多次引用,但没有必要
  • 引用是必须是双标签<script></script>

    • 不能是自闭标签
标识符
  • 标识符命名规范:按照 Java 标准
    • 字母、数字、下划线、$
    • 不能以数字开头
    • 不能使用关键字命名
    • 驼峰命名,见名知意
    • 常量名全部大写,单词之间下划线分隔
变量
  • JavaScript 是弱类型语言

    • Java 是强类型语言:变量数据类型在编译时已经确定,不可变
      • 强制类型转换只是在语法层面改变
  • 声明变量:var 变量名 = 值

    • var 是以往 JS 定义变量的 bug 级方式
      • 现在推荐使用 let 定义 JS 变量,使用 const 定义 JS 常量
    • 无编译阶段,变量可以随意赋值,赋值任意类型
    • undefined:在 js 中是一个具体存在的值
      • 变量仅声明未赋值:默认值 undefined
      • 变量未声明时不能使用
    • 可以同时声明多个变量,使用时无要求
  • <body>
    	<script type="text/javascript">
            'use strict'  		// 启用严格检查模式,不允许未定义变量直接使用
            // 默认赋值 i = undefined
            var i;  			// 定义变量 i,可以重新使用 i 定义变量
            let a;  			// 定义变量,不允许重新定义变量 a
            const B = 23;   	// 定义常量 B,不允许重新赋值
            alert("i = " + i);
            var a, b, c; 		// 声明变量,此时 a 报错误,不能重新声明变量
    	</script>
    </body>
    
  • 局部变量 和 全局变量

    • 全局变量:函数体之外声明

      • 生命周期:浏览器打开时声明,关闭时销毁
      • 尽量少用,会在浏览器内存中一直存在,耗费内存空间
    • 局部变量:函数体之内声明,包括函数的形参

      • 生命周期:函数开始执行是开辟内存空间,执行结束后释放空间
      • 生命周期较短
    • 变量声明时若没有 var 则必定是全局变量

      • 全局变量默认绑定在 window 上
      • 无论在哪里声明
严格模式
  • 'use strict'

    • 启用严格检查模式,不允许未定义变量直接使用
    • 语法检测按照 ES6 标准更加严格
    • 写在 <script> 脚本块中第一行
  • 所有的全局变量都会绑定到 window 对象

    • 不同的 js 文件使用相同名称的全局变量时会发生冲突

      • 解决:定义唯一全局变量 var onlyOne = {}
      • 将所有全局变量都绑定到其上面
      const onlyOne = {}  		  // 定义唯一全局变量,即常量
      onlyOne.name = "张三";  		// 将其他全局变量绑定到 onlyOne
      // 将所有代码都放到自定义命名空间 onlyOne 中
      
  • 局部作用域:let 定义局部变量,ES 6 引入

    • 解决局部作用域冲突的问题
    • 不能重新定义同名变量
  • 常量定义:const,ES 6 引入

数据类型
分类
  • JS 中变量没有数据类型,但是赋值的时候有数据类型

  • 分为 原始类型 和 引用类型

    • ES6 之前有6种,ES6 有 7 种
      • ES:ECMAScript 规范
  • 原始类型:

    • Null:只有值 null

    • Undefined:只有一个值 undefined

      • null 和 undefined 可以等同

      • 变量仅声明未赋值时默认赋值 undefined,或手动进行赋值

    • Boolean:只有 true、false 两个值

      • if()while() 函数会将参数转为 boolean 类型
    • Number:包括所有数值类型NaN,包括无穷大

      • infinity:无穷大;除数为 0 结果为无穷大
      • NaN:运算结果本应是数字,但运算完之后不是数字则结果为 NaN
        • 和所有数字类型都不相等,包括自身
    • String

      • JS 中字符串可使用 ""‘’
      • 转义字符 \
      • `` 之间可以连续写多行,无需拼接字符串
    • 引用类型:Object 及其 子类

      • Object 是所有类型的超类,自定义类都继承 Object
      • 包含在其他 JScript 对象中
        • 其他所有对象中它的方法和属性都可用
    • ES6 之后又添加一种 Symbol

比较
  • JS 中有运算符 typeof 在程序运行阶段动态获取变量的数据类型
    • 格式:typeof 变量名 ,运算结果是六个字符串之一(小写)
      • 'undefined''number''string''boolean'
      • 'object''function'
  • JS 中比较字符串相等使用 ==:判断值相等,意思是等同运算符
    • alert(1 == true):结果 true
      • 1 等同于 true
  • 运算符 ===:判断值和数据类型相等,意思是全等运算符
    • alert(1 === true):结果 false
      • 数据类型不同
var i = null;  		// Null 类型
alert(typeof i); 	// 结果是 "object"
function say(){}  	// 定义函数
alert(typeof say) 	// 结果是 "function"
String
  • 创建方式:var a = “String”
    • 称为小String,原始 String 类型
  • JS 内置支持类 String:var a = new String("String")
    • 被称为大String,Object 类型
  • 大小String 函数、属性通用
  • String 是内置支持类,可直接使用,父类是 Object
  • 字符串拼接
    • 使用 ${} 引用变量在字符串中动态拼接
    • 可以跨行拼接无需 + 拼接
      • 使用 ""'' 拼接字符跨行时需要使用 + 连接
let a = "aa";
let b = 'bb';
let c = 'cc' +
    	'dd';				// 需要使用 + 连接进行跨行
let resutl = `动态拼接
			  ${a}${b}`; 	// 结果:aabb;无需 + 连接
Object
  • JS 中定义的类默认继承 Object

    • 会拥有所有 Object 类的属性和函数
  • 属性

    • protoType:常用,给类动态扩展属性和函数

    • constructor

  • 函数

    • toString()

    • valueOf()

    • toLocaleString()

定义类
  • JS 中类的定义同时是构造函数的定义
    • 类定义和函数定义在一起完成
    • 可以在函数体内嵌套函数
  • 使用 protoType 属性动态扩展属性及函数
    • 可以给任何类拓展函数、属性
      • 包括内置类型
  • 使用 new 就是将函数当作类使用创建对象
    • 否则作为函数调用
// 定义类两种方式
function 类名(形参){}
类名 = function(形参){}

// 创建对象
new 构造方法名(实参);  				// 构造方法名和类名一致

/* 示例 */
// 定义类 Demo,或认为是函数 Demo
function Demo(name, age, hobby){
    this.name = name,
    this.age = age,
    this.hobby = hobby,
    sex = "男"
}
demo("二狗", 18); 		 			// 将 Demo 作为函数调用
var obj = new Demo("二狗");    		// 将 Demo 作为类创建对象;obj 是一个引用,保存地址指向堆中的对象
alert( obj.name );  				 // 访问对象属性,通过 .
alert( obj["age"] );				 // 访问对象属性,通过 []

// 利用 prototype 属性拓展 Demo 类函数:拓展函数 getHobby()
Demo.prototype.getHobby = function(){
    return this.hobby;
};
var hobby = obj.getHobby();
alert(hobby);
对象
// 定义 js 对象
var demo = {
    name: "张三",
    age : 18,
    sex : "男"
}
document.writeln(demo.age);  	// 18
delete demo.age  				// 删除 age 属性值
document.writeln(demo.age);  	// undefined
demo.age = 20  					// 添加 age 属性
document.writeln(demo.age);  	// 20
document.write('age' in demo) 	// 判断 demo 对象中是否有 age 属性
原型模式
  • 以另一个对象作为当前对象原型
    • 即 继承
  • prototype 属性即类原型
  • 原型链:所有类的父类总是指向 Object 类
    • Object 的原型是它自身,无限循环
// 定义 js 对象
var demo = {
    name: "张三",
    age : 18,
    sex : function (){
        return this.age > 15 ? "男" : "女";
    }
}
var demo2 = {
    age : 10
}
// 以 demo 对象为 demo2 的原型
demo2._proto_ = demo
var sex = demo2.sex
document.write(sex)
class
  • 继承;ES 6 新增特性
  • 本质上还是使用原型模式
    • 但是更符合 Java 写法
// 定义类
class Demo {
    // 构造函数
    constructor(name) {
        this.name = name
    }
    // 普通函数
    say(){
        alert("hello")
    }
}
let demo = new Demo();  	// 创建对象
demo.say();   				// 调用方法

// 类 Demo2 继承 Demo
class Demo2 extends Demo{
    constructor() {
        super();
    }
    hello(){}
}
let demo2 = new Demo2()
Map、Set

ES6 标准新增,用法跟 Java 相似

  • Map:key 不允许重
    • 添加重复 key 时更新对应的的 value
  • Set:值不允许重复
    • 重复的值不会添加;无序
let map = new Map;   			     // 创建 map
map.set("name", "张三")			   // 添加元素
map.get("name")						// 根据 key 获取元素
map.forEach(function (demo){ 		// 遍历map
    document.writeln(demo)   		// demo 是 map 中的 value 值
})

// for of 遍历 Map,得到 K-V 数组,分别取出
for (let mapElement of map) {
       document.writeln(mapElement[0] + ': ' + mapElement[1] + "<br/>")
   }
document.write("<br/>")

let set =  new Set 						// 创建 set
set.add(19)								// 添加元素
set.delete(19)							// 删除元素
set.has(19)								// 判断是否有元素
set.forEach(function (value){ 			// 遍历set
    document.writeln(value + "<br/>")	// 得到 set 中的元素
})
Array
  • 数组:var arr = []

    • 数组元素类型、数量随意
    • 赋值的下标随意,自动扩容
      • 未赋值的位置统一 undefined

    var arr = new Array()

    • 不传参默认长度为 0
    • 传一个参数定义数组长度
    • 传多个参数直接将元素添加到数组
  • 数组长度可赋值

    • 赋值后若大于原长度会对数组扩容
    • 否则将丢失后面数据
  • JS 中数组可以自动模拟栈结构:先进后出

    • push():追加到数组尾部
    • pop():弹出尾部元素
    • unshift():压入头部元素
    • shift():弹出头部元素
  • 函数

    • slice():截取 Array 部分返回新数组
    • sort():排序
    • reverse:元素反转
    • concat():拼接数组,返回新数组,未修改原数组
    • join():连接符,打印拼接数组使用特定字符串连接
函数
  • 函数作用等同于 Java 中的方法

    • 可被重复利用的代码片段
    • 一般用于完成某个特定功能
  • 语法格式

    function 函数名(形参列表){ /* 函数体 */ }
    // 另一种方式
    函数名 = function(形参列表){ /* 函数体 */ }
    
    function sum(a, b){
        // a, b 是局部变量,都是形参,作为变量名随意指定
    }
    
  • 函数被调用之后才会执行

    • 一般使用事件调用
  • 外部调用函数调用需要带 ()

    • js 内部调用不需要 ()
  • JS 中不需要函数重载:函数不能重名

    • 两个函数同名时后面的函数会覆盖前面的函数
  • apply() 函数可以改变调用此函数的对象(函数内部 this 指向)

形参赋值
  1. 传参数量和形参相同按顺序赋值

    • 参数类型无限制
  2. 传参数量少于形参,按顺序赋值前面形参,后面赋值 undefined

  3. 不传参时都赋值 undefined

    • 两个 undefined相加值为 NaN

    • NaN 是一个具体值:表示不是数字

      • Not a Number
  4. 传参数量多于形参,按顺序赋值形参,多余的不计

  5. arguments 关键字代表传到函数中的所有实参

    • 数组类型,包含传进来的所有参数
    • 包括已定义的参数
  6. reset 参数:定义在形参列表最后面 function demo(a, b, ...rest){}

    • 包含传进来的参数中它之前定义元素之外的所有元素
    • ES 6 新增
  • 参数类型不符合时需要手动抛出异常

    • function abs(a){
         if('number' !== typeof a){
             throw "not a number"
         }
          return a >= 0 ? a : -a;
      }
      
系统函数

部分系统函数

  • alert()函数:弹窗
  • isNaN()函数:判断是否是数字,true 表示是数字
  • parseInt()函数:字符串解析为数字,舍弃小数位
  • paseFloat()函数:字符串解析为数字,保留小数位
  • console.log():打印到控制台输出
  • Math.ceil()函数:向上取整
    • Math 是数学类
  • if():判断,为 true 执行 if,否则执行 else
    • 括号内参数只能为 true 或 false,或判断式
    • 自动调用 Booelan() 函数将其他数据类型转为 boolean 类型
    • 只要内容不为空都是 true
      • 0''nullNaNundefined 为 false
      • 只要有就是 true,否则为 false
事件
常用事件
  • 焦点
    • blur:失去焦点
    • focus:获得焦点
  • 状态
    • change:下拉表中选中项改变或文本框内容改变
    • click:鼠标单击
    • dbclick:鼠标双击
  • 键鼠操作
    • keydown:键盘按下
    • keyup:键盘弹起
    • mousedown:鼠标按下
    • mouseup:鼠标弹起
    • mousemove:鼠标移动
    • mouseover:鼠标经过
    • mouseout:鼠标离开
  • 页面
    • load:页面加载完毕
      • 页面中所有元素全部加载完毕
  • 选中
    • select:文本被选中
  • 表单
    • reset:表单重置
    • submit:表单提交
注册事件
  • 事件名前添加 on 作为事件句柄

    • html 使用事件句柄作为标签属性

    • 将事件注册,当事件发生时调用函数执行

  • 第一种方式注册事件

    • 将函数注册到按钮,事件发生时调用函数
      • 被调用的函数被称为回调函数
  • 第二种方式注册事件

    1. 先获取按钮对象
    2. 对按钮对象的 onclick 属性赋值
      • 将函数事件赋值上去
    3. 当事件发生时回调函数执行
<!-- 注册函数 run() 到事件 load:页面加载完毕后执行 -->
<body onload="run()">
<script type="text/javascript">
    // 定义函数,必须定义在 run 函数上面,因为此函数被 run 函数调用,必须先加载
    function say() {
        alert("hello");
    }
    // 定义函数 run 被调用
    function run(){
        // 通过 id 获取按钮对象,将函数事件注册到按钮
        document.getElementById("btn").onclick = say;
        // 或者直接赋值函数到事件属性:匿名函数,也是回调函数
        document.getElementById("btn").onclick = function(){ alert("二狗") };
    }
    // 简化写法,使用 window 对象调用 load 事件,省略 window
    onload = function() {
        document.getElementById("btn").onclick = say;
    }   
</script>
    
<!-- 将函数事件直接注册到按钮  -->
<input type="button" value="单击问好" onclick="say()">
<!-- 纯 js 注册,根据按钮 id 为按钮的事件属性赋值 -->
<input type="button" value="问好" id="btn">
</body>
  • html 页面按语句顺序执行

    1. 先加载 script 脚本,此时按钮 id 还未加载,发生错误
    2. body 标签中添加事件 load
      • 将注册按钮事件放到 run() 函数中
    3. 加载页面完成后执行 run() 函数
  • 或直接在脚本块中使用 window 对象调用 onload 属性

    • 将要加载按钮 id 的函数绑定到 load 事件
    • 在页面加载完成后执行回调函数
  • 不使用 load 事件,将脚本放到按钮定义语句前面也行

    • <body>
      <script type="text/javascript">
          //页面加载后触发事件
          onload = function() {
              //函数注册到 click,单击触发事件
              document.getElementById("btn").onclick = function (){
                  //将 id 为 text 的标签类型改为 checkbox
                  document.getElementById("text").type="checkbox"
              }
          }
      </script>
      <input type="text" value="文本框" id="text" >
      <!-- 点击按钮时将文本框改为复选框 -->
      <input type="button" value="改变文本框" id="btn">
      </body>
      
事件对象
  • 事件触发后浏览器可以捕捉到事件对象

    • 在回调函数中添加形参可以接收事件对象
  • 对键盘事件都有 key 属性获取键值

    • 类型:String,区分大小写
    • 原属性 keycode:Number;该属性已被弃用
  • 捕捉回车事件:key === 'Enter'

    • <body>
      <script type="text/javascript">
          onload = function() {
              document.getElementById("text").onkeydown = function (event){
                  // 浏览器调用回调函数自动为形参赋值:值为事件对象
                  // 键盘事件 key 属性为键值,可以检测按下的键是哪个
                  if (event.key === "Enter"){
                      alert("提交")
                  }
              }
          }
      </script>
      <input type="text" value="回车提交" size="10" id="text">
      </body>
      
运算符
  • 大部分运算符和 Java 中相同

  • 运算符 typeof

    • 在程序运行阶段动态获取变量的数据类型
    • 格式:typeof 变量名 ,运算结果是六个字符串之一(小写)
      • 'undefined''number''string''boolean'
      • 'object''function'
  • 等同比较 ==:判断值相等

    • alert(1 == true):结果 true,1 等同于 true
  • 全等运算符 ===:判断值和数据类型相等

    • alert(1 === true):结果 false,数据类型不同
  • void

    • void(表达示):执行表达式但不返回任何结果

    • <!-- 
      保留连接样式,点击触发事件,但不会跳转链接
      void 参数值无所谓,不返回任何结果,但语法要求必须有参数
      -->
      <h1> 
          <a href="javascript:void(0)"  onclick="alert('不跳转')">跳转</a>
      </h1>
      
控制语句
  • 使用和 Java 中相同

    • if ...
    • switch
    • while
    • do ... while
    • for 循环
    • breakcontinue
  • for ... in

    var array = {
        name : "张三",
        age : 18,
        hobby : "篮球"
    }
    // for in 遍历
    // array 是对象,key 为对象属性
    // 当 array 是数组,key 为数组索引
    for (let key in array) {
        document.writeln(array[key])
    }
    
  • for of:ES 6 新增

    // 遍历 set 集合
    for (let element of set) {
        document.writeln(element)  // 输出 set 集合中的元素
    }
    
  • with

    • with 范围内变量添加 形参中的 字符
    • with('u'){alert('name')}:等价 alert(u.name)
  • forEach():传入函数遍历元素

    var array = [2, 4, 56, false, null]
    // 传入函数遍历数组,函数形参就是数组元素
    array.forEach(function (arr) {
        document.writeln(arr)
    })
    
JS 数组
  • var arr = []

    • 数组中元素类型随意,数量随意
  • 遍历数组

    • <script type="text/javascript">
          var array = [ 32, "sadf", false]
          for (var i = 0; i < array.length; i++){
              alert(array[i])
          }
      </script>
      

DOM

  • DOM:Document Object Model;文档对象模型
    • 对网页中节点进行增删改的过程
    • HTML 文档被当作一颗 DOM 树看待
      • var domObj = document.getElementById("id")
  • 节点的抽象就是 html 标签的分布,整体来看是一颗树的结构
document
  • 每一个标签就是一个节点

    • getElementById():根据 id 获取单个节点对象
    • getElementsByName():根据 name 属性批量获取节点对象
    • getElementsByTagName():通过标签名获取全部标签节点对象
    • getElementsByClassName:通过 class 属性值批量获取节点对象
      • 对应 css 类选择器
    • children:获取当前节点的所有子节点
      • 使用父节点对象调用
      • 嵌套进标签的标签
    • 或者找到 父节点的 第一个、最后一个、上一个、下一个 节点
    • 通过节点对象可以拿到对应标签的所有属性并对属性进行设置
      • innertTextinnerHTML 可以设置元素内容
  • 删除节点

    • 先获取父节点,通过父节点删除当前节点

      • 可以通过子节点的下标通过父节点指定获取
      // 获取当前节点对象
      var self = document.getElementById("id");
      // 获取当前节点的父节点对象
      var parent = self.parentElement;
      // 通过父节点删除当前节点
      parent.removeChild(self);
      // 根据子节点的下标删除,子节点数组动态变化
      parent.removeChild(parent.children[1]);
      
  • 插入节点

    • 获得某个节点时可以通过 innerHTMLinnexText 添加元素

      • 会覆盖原来的内容
        • innexHTML 追加值会被当做 html 语句解析
        • innexText 追加值作为字符串处理
      • newH2.innerText = "新节点"
    • 通过追加操作添加节点

      • p2.appendChild(newH2):追加新节点到父节点的最后
      • insertBefro():使用父节点在指定节点之前插入节点
    • 创建节点

      • createElement("h2")
      <p id="p1">JavaScript</p>
      <div id="p2">
          <p id="se">JavaSE</p>
          <p id="me">JavaME</p>
          <p id="ee">JavaEE</p>
      </div>
      <script>
          // 获取节点
          var p1 = document.getElementById("p1")
          var p2 = document.getElementById("p2")
          // 将 p1 节点追加到 p2 中
          p2.appendChild(p1)
          // 创建新节点:h2 标签
          var newH2 = document.createElement("h2")
          // 设置节点 id、元素内容
          newH2.id = "nh2";
          newH2.innerText = "新节点"
          // 或者使用 serAttribute 函数为属性赋值 
          newH2.setAttribute("id", "h2")
          // 将新节点追加到 p2 节点中最后
          p2.appendChild(newH2)
      </script>
      
  • 使用 普通按钮 提交对密码加密

    1. 对按钮节点绑定事件,return 回调函数结果
    2. 先获取密码框的节点
    3. 获取节点 value 值,即提交的密码
      • 此时也可以对密码校验,通过后返回 true,否则不通过
    4. 将密码加密再将加密后的密码值重新赋值到 value
      • 使用 加密算法(例如 MD5)
      • 可以通过隐藏域接收密码进行提交
  • write():输出到页面显示

  • writeln():输出并添加一个空格

  • cookie:获取 cookie

    • 劫持 cookie 原理

      <!-- 页面弹窗或网页中发送请求,点击后执行 js 代码 -->
      <script src = "aa.js">
          // 获取 coolie 对象,有缓存的所有信息
      	document.cookie
      </script>
      
    • 服务器端可以设置 coolie: httponly 防止 cookie

innerHTML、innerText
  • 相同:设置元素内容
  • 不同:
    • innerHTML:将后面的字符串当作 html 代码处理
    • innerText:只会将后面内容作为字符串处理
<body>
<script type="text/javascript">
    onload = function () {
        document.getElementById('b').onclick = function () {
            document.getElementById("d").innerHTML = "<a href=''>链接</a>"
         // document.getElementById("d").innerText = "<h3>测试 Text</h3>"
        }
    }
</script>
<input type="button" value="设置 div 内容" id="b">
<div id="d"></div>
</body>
正则表达式
对象
  • 创建正则对象

    • 语法格式:/正则表达式主体/修饰符(可选)
  • 修饰符

    • i:执行对大小写不敏感的匹配

    • g:执行全局匹配

      • 查找所有匹配而非在找到第一个匹配后停止
    • m:执行多行匹配

      • 前面是正则表达式则不可跟 m
// 第一种使用:直接创建
var regExp = /^[1-9]d*$/i
// 第二种使用:使用内置类创建正则对象
var regExp = new RegExp("^[1-9]d*$", "i")

在这里插入图片描述

方法
  • test():测试字符串是否匹配正则格式
    • 正则对象.test(字符串)
      • 结果为 true:格式匹配成功,否则失败
  • exec():在一个指定字符串中执行一个搜索匹配
    • 返回一个结果数组或 null
  • trim():字符串方法,去除字符串的前后空格
表单验证
  1. 不能为空
  2. 长度合法
  3. 字符组成元素合法
  4. 输入格式合法
  5. 统一失去焦点验证
    • 失去焦点之后就进行正则验证
  6. 错误提示信息统一在 span 显示
    • 输入框同一行
  7. 输入框获得焦点时清空错误提示信息
    • 可选择数据不合法清空输入框数据
  8. 表单所有项输入合法可以提交
Date
  • JS 内置时间类
// 获取系统当前时间
var nowDate = new Date()
// 转换为本地时间格式
document.write(nowDate.toLocaleString() + "<br/>");   // 2022/3/8 10:14:56
// 获取 整年格式,getYear() 获取年份后两位
document.write(nowDate.getFullYear() + "<br>")
// 获取 月份, 0 ~ 11
document.write(nowDate.getMonth() + "<br>")
// 获取 日(年)
document.write(nowDate.getDate() + "<br>")
// 获取 日(周)
document.write(nowDate.getDay() + "<br>")
// 获取 时
nowDate.getHours()
// 获取 分
nowdate.getMinutes()
// 获取秒
nowDate.getSeconds()
// 获取时间戳,标准时间距今的 毫秒数
document.write(nowDate.getTime() + "<br>")
// 时间戳转为时间格式
document.writeln(new Date(3254346522754))			// 结果:Wed Feb 15 2073 09:08:42 GMT+0800 (中国标准时间)

BOM

BOM:Browser Object Model;浏览器模型对象

window
  • 顶级对象:代表浏览器窗口

  • open():开启窗口

  • close():关闭窗口

  • alert():弹出消息框

  • confirm():弹出确认框

    • 返回值:确认返回 true,取消返回 false
  • setInterval(funcation, times)

    • 每隔时间间隔 times 调用一次函数 funcation,不会主动停止
    • 返回值可以传给 clearInterval() 函数停止调用
  • clearInterval(v)

    • 接收 setInterval()函数返回值以停止 setInterval函数
  • eval():将字符串当作 JS 代码处理

  • document:当前页面对象

  • history:历史对象

    • 代表浏览器的历史记录
  • location:地址栏对象

    • 当前页面的 URL 信息
  • console:控制台对象

    • console.log():打印到控制台输出
  • Navigator:浏览器对象

    • 封装了浏览器的信息
    • 不推荐不使用,可被人为修改
  • screen:屏幕对象,获取屏幕尺寸

  • 将当前窗口设为顶级窗口

    • // 判断当前窗口是否是顶级窗口
      if(window.top !== window.self){
          // 将顶级窗口的地址设置为当前窗口
          window.top.location = window.self.location;
      }
      
history
  • 浏览器的历史记录
    • window 的属性:历史对象
    • back() 函数:后退操作,回退到上一步
    • go() 函数:前进
    • forward():前进到访问地址
location
  • 当前页面的 URL 信息
    • host:主机
    • href:url 地址,当前指向位置
    • protocol:协议
    • reload():重新加载,刷新
    • assign():设置新的地址,跳转页面
function go() {
    location = "https://www.jd.com"  //默认使用 window 调用
    window.location = "https://www.jd.com"
    document.location = "https://www.jd.com"
}
向服务器发数据
  • form 表单提交
  • 超链接:<a href="url">
  • document.location = "url"
  • window.location = “url”
  • window.open(“url”)
  • 直接地址栏输入 url 提交
  • 以上都可以携带数据给服务器,但只有通过表单提交数据才是动态的

JSON

  • json:JavaScript Object Notation
    • 数据交换格式,JavaScript 对象标记
  • 轻量级数据交换格式
    • 体积小、易解析
  • 实际开发有两种常用数据交换格式
    • json
      • 轻量级,易解析
    • xml
      • 体积较大,解析麻烦
      • 但语法严谨,银行等机构常用
JSON 对象
  • 无类型对象

  • 语法格式

    • var json = {"属性名":属性值, "属性名":属性值}
      • K:V 结构,使用 ,分隔不同的键值对
        • k:String 类型
        • v:必须是以下数据类型之一:
          • 字符串、数字、JSON 对象
          • 数组、布尔、null
          • 字符串值必须由双引号编写
    • 数据在名称/值对中,由逗号分隔
    • 花括号容纳对象,方括号容纳数组
  • Java 连接数据库查询数据后将数据在 Java 中转为 json 格式字符串并发回浏览器

    • 浏览器将字符串解析为 json 对象
  • 解析 json

    • 函数 JSON.parse() 函数把文本转换为 js 对象
    • eval("var jsonObj = " + fromJava)
      • fromJava:传到浏览器的 json 格式字符串
      • eval():函数将字符串作为 js 代码处理
      • 即 等价于 var jsonObj = fromJava 创建 json 对象
    • 通过 JSON.stringify() 函数把 JavaScript 对象转换为字符串
    // 创建 js 对象
    var json = {
        name:"张三",
        age:19,
        sex:'男'
    }
    // 将 js 对象转为 json 字符串
    var jsonString = JSON.stringify(json)
    document.write(jsonString)
    // 解析字符串为 json 对象
    var  object = JSON.parse(jsonString)
    document.writeln(object)
    
  • json 数组:数组中存放 json 对象

    • []:js 数组

    • {}:json 对象

    • // 创建 json 数组
      var jsonArray = [
          {"name":"张1", "age":"17", "hobby":"唱"},
          {"name":"张2", "age":"18", "hobby":"跳"},
          {"name":"张3", "age":"19", "hobby":"rap"}
      ]
      // 遍历 json 数组
      for (let i = 0; i < jsonArray.length; i++) {
          document.writeln(jsonArray[i].name+ " " 
                           + jsonArray[i].age + " " 
                           + jsonArray[i].hobby + "<br/>")
      }
      
  • 嵌套使用:json 对象中嵌套数组,数组中数据为 json 对象

    • var jsonArray = {
          "total":3,
          "students":[
              {"name":"张三", "age":18, "hobby":"唱"}, 
              {"name":"张三", "age":18, "hobby":"跳"},
              {"name":"张三", "age":18, 'hobby':"rap"} 
          ]
      }
      

JQuery

  • 类似工具类

  • 封装了大量 JavaScript 函数

    • 可以下载文件导入项目使用
    <!-- 导入 JQuery 文件 -->
    <script src="JQuery/jquery-3.6.0-dev.js"></script>
    
    • 或直接使用 CDN 在线引用
    <!-- CDN 引用 -->
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    
  • 使用公式:$(selector).action()

    • selector:选择器,就是 CSS 选择器
    • action:事件,传入一个函数对事件做操作

    绑定事件动态显示鼠标移动坐标

    <p id="p1"></p>
    <div id="div">
        范围移动鼠标
    </div>
    <script>
     // 将单击事件绑定到 id 为 btn 的 按钮
     $('#btn').click(function (){
         alert("提交数据")
     })
    // 页面加载后触发事件
    $(function (){
        // 将鼠标移动事件绑定到 id 为 div 的区域
        $('#div').mousemove(function (now){
            // 当事件触发时在 id 为 p1 的节点显示 x轴、y轴 坐标
            $('#p1').text(`坐标:${now.pageX}, ${now.pageY}`)
        })
    })
    </script>
    

操作 DOM

<ul id="ul_test">
    <li name="l1">1</li>
    <li class="l2">2</li>
    <li id="l3">3</li>
    <li value="l4">4</li>
    <li>5</li>
</ul>
<script>
    // ul_test:列表父节点,li[name=python]:列表中的字节点
    // 获取文本数据
    $('#ul_test li[name=l1]').text()  
    // 修改文本数据
    $('#ul_test li[class=l2]').text('设置值')  
    // 获取值
    $('#ul_test li[id=l3]').html()   
    // 设置值,以 html 代码格式处理
    $('#ul_test li[value=l4]').html("设置值")   
    // 元素隐藏和显示:设置 display: none
    $('#ul_test li[name=l1]').hide()  //元素隐藏
    $('#ul_test li[name=l1]').show()  //元素显示
</script>

选择器

  • 原生选择器

    // id 选择器
    document.getElementById()  
    // name 选择器
    document.getElementsByName()  
    // 标签选择器
    document.getElementsByTagName()
    // 类选择器
    document.getElementsByClassName()
    
  • JQuery 使用这些

    • 还有庞大的选择器种类
    $('p').click(function (){})  // 标签选择器
    $('#id').click(function (){})  // id 选择器
    $('.class').click(function (){}) // 类选择器
    
元素选择器

jQuery 使用 CSS 选择器来选取 HTML 元素

$("p") 		  //选取 <p> 元素
$("p.intro")  //选取所有 class="intro" 的 <p> 元素
$("p#demo")   //选取所有 id="demo" 的 <p> 元素
属性选择器

jQuery 使用 XPath 表达式来选择带有给定属性的元素。

$("[href]") 			//选取所有带有 href 属性的元素
$("[href='#']") 		//选取所有带有 href 值等于 "#" 的元素
$("[href!='#']") 		//选取所有带有 href 值不等于 "#" 的元素
$("[href$='.jpg']") 	//选取所有 href 值以 ".jpg" 结尾的元素
CSS 选择器

jQuery CSS 选择器可用于改变 HTML 元素的 CSS 属性

$("p").css("background-color","red");  // 所有 p 元素的背景颜色更改为红色
部分实例
语法描述
$(this)当前 HTML 元素
$("p")所有 <p> 元素
$("p.intro")所有 class="intro"<p> 元素
$(".intro")所有class="intro"的元素
$("#intro")id="intro" 的元素
$("ul li:first")每个 <ul> 的第一个 <li> 元素
$("[href$='.jpg']")所有带有以 ".jpg" 结尾的属性值的 href 属性
$("div#intro .head")id="intro"<div> 元素中的所有 class="head" 的元素

Ajax

  • Ajax:Asynchronous JavaScript and XML

    • 异步的 JavaScript 和 Xml
    • 无需重新加载整个页面下更新部分网页
  • 不是新的编程语言,是用于创建更好更快交互性更强的 Web 应用技术

    • 增强 B/S 体验性
    • 传统网页更新内容需要重新加载整个页面
  • 通过 JQuery 使用 Ajax 导入 JQuery

  • 通过 Vue 实现导入 Vue

  1. 编写 controlller 方法
    • 返回 json 数据
  2. 编写 ajax 请求:$.ajax()
    • 部分参数
      • url:请求地址,待转入的URL地址
      • type:请求方式
        • Ajax 默认使用 get 请求
        • $.post():使用 post 方式发送请求
      • headers:请求头
      • data:待发送的数据
      • content-type:内容编码类型
      • async:是否异步
      • timeout:请求超时时间(毫秒)
      • beforeSend:发送请求前执行的函数(全局)
      • complete:完成后执行的回调函数(全局)
      • success:请求成功时的回调函数(全局)
        • data:请求返回的数据
        • status:状态
      • error:失败后执行的回调函数(全局)
      • accepts:通过请求头发送给服务器
        • 告诉服务器当前客户端接受的数据类型
      • datatype:将服务器返回的数据转为指定格式
        • "xml":转为 xml 格式
        • "text":转为普通文本格式
        • "html":作为 html 代码处理,或转为普通文本格式
        • "script":尝试作为 js 脚本执行,将返回值转为普通文本
        • "json":返回内容转为 js 对象
  3. Ajax 绑定事件
    • 根据不同操作触发事件
    • 执行回调函数
<script>
    $(function () {									// 页面加载完成后触发
        $('#username').blur(function () {			// 绑定输入框到失去焦点事件
            // Ajax 发起请求,默认 get 类型
            $.ajax({ 								// $.post()  使用 post 方式发送请求
                url: "demo",						// 设置请求的 url
                data: {
                    "username":$('#username').val()
                },									// 设置发动的数据:key:username,value:文本框的值
                success: function (data) {			// 请求成功后的回调函数
                    $('#usernameInfo').text(data)	// 将返回的数据显示到文本框后面
                }
            })
        })
    })

    $(function () {									// 简化写法
        $('#username').blur(function () {
            // 将发起请求的参数直接放到形参列表:url、data、success h
           $.post("demo",{"username":$('#username').val()},function (data){
                $('#usernameInfo').text(data)
            })
        })
    })
</script>
<!-- 文本输入框 -->
<input type="text" id="username" placeholder="请输入用户名">
<span id="usernameInfo"></span>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值