二、js

 一、js基础
 1.js引入方式
 js是脚本语言,可以在浏览器中执行。js文件是以.js为结尾的,引入html文件中时使用script标签,这时script需要添加一个属性src,src中写js文件的路径;但是js还可以直接写在html当中,在html中需要使用<script></script>标签中写js代码
 在html内部写js时,script标签可以放在head中,可以放在body中,还可以放在body后
 2.js基本语法
  js执行顺序,默认是顺序结构,是从上到下,从左到右执行
  js一般一行放一条语句,语句后结束标识是 ";" ,但是结束标识不强制写
  js中换行要求:没有换行要求,最标准的缩进是一个tab。
  js中 if选择/for循环/函数function 后面的语句块都是由 {} 包裹的
 3.变量和常量
  定义变量:var 变量名
     let 变量名
  定义常量:const 常量名
  变量名的命名规范:
   1.组成:字母、数字、下划线、$
   2.首字符不能是数字
   3.不能使用关键字
   4.建议使用驼峰命名法
  使用变量或常量:
   1.直接访问:变量名或常量名
   2.重新赋值:常量不能被重新赋值。变量可以重新赋值,变量中只会保存最后一次赋值。
 4.注释:
  第一种:单行注释: // 注释内容
  第二种:多行注释: /* 中间注释内容 */
  第三种:多行文本注释: /** 注释内容 */

 5.基本数据类型
  1.数字类型(int float) : 1,2,3  3.14
  2.字符串类型(string) : 单引号或双引号引起来的字符,单引号双引号作用一样,没区别
  3.布尔类型(bealoon): true(1) 表示真  false(0) 表示假
  4.undefined类型(undefined): 变量或对象的属性没有赋值时,默认值就是undefined
  5.null类型(null):表示空
  6.对象类型:
   数组(array): 类似python中的List,定义方式 [1,'a',true],通过下标访问元素
   对象(object):类似python中的dict ,定义{"username":"小明","age":18},通过键名访问
   正则表达式:同python
  检查数据类型方法:typeof
   注意:typeof 检测对象类型时,不管是数组还是对象,返回的都是Object

 6.输出方式:
  alert():小括号中写变量或语句,窗口弹出
  console.log():在控制台输出 F12->console

 7.运算符:
  1.算数运算: + - * / %
   除法: 会运算到小数位 ,没有 // 求整
   取余: 运算到该加小数点时的余数
  2.关系运算: > >= < <= == === != !==
   ===和==区别:
    ==是不判断数据类型: 1 == '1'   返回值 true
    ===判断数据类型: 1 === '1' 返回值 false
  3.逻辑运算: &&(逻辑与)  ||(逻辑或)  !(逻辑非)
   没有and / or
   逻辑与、逻辑或都会存在短路运算:
    逻辑与 左边为false,右边不判断直接返回false,左边为true,返回值是右边
    逻辑或 左边为true,右边不判断直接返回 true,左边为false,返回值是右边
  4.赋值运算: = += -= *= /= %= ++(自增) --(自建)
   ++ 、 --:
    用法1: 变量名++ : 本次不改变,下次使用时改变
    用法2: ++变量名 : 先改变后使用,当次生效
 8.parseInt() parseFloat()
  parseInt() : 取小括号中整数部分
  parseFloat() : 取小括号中整数+小数部分
2.流程控制语句
 1.选择结构
  if
   单分支:if(表达式){}
   双分支:if(表达式){语句} else{语句}
   多分支:if(表达式1){} else if(表达式2){} else{}
  switch
   switch(表达式){
    case 值: 语句块 ;break;
    case 值2: 语句块; break;
    default:语句
   }
 2.循环结构
  for
   普通for循环:
    for(表达式1;表达式2;表达式3){循环体}
    表达式1:循环条件的初始值
    表达式2:循环条件的终止值
    表达式3:循环条件的步长
    for(let i=0; i<3 ; i+=1){
    }
   for-in循环:
    for(let i in [1,2,3]){
    }
  while
   表达式1
   while(表达式2){
    循环体;
    表达式3
   }

 3.数学方法:
  Math.random() [0,1)
 4.获取字符串或数组的长度:
  通过.length 属性获取
  'abcd'.length
  [1,2,'a','b'].length
