Js基础

null和undifined

null专门用来表示一个为空的对象

使用typeof检查一个null时,会返回object

当声明一个变量未赋值时,表示undifined

1
2
3
4
var a = null;
console.log(typeof a);//返回object
var b;
console.log(typeof b);//返回undifined

将其他数据类型转换为 String

法一:调用被转换数据类型的toString()方法 该方法不会影响原值 会将转换的结果返回

null和undifined没有toString()方法

1
2
var a = 123;
a = a.toString();

法二:调用String()函数
会将null直接转换为“null”

会将undifined直接转换为“undifined”

1
a = String(a);

将其他数据类型转换为 Number

法一:使用Number()函数

1
2
3
4
5
6
* 若是纯数字的字符串 则直接转数字
* 若有非数字字符串 则转换为NaN
* 若字符串是空串,或全是空格 则转为0
* 布尔值转数字,T为1 F为0
* null转数字为0
* undifined转数字为NaN

法二:parseInt()函数把字符串转整数 可将一个字符串中有效的整数内容取出来

parseFloat()函数把字符串转浮点数 可获得有效的小数

若对非String使用 会先转为String再操作

进制数字

  • 16进制数字:0x开头

    1
    2
    var a = 0x123;
    console.log(a) //以十进制输出
  • 8进制数字:0开头 070有些浏览器会当成8进制解析 有些会当成十进制

  • 可以在parseInt()中传递第二个参数来统一进制

    1
    2
    var a = 070
    parseInt(a,10)

    2进制数字:0b开头 但不是所有浏览器都支持

    将其他数据类型转换为Boolean

  • Boolean()函数

    • 数字转布尔 除了0和NaN 其余都是true
    • 字符串转布尔 除了空串 其余都是true
    • 对象或其他类型转布尔都是true
    • null和undifined都是false

      运算符

  • Infinity 无穷

  • typeof的返回值为字符串

  • /*%1 -0 +a(a为参数)都可将一个值转换为Number

  • +a可以一个值转为String

  • !取反 若为非布尔值 则先转换为布尔值再取反 !!a可将任意数值a转换为布尔值

  • 关系运算符

    • 任何值和NaN做任何比较都是false
    • 比较俩字符串时,比较的是字符串的编码 一位一位进行比较 多余字符串不比较
    • 比较中文时没有意义
  • 相等运算符==

    • 运算时会自动转成Number类型
    • null == 0为false
    • undifined衍生自Null 所以俩者==返回true
    • NaN不和任何值相等 包括它本身 可以通过isNaN()函数来判断一个值是否是NaN
  • 条件运算符(三元)

    • 条件表达式?语句1:语句2
    • 执行时先执行条件表达式 若为true则执行语句1 并返回执行结果 反之则执行语句2
    • 若条件表达式为非布尔值 会先转为布尔值
  • 优先级

    • 越靠上越优先计算
      • . 、[] 、new
      • ()
      • ++、–
      • !、~、+、-(单目)、typeof、void、delete
      • %、*、/
      • +、-(双目)
      • <<、>>、>>>
      • <、<=、>、>=
      • ==、!==、===
      • &
      • ^
      • |
      • &&
      • ||
      • ?
      • =、+=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、^=、|=

自增和自减

a++(–)的值等于原变量的值

++(–)a的值等于自增后的值

break和continue

  • break关键字可以用来退出switch或循坏语句 只对最近的循环产生影响

可以为循环语句创建一个名字 来标识当前的循环 在break后添加标识名来应用其他循环

1
2
3
4
5
6
outer:
for(){
for(){
break outer
}
}
  • continue用来跳过当次循环

    console.time(“计时器名字”)

用来开启一个计时器 需要一个字符串作为参数 将会作为计时器标识

console.timeEnd(“计时器名字”)停止计时器

对象

  • 内建对象
    • 由ES标准定义的对象 如Math Function Object
  • 宿主对象
    • 由JS的运行环境提供的对象 主要为由浏览器提供的对象 如BOM DOM
  • 自定义对象
    • 由开发人员自己的创建的对象

in运算符

检查一个对象中是否含有指定的属性 返回布尔值

语法:”属性名” in 对象

基本与引用数据类型

  • 基本数据类型:string number boolean null undifined
  • 引用数据类型:object
  • js变量都存储在栈内存中
  • 对象都存储在堆内存中 每创建一个新的对象就会在堆内存中开辟一个空间 而栈内存中的变量保存的是对象的内存地址
  • 如果两个变量保存的是同一个对象引用 当一个通过一个变量修改属性时,另一个也会受到影响
  • 当比较两个引用数据类型时,比较的是内存地址

立即执行函数

立即执行 只执行一次

1
2
3
function(){
//代码块
})(//可以传参)

作用域

var创建一个变量时,会作用于全局

调用函数时创建函数作用域 函数执行完毕之后 函数作用域销毁 每调用一次函数就会创建一个新的作用域

this

函数执行的上下文对象

根据函数的调用方式不同 this指向不同的对象

1
2
3
* 以函数的形式调用 this指向永远都是window
* 以方法的形式调用 this是调用方法的对象
* 以构造函数的形式调用时,this就是新创建的那个对象

构造函数/类

构造函数使用new关键字来调用 函数名大写

执行流程

1
2
3
4
* 立刻创建一个新的对象
* 将新建的对象设置为函数中的this 在构造函数中可以使用this来引用新建的对象
* 逐行执行函数中的代码
* 将新建的对象作为返回值返回

instanceof可以检查一个对象是否是一个类的实例

所有的对象都是Object的后代

原型对象

  • 将函数定义在全局作用域 污染了全局作用域的命名空间 而且定义在全局作用域中也很不安全 所以尽量不在全局定义域中定义函数
  • 原型prototype
    • 每创建一个函数 解析器都会向函数中添加一个属性prototype
    • 这个属性对应一个对象 这个对象就是原型对象
    • 如果函数作为普通函数调用prototype没有任何作用
    • 当函数以构造函数的形式调用时 它所创建的对象中会有一个隐含的函数
      • 指向该构造函数的原型对象 可以通过__proto__来访问该属性
    • 原型对象相当于一个公共区域 所有同一个类的实列都可以访问到这个原型对象 可以将对象中公共的内容 统一设置到原型对象中
      1
      2
      3
      function Tx(){}
      //设置原型对象
      Tx.prototypr.a = 123;
    • 当访问对象的一个属性或方法时 会先在对象自身中寻找 如果有则直接使用 如果没有则去原型对象中寻找
  • 使用in检查对象中是否含有某个属性时 如果对象中但是原型有 也会返回true
  • 可以使用对象的hasOwnProperty()来检查对象自身是否含有该属性
  • 原型对象也是对象 所以它也有原型 当使用一个对象的属性或方法时,会在自身属性和原型中寻找 若都没有 则去原型的原型中寻找 直到找到Object的原型 若Object的原型中依然没找到 则返回undifined

    toString()

当直接在页面上打印一个对象时 实际上是输出对象的toString()方法的返回值

若希望在输出对象时不输出[Object Object] 可以为对象添加一个toString()方法

垃圾回收

当一个对象没有任何的变量或属性对他进行引用 我们将永远无法操作该对象 此时这种对象就是一个垃圾 这种对象过多会占用大量的内存 我们需要对这些垃圾进行清理

JS中拥有自动的垃圾回收机制 会自动将这些辣鸡对象从内存中销毁 我们只需要将不再使用的对象设置为null即可

数组

  • 读取不存在的索引 会返回undifined
  • length
    • 对于连续数组使用length 会获取到数组的个数(长度)
    • 对于不连续的数组 length会获取到数组的最大的索引+1
    • 若修改length大于原长度 则多出部分会空出来 若小于原长度 则多出的元素会被删除
    • 向数组的最后一个位置添加元素可以使用:数组[数组.length] = 值
  • push()向数组的末尾添加一个或多个元素 并返回数组的新长度
  • pop()删除数组的最后一个元素 并返回被删除的元素
  • unshift()向数组的开头添加一个或多个元素 并返回新的长度
  • shift()删除数组的第一个元素 并将被删除的元素作为返回值返回
  • forEach()需要一个函数作为参数
    • 像这种函数 由我们创建但不由我们调用的 称为回调函数
    • 数组中有几个元素函数就会执行几次
    • 每次执行时 浏览器会将遍历到的元素以实参的形式传递进来
    • 我们可以来定义形参 来读取这些内容
    • 浏览器会在回调函数中传递三个参数 第一个参数就是当前正在遍历的元素 第二个参数就是当前正在遍历的元素的索引 第三个参数就是正在遍历的数组
  • slice()从已有数组截取指定元素
    • 参数一为开始位置的索引 参数二为结束位置的索引
    • 结果包含开始索引 不包含结束索引
    • 该方法不改变原数组 而是将截取到的元素封装到一个新数组中返回
    • 第二个参数如果不写 会截取从开始索引往后的所有元素
    • 索引若传递负值 则从后往前计算
  • splice()删除数组中的指定元素
    • 会影响到原数组 会将指定元素从原数组中删除 并将被删除的元素作为返回值返回
    • 参数一表示开始位置的索引 参数二表示删除的数量 参数三及以后可以传递一些新的元素 这些元素会自动插入到开始位置索引前边
  • concat()连接两个或多个数组 并将新的数组返回 不会对原数组产生影响
  • join()将数组转换为字符串 不会被原数组产生影响 将转换后的字符串作为结果返回 在join()中可以指定一个字符串作为参数 这个字符串将会数组中元素的连接符 若不指定连接符 则默认使用,作为连接符
  • reverse()反转数组 会直接修改原数组
  • sort()对数组中的元素进行排序 会直接修改原数组
    • 默认按unicode编码进行排序 所以对数字进行排序时
    • 可能会得到错误的信息 可以添加一个回调函数 来指定排序规则
    • 回调函数中需要定义两个形参 浏览器将会分别使用数组中的元素作为实参去调用回调函数 使用哪个元素调用不确定 但肯定是a一定在b前边
    • 浏览器会根据回调函数的返回值来决定元素的顺序 如果返回一个大于0的值 则元素交换位置 若小于0 则元素位置不便 若返回一个0 则认为两个元素相等 也不交换位置
    • 如果需要升序排列 则返回a-b 降序则返回b-a
      1
      2
      3
      4
      let arr = [5,3,8,1,0,7,3,8]
      arr.sort(function(a,b) {
      return a-b
      })

call()和apply()

  • 都是函数对象的方法 需要通过函数对象来调用

  • 当调用这俩方法时都会调用函数执行

  • 调用时可以将一个对象指定为第一个参数 此时这个对象会称为函数执行时的this

    1
    2
    3
    4
    5
    function fun(){
    console.log(this.name)
    }
    var obj = {name:"obj"}
    fun.apply(obj)//输出obj
  • call()方法可以将实参放在对象之后依次传递

  • apply()方法需要将实参封装到数组中统一传递

    1
    2
    fun.call(obj,2,3)
    fun.apply(obj,[2,3])

arguments

  • 调用函数时 浏览器每次都会传递进两个隐含的参数:this和封装实参的对象arguments

  • 是一个类数组对象 也可以通过索引来操作数据 也可以获取长度

  • 调用函数时 传递的实参都会在arguments中保存

  • arguments[0]表示第一个实参 以此类推

  • 有一个callee属性 对应一个函数对象 就是当前正在执行的函数对象

    Date

  • 直接使用构造函数创建一个Date对象(new Date()) 则会封装为当前代码执行的时间

  • 可以在构造函数中传递一个表示时间的字符串作为参数 日期的格式:月份/日/年 时:分:秒

    1
    var d1 = new Date("12/13/2011 11:10:30")
  • getDate()获取当前日期对象是几日

  • getDay()获取当前日期对象是周几 返回值为0-6

  • getMonth()获取当前日期对象的月份 返回0-11

  • getFullYear()获取当前日期对象的年份

  • getTime()获取当前日期对象的时间戳 时间戳指从格林威治标准时间1970年0时0分0秒到当前时间所花费的毫秒数(1秒 = 1000毫秒)计算机底层保存时间使用的是时间戳

  • 获取当前时间戳 Date.now() 利用时间戳可以来测试代码的执行性能

    Math

  • 属于一个工具类不用创建对象 里边封装了数学运算相关的属性和方法

  • Math.PI表示圆周率

  • Math.abs()用来计算一个数的绝对值

  • ceil()对一个数进行向上取整 小数位只有有值就自动进1

  • floor()对一个数进行向下取整 小数位会被舍掉

  • round()四舍五入取整

  • random()用来生成0-1之间的随机数 生成一个0-10的随机数就*10 生成0-x之间的一个随机数Math.round(Math.random()x) 生成x-y之间的随机数Math.round(Math.random()(y-x)+x)

  • max()获取多个数中的最大值 min()获取多个数中的最小值

  • pow(x,y)返回x的y次幂

  • sqrt()对一个数进行开方

    包装类

JS提供三个包装类 可以将基本数据类型的数据转换为对象 给浏览器自己调用

  • String()将基本数据类型字符串转换为String对象
  • Number()将基本数据类型的数字转换为Number对象
  • Boolean()将基本数据类型的布尔值转换为Boolean对象
    1
    2
    var num = new Number(3);
    var bool = new Boolean(true);
    但开发中不使用这个方式
  • 方法和属性能添加给对象 不能添加给基本数据类型 当我们对一些基本数据类型的值去调用属性和方法时 浏览器会临时使用包装类将其转换为对象 然后在调用对象的属性和方法 调用完以后 再将其转换为基本数据类型

    字符串对象的方法

在底层字符串都是以字符数据的形式保存 所以引用方法类似数组 有length属性 有索引

  • charAt()返回字符串中指定位置的字符 根据索引获取指定的字符

  • charCodeAt()获取指定位置字符的字符编码(Unicode编码)

  • String.formCharCode()根据字符编码获取字符

  • concat()用来连接两个或多个字符串 作用和+一样

  • indexOf()检索字符串中是否含有指定内容 若有改内容 则会返回第一次出现的索引 若没有该内容 则返回-1 可以指定第二个参数为开始查找的位置

  • lastIndexOf()用法和indexOf()一样 不同的是该方法是从后往前寻找指定内容

  • slice()可以从字符串中截取指定的内容 不会影响原字符串 用法和数组一样

  • substring()截取一个字符串 和slice()类似 不同的是这个方法不能接收负值为参数 若传递负值默认为0 而且会自动调整参数的位置 如果第二个参数小于第一个参数 则会自动交换

  • substr()截取字符串 不同的是参数一为开始位置的索引 参数二为截取的长度(es语法为定义)

  • split()将一个字符串拆分为一个数组 需要一个字符串作为参数 将会根据该字符串去拆分为数组 不指定全局匹配也会全的拆分

    • 若传递一个空串作为参数 则会将每个字符都拆分为数组中的一个元素
    • 可以传递一个正则表达式作为参数 根据正则表达式来拆分
  • toUpperCase()将一个字符串转换为大写并返回

  • toLowerCase()将一个字符串转换为小写并返回 都不会影响原变量

  • search()搜索字符串中是否含有指定内容 搜索到指定内容返回第一次出现的索引 没有搜索到返回-1 可以接收正则表达式作为参数 根据正则表达式去检索字符串 只会查找第一个 即使设置全局匹配也无效

  • match()根据正则表达式将字符串中符合条件的提取出来 默认情况下只会找到第一个符合要求的内容 找到以后就停止检索 可以设置正则表达式为全局匹配模式 这样就可以匹配所有的内容 可以为一个正则表达式设置多个匹配模式 且顺序无所谓 会将匹配到的内容封装到一个数组中返回 即使只查询到一个结果

  • replace()可以将字符串中指定内容替换为新的内容 参数一为被替换的内容 可以接收正则表达式 参数二位新的内容 默认只替换第一个 可以设置位全局模式

    正则表达式

  • 语法:var 变量 = new RegExp(“正则表达式”,”匹配模式”) 或使用字面量创建:var 变量 = /正则表达式/匹配模式

  • 例var reg = new RegExp(“a”)可以用来检查一个字符串中是否含有a 区分大小写

  • 第二个参数匹配模式可以是i忽略大小写 g全局匹配模式

  • test()方法可以哦你过来检查一个字符串是否符合正则表达式的规则 符合则返回true

  • 正则表达式中使用 | 表示或的意思 []里面的内容也是或的关系 [ab]==a|b [a-z]任意小写字母 [A-Z]任意大写字母 [A-z]任意字母

  • [^ x]表示除了x以外的

  • 量词可以设置一个内容出现的次数 默认只对它前边的一个内容起作用 若要表示前面的一个整体可以用() 语法:

    • {n}正好出现n次
    • {m,n}出现m-n次
    • {n,}出现n次以上
    • +表示至少一个 相当于{1,}
    • *表示0或多个 相当于{0,}
    • ?表示0或1个 相当于{0,1}
    • ^表示开头 $表示结尾
  • .表示任意字符 若要检查字符串是否含有. 可以在正则表达式中使用\作为转义字符 .表示. \表示\ 注意:使用构造函数时 由于参数是一个字符串 而\是转义字符 如果要使用\则需要使用\来代替

    • \w匹配任意字母和数字和__
    • \W除了字母 数字和__
    • \d任意数字[0-9]
    • \D除了数字
    • \s空格
    • \S除了空格
    • \b单词边界:即在独立的单词两边使用单词边界
    • \B除了单词边界

      DOM

  • 文档对象模型 通过JS来操作HTML文档

  • 节点

    • 构成HTML文档最基本的单元
    • 分类
      • 文档节点 整个HTML文档
      • 元素节点 HTML文档中的标签
      • 属性节点 元素的属性
      • 文本节点 标签中的文本内容
    • 节点的属性
      • 图片
    • 浏览器已经为我们提供文档节点对象 这个对象就是window属性 文档节点代表的是整个网页 即document
      1
      2
      3
      <button id = "btn">按钮</button>
      var btn = document.getElementById("btn")//获取标签对象
      btn.innerHTML= "修改按钮的文字"
  • innerHTML通过这个属性可以获取到元素内部的html代码 对于自结束标签没有意义

  • innerText可以获取到元素内部的文本内容

  • 通过document对象调用:

    • getElementById()通过id属性获取一个元素节点对象
    • getElementsByTagName()通过标签名获取一组元素节点对象 返回数组对象
    • getElementsByName()通过name属性获取一组元素节点对象
    • 元素.属性名可以读取元素节点属性 class属性不能采用这种方式 读取class属性需要使用.className
  • 获取元素节点的子节点

    • getElementsByTagName()通过标签名获取一组元素子节点对象
    • childNodes当前节点的所有子节点 会获取包括文本节点在内的所有节点 标签间的空白也会被当成文本节点 在IE8及以下的浏览器中不会将空白文本当成子节点
    • children属性会获取当前节点的所有子元素(标签 不包括空白)
    • firstChild表示当前节点的第一个子节点(包括空白文本节点)
    • firstElementChild会获取当前节点的第一个子元素 不支持IE8及以下的浏览器
    • lastChild表示当前节点的最后一个子节点
  • 获取父节点和兄弟节点

    • parentNode表示当前节点的父节点
    • previousSibling表示当前节点的前一个兄弟节点 也可能获取到空白文本
    • previousElementSibling当前节点的前一个兄弟元素
    • nextSibling表示当前节点的后一个兄弟节点
  • 其余查询方法

    • 直接获取body标签:document.body
    • 直接获取html根标签:document.documentElement
    • 获取页面中的所有元素:ducoment.all 但它是undifined类型 或 document.getElementsByTagName(“*”)
    • 根据元素的class属性值查询一组元素节点对象:document.getElementsByClasssName(“”) 只兼容IE9以上浏览器
    • document.querySelector(“”)根据一个CSS选择器来查询一个元素节点对象 需要一个选择器的字符串作为参数 使用该方法总会返回一个唯一的一个元素 若有多个元素 只会返回第一个 支持IE8
    • document.querySelectorAll(“”)方法同上 但可以查询所有元素节点 返回一个数组
  • 增删改方法

    • document.createElement(“span”)可以用于创建一个元素节点对象 需要一个标签名作为参数 会根据该标签名创建元素节点对象 并将创建号的对象作为返回值返回
    • document.createTextNode(“广州”)创建一个文本节点对象 需要一个文本内容作为参数 将会根据该内容创建文本节点 并将新的节点返回
    • appendChild()向一个父节点添加一个新的子节点 语法:父节点.appendChild(子节点)
    • insertBefore()在指定的子节点前插入新的子节点 语法:父节点.appendChild(新节点,旧节点)
    • replaceChild()使用指定的子节点替换已有的子节点 语法同上
    • removeChild()删除一个子节点 语法:父节点.removeChild(子节点)
  • 样式操作

    • 修改元素的样式 语法:元素.style.样式名 = 样式值
    • 含有-的样式名 需改为驼峰命名法
    • 元素.style.样式名 此方法只能获取内联样式
    • 元素.currentStyle.样式名 获取元素的当前显示的样式 如果当前元素没有设置该样式 则会获取到默认值 只有IE浏览器支持
    • 其他浏览器可以使用getComputedStyle()来获取元素当前的样式 这是window的方法 可以直接使用 需要两个参数
      • 第一个为要获取样式的元素
      • 第二个可以获取一个伪元素 一般传null
      • 该方法返回一个对象 对象中封装了对应的样式
      • 可以通过对象.样式名来读取样式
      • 如果获取的样式没有设置 则会获取到真实的值 而不是默认值 比如没用设置width 则不会返回auto 而是具体的长度 不支持IE8及以下
      • 例:getComputedStyle(box1,null).width
    • 通过currentStyle和getComputedStyle()读取到的样式都是只读的 不能修改
  • 其他样式用法(以下)

    • clientWidth和clientHeight获取元素的可见宽度和高度 用法:元素.clientWidth 以下属性都不带px 都返回一个数字 可见宽度和高度包括内容区和内边距 不包括边框 这些属性都只读 不能修改
    • offsetWidth和offsetHeight获取整个元素的高度和宽度 包括内容区和内边距 包括边框
    • offsetParent获取当前元素的定位父元素 会获取到离当前元素最近的开启了定位(只要position值不是static就是开启了定位)的父元素 若所有的父元素都没有开启定位 则返回body
    • offsetLeft 当前元素相对于其定位父元素的水平偏移量
    • offsetTop当前元素相对于其定位父元素的垂直偏移量
    • scrollWidth和scrollHeight可以获取整个区域 包括滚动区的宽度和高度
    • scrollLeft和scrollTop可以获取水平滚动条和垂直滚动条滚动的距离
    • 当满足scrollHeight -scrollTop = clientHeight时 说明垂直滚动条滚动到底 水平同理

事件

  • window.onload事件会在整个页面加载完之后才触发 该事件对应的相应函数会在页面加载完成之后执行 这样可以确保代码执行时所有的DOM对象已经加载完毕了
  • onclick单击事件 ondblclick双击事件
  • onscroll该事件会在元素的滚动条滚动时触发
  • 拖拽相关
    • onmousedown按下开始拖拽
    • onmousemove鼠标移动事件
    • onmouseup松开时固定
  • 鼠标滚轮滚动事件onmousewheel 不支持火狐 火狐中使用DOMMouseScroll来绑定滚动事件 该事件通过addEventListener()来绑定
    • event.wheelDelta获取滚动方向 向上滚是正值 向下滚的负值 火狐中使用event.detail
    • 当滚轮滚动时 如果浏览器有滚动条 滚动条会随之滚动 这是浏览器的默认行为,如果不希望发生,则可以取消默认行为(return false)
    • 通过addEventListener()来绑定的函数 取消默认行为不能使用return false 需要使用event.preventDefault() 不支持IE8 所以要使用event.preventDefault() && event.preventDefault()判断
  • 键盘事件
    • onkeydown按键被按下 对于按下一定间隔后不松开的事件会连续触发
    • onkeyup按键被松开
    • 键盘事件一般会绑定给获取获取焦点的对象或document
    • 可以往事件中传递event 通过event.keyCode返回按键的unicode编码
    • 还有altKey ctrlKey shiftKey三个属性 分别判断alt ctrl shift是否按下 返回布尔值
    • 在文本框中输入内容,属于onkeydown的默认行为 如果在onkeydown中取消了默认行为 则输入的内容不会出现在文本框中
    • 使文本框中不能输入数字

事件对象

当事件的响应函数被触发时 浏览器每次都会将一个事件对象作为实参传递进函数

在事件对象中封装了当前事件相关的一切信息 比如:鼠标的坐标 键盘哪个按键被按下 鼠标滚轮的方向

  • clientX可以获取鼠标指针的水平坐标

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    btn.onmousemove = function(event){
    let x = event.clientX
    let y = windon.event.clientY//IE8中响应函数被触发时 浏览器不会传递事件对象 所有在IE8及以下的浏览器中 是将事件对象作为window对象的属性保存的 要用此种用法

    //或者采用如下写法
    event = event || window.event
    //或
    if(!event) {
    event = window.event
    }
    }
  • clientY可以获取鼠标指针的垂直坐标 (当前可见窗口的坐标) div的偏移量是相对于整个页面的

  • pageX和pageY可以获取鼠标相对于当前页面的坐标 IE8不支持 可以使用scrollTop获取到滚动条距离 使偏移量加上滚动距离来代替pageX

    事件冒泡Bubble

  • 指事件的向上传导 当后代元素上的事件被触发时 其父元素的相同事件也会被触发

  • 可以通过事件对象来取消冒泡event.cancelBubble = true

    事件委派

  • 将事件统一绑定给元素的共同的祖先元素 这样当后代元素上的事件触发时,会一直冒泡到祖先元素 从而通过祖先元素的响应函数来处理事件

  • 事件委派利用了冒泡 通过委派可以减少事件绑定的次数 提高程序的性能

  • event事件对象的targrt表示的触发事件的对象

    事件绑定

使用对象.事件 = 函数的形式绑定响应函数 它只能同时为一个元素的一个事件绑定一个响应函数 不能绑定多个 如果绑定多个 则后边会覆盖掉前边的

  • addEventListener()通过这个方法也可以为元素绑定响应函数 不支持IE8及以下

    • 参数一为事件的字符串 不要on 如”click”
    • 参数二为回调函数 当事件触发时该函数会被调用
    • 参数三为是否在捕获阶段触发事件 需要一个布尔值 一般都传false
    • 可以同时为一个元素的相同事件绑定多个响应函数 这样当事件被触发时 会按函数的绑定顺序执行
    • 里面的this是绑定事件的对象obj
  • attachEvent()可以在IE8中使用来绑定事件

    • 参数一为事件的字符串 要on 如”onclick”
    • 参数二为回调函数 当事件触发时该函数会被调用
    • 不同的是它是后绑定先执行 执行顺序和addEventListener()相反
    • 里面的this是window 可以通过在匿名函数中调用callback.call(obj)来统一this(this是谁由调用方式决定)

      事件的传播

  • 微软公司认为事件应该由内向外传播 也就是事件触发时应该先触发当前元素上的事件 然后再向当前元素的祖先元素上传播 就是事件应该在冒泡阶段执行

  • W3C将事件传播分成了三个阶段

    • 捕获阶段:从最外层的祖先元素向目标元素进行事件的捕获 但默认此时不会触发事件
    • 目标阶段:事件捕获到目标元素 捕获结束后开始在目标元素上触发事件
    • 冒泡阶段:事件从目标元素向祖先元素传递 依次触发祖先元素上的事件
    • 如果希望在捕获阶段就触发事件 可以将addEventListener()的第三个参数设置为true 一般情况下不采用 IE8及以下浏览器没有捕获阶段
  • 当调用一个元素的setCapture()方法以后 这个元素将会把下一次所有的鼠标按下相关的事件捕获到自身上 chrome中使用此方法会报错

    BOM

  • 浏览器对象模型 通过JS来操作浏览器

  • 包括 均作为window的属性保存 可以通过window对象来使用 也可以直接使用

    • Window代表整个浏览器窗口 同时window也是网页中的全局对象
    • Navigator代表当前浏览器信息 通过该对象识别不同的浏览器
    • Localtion代表当前浏览器的地址栏信息 通过Location可以获取地址栏信息 或者操作浏览器跳转页面
    • History 代表浏览器的历史信息 可以通过该对象来操作浏览器的历史记录 由于隐私原因 该对象不能获取到具体的历史记录 只能操作浏览器的向前和向后翻页 而且该操作只能当次访问时有效
    • Screen代表用户屏幕的信息 通过该对象可以获取到用户显示器的相关的信息(用于移动端)
  • 由于历史原因 大部分属性都已经不能啊帮助识别浏览器了 一般使用userAgent属性

  • userAgent是一个字符串 包括描述浏览器信息的内容

  • IE11中已经将微软和IE相关的标识去除 所以不能userAgent

  • 所以还可以通过浏览器特有的属性来判断 比如window.ActiveXObject 有这个对象则是IE 没有则不是IE eg:if(“ActiveXObject” in window)

    history

  • length属性可以获取到当前访问过的网页数量

  • back()方法可以回退到上一个页面 作用和浏览器的回退按钮一样

  • forword()可以跳转到下一个页面 作用和浏览器的前进用途一样

  • go()跳转到指定页面 需要指定一个整数为参数 1表示向前跳转一个 2表示向前跳转2个 -1向后跳转一个

    location

  • 直接打印location 可以获取到地址栏的信息(当前页面的完整路径)

  • 如果直接将location属性修改为一个完整的路径 或相对路径 则页面会自动跳转到该路径 并且会生成相应的历史记录

  • assign()方法用来跳转到其他的页面 作用和直接修改lication一样

  • reload()方法重新加载当前页面 作用和刷新按钮一样 如果在方法中传递true作为参数 则会强制清空缓存刷新页面

  • replace()方法可以使用一个新的页面替换当前页面 调用完毕也会跳转页面 不会生成历史记录 不能使用回退按钮回退

    定时器

  • 如果希望一段程序可以每隔一段时间执行一次 可以使用定时调用

  • setInterval()

    • 参数一为回调函数 该函数会每隔一段时间执行一次
    • 参数二为每次调用间隔的时间 单位是毫秒
    • 返回值为Number类型的数据 这个数字用做定时器的唯一标识
  • clearInterval()用来关闭定时器 需要一个定时器的表示作为参数

  • setTimeout()延时调用一个函数不马上执行 而是隔一段时间以后再执行 而且只执行一次

  • clearTimeout()关闭延迟调用 使用方法同上

  • 在定时器执行前关闭上一次定时器 防止一直按按钮会一直加快定时器

a的链接问题

点击超链接以后默认跳转页面

  • 可以通过在响应函数的最后return false来取消默认跳转行为

  • 或设置标签a的属性href=”javascript:;”

    类的操作

  • 直接操作style的方法渲染性能较低 所以可以采用修改类名的方式来改变整个样式 若任需要保留原样式 可以使用box.className +=” “ +”新类名”

JSON

  • 特殊格式的字符串 可以被任意的语言识别
  • JavaScript Object Notation JS对象标识法
  • 格式与JS对象格式一样 不过JSON的属性名必须加双引号 其他与JS语法一致
  • 分类:对象{} 数值[]
  • 允许的值:字符串 数值 布尔值 Null 对象 数组
  • JSON工具类
    • JSON.parse()将json转js对象 参数为json字符串
    • JSON.stringify()将JS对象转JSON字符串 参数为JS对象
    • IE7不支持
    • eval()可以用来执行一段字符串形式的JS代码 并将执行结果返回 所以IE7中可以使用此方法 若执行的字符串中含有{} 会将{}当成是代码块 如果不希望将其解析成代码块 则需要在字符前后各加一个()
    • 但eval()在开发者尽量不使用 执行性能比较差 且具有安全隐患 若要兼容 IE7 可以引入JSON.js
      1
      eval("("+字符串代码+")")

注意

  • for循环会在页面加载完成之后立即执行 而点击函数则在for循环执行完成之后才执行
  • ES6新语法:for(let i in arr)i为数组下标 for(let book of arr) book为数组元素
  • 高级函数
    • filter(回调函数())
      1
      2
      3
      4
      let newArr = arr.filter(functionn{
      retuen n<100
      }) //回调函数有一个要求:必须返回布尔值 返回值若是false则过滤掉 如retuen n<100则返回小于100的
      //箭头函数写法:let newArr = arr.filter((n)=>n<100)
      1
      * map(回调函数())
      1
      let newArr = arr.map(functionn{retuen n*2}) //遍历返回新的值
      1
      * reduce(回调函数())对数组中所有的内容进行汇总
      1
      let total =arr.reduce(function(preValue,n){return preValue+n},0)//0为preValue的初始值 n为数组中的元素值 total为一个值
  • :input用法
    1
    2
    3
    4
    5
    6
    <input :value="message"  :input="valueChange"/>
    valueChange(event) {
    this.message = event.target.value//获取到输入框的value
    }
    //也可以直接在标签内写方法
    <input :value="message" :input="message = $even.target.valuet"/>