3.js选择器
 选择器作用:找页面中的标签
   选择器类型:id选择器
       document.getElementById('id名')
       返回值:1个具体的标签元素
       class选择器
        document.getElementsByClassName('class名');
        返回值:所有具有指定class名称的元素,是多个,以类数组形式存在,使用某一个元素时通过下标来获取
       标签选择器
        document.getElmentsByTagName('标签名');
        返回值:所有指定标签的集合
4.操作基本dom
 1.获取标签中值
  第一类:获取双标签中的值(div,span,p)
       .innerHTML 来获取
  第二类:获取input标签中的值()
    .value 来获取
  特殊的一个标签:
   textarea 文本域:是双标签,但是获取他的值时使用.value属性
          设置值使用 .innerHTML
    2.添加点击事件
     事件:是一个具有某些功能的函数
     点击事件:鼠标点击某个元素的时候触发的功能
     添加点击事件方法:
      1.找到元素
      2.元素.onclick = function(){}

    3.设置值
     第一类:设置双标签的值
      元素.innerHTML = '新值'
     第二类:设置input标签的值
      元素.value = '新值'
    4.获取属性和修改属性值
     属性有:id , class , name , src ,href , style
     1.获取属性
      元素.getAttribute('属性名')
     2.设置属性值
      元素.setAttribute('属性名','值')

    5.获取和修改css样式
     1.获取css样式
      第一类 行内样式: 元素.style.样式名称
      第二类 内部、外部样式: window.getComputedStyle(元素)['样式名称']
     2.设置css样式
      元素.style.样式名 = 新值
     注意:获取或设置 font-size 类型的样式时,需要变成驼峰命名法(fontSize)

 体质指数(BMI)= 体重(kg)÷ 身高^2(m)
 当BMI指数为18.5~23.9时属正常
 
 
js对象和函数
1.字符串对象
 var str = 'abcd;edf;'
 属性:
  长度属性:length
 方法:
  indexOf('字符',start) : 检测指定字符在字符串中是否存在,如果存在返回下标,如果不存在返回-1(不是python中的反向找下标,这的意思就是没有找到),第二个参数:指定从哪个下标开始向后查询
  slice(start,end) 、substr(start,length) 、substring(start,end):字符串截取,返回新字符串,不改变原字符串
  split('分割规则') : 字符串分割,分割后返回数组(列表)
  replace(old,new) : 字符串替换
  match('字符') : 字符串匹配,返回数组
  trim() : 去除字符串左右空白
  toLowerCase() : 把字符串转成小写
  toUpperCase() : 把字符串转成大写
  
2.数组对象(列表)
 属性:
  长度属性:length
 方法:
  头部添加:unshift()   返回值是数组的新长度,改变原数组
  尾部添加:push()   返回值是数组的新长度,改变原数组
  头部删除:shift()  返回值是被删除的元素,改变原数组
  尾部删除:pop()   返回值是被删除的元素,改变原数组
  修改: splice(start,len,el,el...)  执行时分两步,第一步删除(会删除从指定位置开始的指定长度),第二步添加功能(len后的el是添加的元素,每个元素之间用逗号隔开)
  截取: slice(start,end) 返回新数组,不会改变原数组
  把数组按某种规则转成字符串:join('规则')
  检测指定字符在字符串中是否存在:indexOf()
 数组遍历:
  1.普通for循环
   for(var i=0; i<arr.length; i++){
    i   对应下标
    arr[i] 对应数组中的元素
   }
  2.for-in
   for(var i in arr){
    i   对应下标
    arr[i] 对应元素
   }
3.对象(字典)
 定义对象: var obj = {}
 对象中的数据形式:
  {
   key:value,
   key:value
  }
 对象中的key具有唯一性,如果给已经存在的key赋值,这时是更新功能;如果对象中没有这个key,这时对象中新添加一个key:value键值对
 key一定要是不可变元素
 value可以是任意数据类型
 常用属性:
  长度:Object.keys(对象).length
 访问数据:
  1.访问某一个:对象.key  或者 对象['key']
   如果存在key,同时又对应的值,返回值
   如果不存在key,返回undefined
  2.遍历:for-in
4.函数
 定义函数:
  1. function 函数名(形参列表){
    功能体
    return 可以有,也可以没有
   }
  2. var 变量名 = function(){
    功能体
   }
 调用函数:
  函数名(实参列表)
 和python中不一样的:
  形参和实参个数要求:在python中少传参数报错,在js中少传参数没问题(没有参数的地方自动接收undefined)
  js中只有简单的传参,python中的高级传参方式都没有;
  js中可以给形参默认值
  js函数中有一个特殊的关键字,作用是获取函数调用时传入的所有实参 arguments
 
 js定时器和DOM
1.Math数学方法
 js中数学方法都被封装在Math对象中,使用时调用Math.方法名称即可
 常用的方法:
  Math.random()  随机数 [0,1) ,没参数
  Math.floor()  向下取整 ,没有参数
  Math.ceil()  向上取整 ,没有参数
  Math.round() 四舍五入
  Math.max()  最大值 ,可以接收多个参数,然后判断出最大值
  Math.min()  最小值 ,可以接收多个参数,然后判断出最小值
  Math.PI()  π   ,没参数
2.时间
 js时间是由 Date() 构造函数生成的,使用时需要通过 new 关键字创建
 new Date() 当前时间
 可以通过它的方法取到里面的每一个独立项
 获取年份:new Date().getFullYear()
 获取月份:getMonth() 0~11
 获取日期:getDate()  1~31
 获取星期:getDay()   0~6
 获取小时:getHours() 0~23
 获取分钟:getMunites() 0~59
 获取秒数:getSeconds() 0~59
 时间戳:getTime() 毫秒数
 世界时:toGMTString() /toUTCString()
 转换本地时间:toLocalString()
3.定时器
 定时器的时间是毫秒单位
 1.间隔定时器
  每隔一段时间就执行定时器的功能
  var time1 = setInterval(funciton,time)
  关闭间隔定时器:
   clearInterval(time1)
 2.延时定时器
  等待指定的时间,然后执行唯一一次功能
  var time2 = setTimeout(function,time)
  关闭延时定时器:
   clearTimeout(time2)
4.DOM增删改查
 DOM : document object model ,主要操作的就是页面结构,DOM把页面当成一个结构树(tree),结构树是由节点(标签)组成的
 DOM树的根: document->document type + html
            |
           head   +       body
            |      |
      title+meta+link+script   div+div+div+div
 操作DOM就是对DOM树中的节点(标签)进行操作
 已经学过:操作单个DOM的 内容的获取和设置 , 属性的获取和设置  ,样式的获取和设置
 内容的获取和设置 :
  获取:
  1.双标签(div) : innerHTML
  2.input  : value
  设置:
  1.双标签 :innerHTML = 新值
  2.input :value = 新值
 属性的获取和设置:
  获取:
   getAttribute('属性名称')
  设置:
   setAttribute('属性名称','新值');
 样式的获取和设置:
  获取:
   行内:元素.style.属性名
   内部、外部样式: window.getComputedStyle('元素')['属性名']
  设置:
   元素.style.属性名 =新值
 DOM节点的增删改查
  增加:向DOM中添加新的标签
   第一步:创建新标签
    1.标签节点:document.createElement('标签名')
    2.内容节点:document.createTextNode('内容')
   第二步:添加到页面
    1.添加到指定父级的最后: 父级.appendChild('新标签')
    2.添加到指定父级的指定位置: 父级.insertBefore('新标签','要插入到这个标签前')
   新创建的标签是一个完整的DOM,所以可以给新创建的标签进行属性和样式、内容操作
   新创建标签操作:
    内容操作:双标签的.innerHTML
       input.value
    属性操作:标签.属性名=属性值
    样式操作:标签.style.样式名称 = 值

  增加的另外一种方案:
   字符串方法:具体某个元素中要添加的内容,使用innerHTML形式,添加指定字符串。
   字符串方法和创建标签法的区别:
    1.创建标签法创建的是DOM元素 ;字符串方式创建的是普通字符串,不具备DOM操作功能
    2.创建标签可以决定标签添加到那个位置,不删除原来的元素; 字符串方式把父级标签中所有元素删除,然后再添加字符串

 删除:
  从DOM中删除某一个节点
  元素.removeChild('要删除的节点')
 修改(替换):
  把原来的节点换成新节点
  元素.replaceChild('新节点','旧节点')
 查询:
  前面学过id选择器、class选择器、标签选择器:他们的作用是查找到某一个或某一类标签元素
  今天学习几个快速查询节点的方式:
   查询第一个子节点:元素.firstChild
   查询最后一个子节点:元素.lastChild
   查询当前元素的下一个节点:元素.nextSibling
   查询当前元素的上一个节点:元素.previousSibling
   查询当前元素的父节点:元素.parentNode
   查询所有子级节点:元素.children
   查询当前元素是否有子节点:元素.hasChildNodes()
 
 js事件响应
1.事件类型
 1.鼠标事件:
  单击事件:click
  双击事件:dblclick
  鼠标经过事件: mouseover  会事件冒泡
  鼠标离开事件: mouseout (会事件冒泡) / mouseleave (不会事件冒泡)
  鼠标进入事件: mouseenter  不会事件冒泡
  hover事件:有两个过程,鼠标进入时执行鼠标进入事件,鼠标离开时执行鼠标离开事件
  鼠标移动事件: mousemove
  鼠标按下事件: mousedown
  鼠标抬起事件: mouseup
 2.键盘事件:
  键盘按下事件: keydown
  键盘抬起事件: keyup
  键盘长按事件: keypress
  可以获取按下的案件的keyCode值
   回车键 13
   空格键 32
 3.表单事件
  获取焦点事件: focus
   元素.onfocus = function(){} 元素获取到焦点后执行的功能
   元素.focus()  让元素获取焦点
  失去焦点事件: blur
  提交事件: submit
 4.事件冒泡
  事件冒泡:从当前触发元素开始,向上级触发具有相同事件类型的事件,直到document,的过程
2.绑定事件的方法
 1.DOM0级
  绑定事件:元素.on+事件类型 = function(){}
  取消事件:元素.on+事件类型 = null
  DOM0级给同一个元素绑定相同的事件,只会执行后面定义事件的功能函数
 2.DOM2级
  绑定事件: 元素.addEventListener('事件类型',fn)
  取消事件: 元素.removeEventListener('事件类型',fn)
  DOM2级绑定事件:同一个元素可以绑定多个相同的事件,多个事件的功能函数都会执行
  取消绑定时需要指定取消的功能函数,要求函数是具名函数
3.事件对象
 事件在被触发时,都会生成一个事件对象,这个事件对象中保存所有和当前事件有关的信息
 event 事件对象
 事件对象经常在事件触发函数中当形参传递到函数内部
 比较常用的几个信息:
  target:触发元素
  type: 什么类型的触发
  keyCode: 键盘事件下的按键keyCode值
  x,y坐标信息:
   offsetX , offsetY : 相对于当前容器左上角的x,y坐标
   clientX , clientY : 相对于可视窗口左上角的x,y坐标
 
4.事件委托
 事件委托是把事件定义在它父级或祖先级元素上,真正触发这个事件执行是我们原来想定义事件的元素。
 使用事件委托的场景:页面中通过js新创建的元素,可以使用事件委托绑定事件
5.滚动事件 scroll
 1)作用整个页面
  当页面发生上下滚动时,浏览器会触发一个滚动事件,发生滚动事件时可以获取到滚动高度和距离左边的滚动距离
    滚动高度: scrollTop
    滚动距左边距离: scrollLeft
    这两个属性是可以读取可以设置
    window.onscroll = function(){
     //获取页面滚动高度
     document.documentElement.scrollTop
     document.body.scrollTop
     var sTop = document.documentElement.scrollTop || document.body.scrollTop
    }
 2)作用于某一个具体的元素
  这个元素必须设置属性 overflow:scroll,才能出现滚动条
  获取滚动距离:
   元素.scrollTop
   元素.scrollLeft
 
原文地址:https://www.cnblogs.com/dangjingwei/p/12594973.html