汇编语言:汇编语言、高级语言
JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即/时编译型的编程语言。
三大特点:继承 封装 多态
js数据类型
| 基本类型 | String(字符串) Number(数字) Boolean(布尔值) Undefined(未定义) Null(空) Symbol |
|---|---|
| 引用类型 统称 Object(对象) |
Object Array Function 正则表达式(new RegExp) |
js数据类型转化
| Number() | 将字符串转化为number类型> parseInt(string) 转换为整数值型
parseFloat(string) 转换为浮点数值型
| | —- | —- | | String() | 将所有类型转化为字符串类型> toString()
String() 加号拼接字符串+’’
| | Boolean() | 将所有类型转化为布尔类型 | | 自动转化类型 | 你不需要调用js封装好的方法直接可以转化我们数据类型 | | JSON.stringify() | 将 JavaScript 值转换为 JSON 字符串 | | JSON.parse() | 将其转换为 JavaScript 对象: |
js运算符
| 算数运算符 | + - / % 取余 取模 获取余数 * 指数 |
|---|---|
| 比较(关系)运算符 | > < >= <= != 值不等于 == 值是否相等 === 值和类型是否相等 !== 值和类型不相等 |
| 逻辑运算符 | || 或 && 且(与) ! 非 取反 如果结果为true 取反获取结果就为false 反之亦然 |
| 赋值运算符 | = += -= = /=a %= *= |
| 三元(三目)运算符 | 等价替换if else 格式: 条件 ? 值1 : 值2 解释: 如果条件成立 输出为1 否则为2 |
| 一元运算符 | ++ — 自加 自减 |
js流程控制
顺序结构
分支结构
switch语句
var day=prompt('请输入1~7一个数字');switch(day) {case 1:console.log('星期一');break;case 2:console.log('星期二');break;case 3:console.log('星期三');break;case 4:console.log('星期四');break;case 5:console.log('星期五');break;case 6:console.log('星期六');break;case 7:console.log('星期日');break;default:console.log('请输入1-7之间的任意数字');}
js循环语句
for循环 while循环 do…while循环
while循环
var message = prompt('你爱我吗?');while (message !== '我爱你') {message = prompt('你爱我吗?');}alert('我也爱你呀~')
do…while循环
do {//循环体} while (条件表达式)//do while 先执行一次循环体,再判断条件,若结果为真,则继续,否则退出注意:先执行,再判断,至少会执行一次循环替代码
js数组
Array数组声明 三种:
1.使用new Array var arr=new Array(10,20,true);
2.可以省略new关键字 var arr=Array(10,20,true);
3.直接赋值 var arr=[10,20,true];
数组方法:
| push() | 往数组的最后一位添加元素 |
|---|---|
| pop() | 删除数组最后一位元素 |
| unshift() | 往数组的第一位添加元素 |
| shift() | 删除数组的第一位元素 |
| slice() | 取用 slice(a,b) a起始 b结束 不包含b |
| splice() | 删除splice(0,2) 替换元素splice(0,2,text) |
| split(‘,’) | 用传入的拼接符 将字符串分割为字符串数组””→[ ] |
| join(‘,’) | 用传入的拼接符 将字符串数组分割为字符串[ ] → “” |
| concat() | 合并数组 |
| reverse() | 翻转数组 |
| sort() | 对数组进行排序 使用的是unicode编码进行排序 |
| indexOf() | 查找数组的下标索引 |
| forEach() | 只要能够使用for循环进行遍历的数组 都可以使用forEach进行循环遍历 |
遍历对象
for (var k in obj) {console.log(k);console.log(ibj[k]);}//我们使用for in里面的变量 我们喜欢写 k 或者 key
删除对象属性
js内置对象和方法
1.Math对象
| Math.random() | 在js中 很多关系数学运算的函数 直接一个Math对象来进行提供 返回0.0-1.0之间的随机数 不可能是1 [0,1) |
|---|---|
| Math.max(num1, num2) | 返回最大的数 |
| Math.min(num1, num2) | 返回最小的数 |
| Math.abs(num) | 求绝对值 |
| Math.round() | 四舍五入(整数 只看小数点后一位) |
| Math.floor() | 向下取整 |
| Math.ceil() | 向上取整 |
| Math.pow(2,3) | 2的3次方 |
2.字符串的方法
| indexOf(“字符”) | 查找第一个下标索引是几,没有就是-1 |
|---|---|
| lastIndexOf(“字符”) | 查找最后第一个下标索引是几,没有就是-1 |
| charAt(下标索引) | 返回制定索引的字符 |
| split(‘,’) | 用传入的拼接符 将字符串分割为字符串数组””→[ ] |
| slice() | 取用 slice(a,b) a起始 b结束 不包含b |
| toUpperCase() | 将字符串转化为大写 |
| toLowerCase() | 将字符串转化为小写 |
| substring(a,b) | a起始位,b结束位(不包含) |
| substr(a, b) | a起始位,b长度(不写就是直接到最后) |
| replace() | replace(/hi/,”你好”)把’hi’替换成’你好’ replace(/o/g,”i”)把所有’o’替换成’i’ |
3.Date时间对象
日期类型使用自UTC(国际协调时间)1970年1月1日午夜(零时)开始经过毫秒数来保存的
1 创建对象
new Date() // 创建日期对象
Date() 日期对象 是一个构造函数 必须使用new来调用我们的日期对象
2 Date对象的方法
| Date.parse | (日期:2000/11/11 或 2000-11-11 或 2000.11.11) 可以将日期对象转化为毫秒数 |
|---|---|
| getFullYear() | 年 从Date对象中返回年份 |
| getMonth()+1 | 月 从Date对象中返回的月份小一个月 |
| getDay() | 周 从Date对象中返回一周中的某一天(0-6) 0表示周日 |
| getDate() | 日 从Date对象中返回一个月中的某一天(1-31) |
| getHours() | 时 从Date对象中返回小时 |
| getMinutes() | 分 从Date对象中返回分钟 |
| getSeconds() | 秒 从Date对象中返回秒 |
| getMillseconds() | 毫秒 从Date对象中返回毫秒 |
3 日期格式化(将毫秒数数转化为时间)
只能在date对象中使用
使用前先声明一个新的date
var date2 = new Date(1000000+ 2000000);
| date.toDateString() | Wed Nov 03 2021 |
|---|---|
| date.toString() | Wed Nov 03 2021 10:11:42 GMT+0800 (中国标准时间) |
| date.toTimeString() | 09:05:47 GMT+0800 (中国标准时间) |
| date.toUTCString() | Wed, 03 Nov 2021 01:05:53 GMT |
| date.toLocaleTimeString() | 上午9:00:00 |
| date.toLocaleDateString() | 2021/11/3 |
| date.toLocaleString() | 2021/11/3上午9:06:09 |
时间戳(总的毫秒数) 返回1970年1月1日至今的毫秒数
方法1 var date = new Date(); console.log (date.valueOf()); console.log (date.getTime());
方法2 (常用) var date = +new Date(); console.log(date);
方法3 (H5新增的) console.log(Date.now());
var date = new Date(); 如果没有参数 返回系统的当前时间 var date = new Date(2019,10,10); (返回的是11月 多了一个月) var date = new Date(‘2019-10-10 8:8:8’); (月份正常打印) 返回括号内的时间
//封装一个 时:分:秒function getTime() {var date = new Date();var h = date.getHours();h = h < 10 ? '0' + h : h;var m = date.getMinutes();m = m < 10 ? '0' + m : m;var s = date.getSeconds();s = s < 10 ? '0' + s : s;return h + ':' + m + ':' + s;}console.log(getTime());
DOM
文档对象模型
文档:document
元素:element
节点:node
获取元素
1.根据ID获取 [不用]
document.getElementById(‘time’);
2.根据标签名获取 [不用]
document.getElementsByTagName(‘li’);
3.通过类名方法获取(HTML5新增的)
document.getElementsByClassName(‘类名’); 里面的选择器需要加符号,只能返回第一个元素对象↓ document.querySelector(‘.box’); document.querySelectorAll(‘.box’);
4.特殊元素获取
document.body;
document.documentElement;
操作元素
| 改变元素内容 | > element.innerText [不用这个]
不识别html标签 非标准 p.innerText获取元素内容,不保留html标签,并且变为一行
element.innerHTML 识别html标签 W3C标准 p.innerText获取元素内容,保留html标签和换行和空格
|
| —- | —- |
| 常用元素的属性操作 | 1.innerHTML 改变元素内容
2.src、href
3.id、alt、title |
| 表单元素的属性操作 | type
value
checked
selected
disabled
input.value=’被点击了’;
btn.disabled=true; 禁用按钮1
this.disabled=true; 禁用按钮2 指向函数的调用者 |
| 循环显示操作 | var flag=0; |
| 样式属性操作 | 通过JS修改元素的大小、颜色、位置等操作
1.element.style 行内样式操作
2.element.className 类名样式操作 |
| 注意:
1.如果修改样式比较多,可以采取操作类名方式更改元素样式
2.class因为是个保留字,因此使用className来操作元素类名属性
3.className 会直接更改元素的类名,会覆盖原先的类名。 | |
获取/设置 属性
| 获取属性 | element.属性 主要获得自定义属性(标准)自定义的属性值 element.setAttribute(‘属性’,’值’); |
|---|---|
| 设置属性值 | element.属性=’值’; element.setAttribute(‘date-index’,i); |
| 获得自定义内置属性值 | element.getAttribute(‘属性’); element.dataset.index; element.dataset[‘index’]; element.dataset 获取所有data开头的自定义属性 |
| 移出属性 | div.removeAttribute(‘index’); |
自定义属性以data-开头 并且赋值
如果自定义属性里面有多个-链接的单词,我们获取的时候采取 驼峰命名法
节点操作(利用节点层级关系获取元素)
| 获取父节点 | .parentNode |
|---|---|
| 获取所有子节点 | .children .children[i] |
| 获取第一个子节点 | .firstElementChild |
| 获取最后一个子节点 | .lastElementChild |
| 下一个兄弟元素节点 | .nextElementSibling |
| 上一个兄弟元素节点 | .previousElementSibling |
操作元素节点的属性
获取data-自定义属性值有两种形式
| 自定义属性 | data-自定义属性名=”属性值” |
|---|---|
| 获得自定义属性值 | element.getAttribute(“data-index”); element.dataset.index [常用] |
| 获取所有data开头的 自定义属性 |
element.dataset |
| 设置自定义属性值 | element.setAttribute(‘属性’,’值’); |
| 删除自定义属性 | element.removeAttribute(‘属性’); |
| 修改自定义属性值 | 你可以直接赋值 element.dataset.index=”新值”; |
| 添加自定义类名 | element.classList.add(“新添加的类名”) |
|---|---|
| 删除自定义类名 | element.classList.remove(“类名”) |
| 获取自定义类名 | element.className |
| 若无则加,若有则删 | element.classList.toggle(“类名”) |
| 类名替换 | classList.replace( oldClassName,newClassName ); |
| 获取dom元素的内容 或向对象插入内容 |
innerHTML |
我们想要页面添加一个新的元素:1.创建元素 2.添加元素
| 1.创建节点 | document.createElement(‘li’) document.createTextNode(“文本”) |
|---|---|
| 2.添加节点 | 后面添加节点 ul.appendChild(‘li’) 前面添加节点 ul.insertBefore( lili,ul.children[0] ) |
| 3.删除节点 | node.removeChild(child) 节点.remove() 删除自己 |
| 4.复制节点(克隆节点) | node.cloneNode(true) |
| 5.替换节点 | 父节点.replaceChild(new,old) |
三种动态创建元素区别
1.document.write 是直接将内容写入页面的内容流,页面会重绘
2.innerHTML 是将内容写入某个 DOM 节点,不会导致页面全部重绘
3.innerHTML 创建多个元素效率更高(不要拼接字符,采取数组形式拼接),结构稍微复杂
4.createElement() 创建多个元素效率稍低一点点,但是结构更清晰
总结:不同浏览器下,innerHTML数组形式拼接效率要比 creatElement 高
元素可视区client系列
| client系列属性 | 作用 |
|---|---|
| element.clientTop | 返回元素上边框的大小 |
| element.clientLeft | 返回元素左边框的大小 |
| element.clientWidth | 返回自身包括padding、内容区的宽度,不含边框,返回数值不带单位 |
| element.clientHeight | 返回自身包括padding、内容区的高度,不含边框,返回数值不带单位 |
DOM重点核心
| 创建 | 1.innerHTML 2.createElement |
|---|---|
| 增 | 1.appendChild 2.insertBefore |
| 删 | 1.removeChild |
| 改 | 1.修改元素属性:src、href、title等 2.修改普通元素内容:innerHTML、innerText 3.修改表单元素:value、type、disabled等 4.修改元素样式:style、className |
| 查 | H5 新方法:querySelector、querySelectorAll 提倡使用 |
利用节点操作获取元素:
| 父 | parentNode |
|---|---|
| 子 | children children[i] |
| 第一个子节点 | firstElementChild |
| 最后一个子节点 | lastElementChild |
| 上一兄弟 | previousElementSibling |
| 下一兄弟 | nextElementSibling |
属性操作:
| setAttribute | 设置dom的属性值 |
|---|---|
| getAttribute | 得到dom的属性值 |
| removeAttribute | 移除属性 |
事件操作:
| onclick | 点击左键单击 |
|---|---|
| ondblclick | 点击左键双击 |
| onmouseover (不用) onmouseenter |
鼠标经过 |
| onmouseout (不用) onmouseleave |
鼠标离开 |
| onfocus | 获得鼠标焦点 |
| onblur | 失去鼠标焦点 |
| oninput | 数据实时更新 |
| onchange | 失去焦点并且元素内容改变 (三级联动) 表单元素用onchange点击 |
| onselect | 选中触发 |
| this.selectionStart this.selectionEnd |
选中的起始索引 选中的结束索引 |
| onmousemove | 鼠标移动触发 |
| onmouseup | 鼠标弹起触发 |
| onmousedown | 鼠标按下触发 |
| contextmenu | 禁止鼠标右键 |
| selectstart | 禁止鼠标选中 |
| drag | 在元素获取或者选取的文本被拖动时触发 【添加draggable=’true’就可以拖动】 【添加ondrag=’drag()’就可以拖动】 |
| drop | 在拖拽过程中 释放鼠标触发 |
| dragend | 完成拖动 |
| dragstrat | 开始拖动 |
| dragenter | 当对象进入到其容器内触发 |
| dragleave | 当对象离开其容器内触发 |
| dragover | 当对象在另一个对象容器范围内拖动时候触发 |
| document.document.scrollTop | 滚动条距离最顶部 |
| scroll | 鼠标滚动事件 |
| transitionend | 动画 |
value.substring ( this.selectionStart,this.selectionEnd ) 选中
注册事件
addEventListener( )
btn[0].addEventListener(‘click’,function( ) {})
删除事件
传统:
div[0].onclick=null
监听事件:
function fn() {
alert(‘111111’)
}
div[1].removeEventListener(‘click’,fn);
DOM事件流
1.捕获阶段
2.当前目标阶段
3.冒泡排序
注意
1.JS代码中只能执行捕获或者冒泡其中的一个阶段
2.onclick和attachEvent只能得到冒泡阶段
3.捕获阶段 如果addEventListener 第三个参数是 true 那么则处于捕获阶段 →从大到小
冒泡阶段 如果addEventListener 第三个参数是flase 或者 省略 那么则处于冒泡阶段 →从小到大
4.实际开发中我们很少使用事件捕捉,我们更关注事件冒泡
5.有些事件没有冒泡的,比如:onblur、onfocus、onmouseenter、onmouseleave
6.事件冒泡有时候会带来麻烦,有时候又会帮助很巧妙的做某些事。
事件对象
div.onclick=function(e) {
console.log(e)
}
监听事件
div.addEventListener(‘click’,function(e) {
console.log(e)
} , false); 冒泡
事件对象常见属性和方法
| 事件对象属性方法 | 说明 |
|---|---|
| e.target | 返回触发事件的对象 |
| e.type | 返回事件的类型 比如click mouseover 不带on |
| e.preventDefault() | 该方法 阻止默认事件 (默认行为) 标准 比如不让链接跳转 |
| e.stopPropagation() | 阻止冒泡 |
事件委托
| 事件委托原理 | 不是每个子节点单独设置监听器,而是事件监听器设置在其父节点上,然后利用冒泡原理影响设置每个子节点。 |
|---|---|
| 事件委托作用 | 只操作了一个DOM,提高了程序的性能 |
title.addEventListener('click', function (e) {var current = document.querySelector('.current');current.classList.remove('current');e.target.classList.add('current');})
鼠标事件对象
| 鼠标事件对象 | 说明 |
|---|---|
| e.screenX | 返回鼠标相对于电脑屏幕的 X 坐标 |
| e.screenY | 返回鼠标相对于电脑屏幕的 Y 坐标 |
| e.clientX | 返回鼠标相对于浏览器窗口可视区的 X 坐标 |
| e.clientY | 返回鼠标相对于浏览器窗口可视区的 Y 坐标 |
| e.pageX | 返回鼠标相对于文档页面的X坐标 |
| e.pageY | 返回鼠标相对于文档页面的Y坐标 |
常用键盘事件
| 键盘事件 | 触发条件 |
|---|---|
| onkeyup | 某个键盘按键被松开时触发 [不区分大小写] |
| onkeydown | 某个键盘按键被按下时触发 [不区分大小写] |
| onkeypress | 某个键盘按键被按下时 触发 [区分大小写] 但是它不识别功能键 比如ctrl shift箭头等 |
键盘事件对象
| 键盘事件对象属性 | 说明 |
|---|---|
| keyCode | 返回该键的ASCll值 |
console.log(e.key) 打印出按下了什么键
注意:onkeydown 和 onkeyup 不区分字母大小写,onkeypress区分字母大小写。
实际开发中,我们更多的使用keydown和keyup,他能识别所有的键(包括功能键)
Keypress不识别功能键,但是keyCode属性能区分大小写,返回不同的ASCll值
立即执行函数
| ( function ( ) { //执行代码块 } )( ) |
第二个小括号可以看做是调用函数 |
|---|---|
| ( function sum(a,b) { console(a+b) } )(2,3) |
|
| !function ( ) { }( ) | |
| +function ( ) { }( ) | |
| -function ( ) { }( ) | |
| 主要作用:创建一个独立的作用域、避免了命名冲突问题 |
BOM
浏览器对象模型
window对象
| 屏幕尺寸 | screen |
|---|---|
| 历史记录 | history |
| 浏览器信息 | navigator |
| 地址栏 | location |
window对象的属性
| 对象 | 方法 |
|---|---|
| history | history.back( ) 后退 history.forward( ) 前进 history.go(-1) 前进后退功能 参数1是前进1个 -1是后退1个 |
| location | location.hash[不用] 返回一个url锚部分 返回片段 #后面内容 常用于链接锚点 location.host 返回url主机名和端口 hostname 返回url主机名(域名)www.itheima.com location.port[不用] 返回url服务器使用的端口号 如果未写返回 空字符串 location.pathname 返回url路径名 location.search 返回url的查询部分 返回参数 location.href 返回完整的url链接 获取或者设置整个URL location.assign( ) 跟href一样,可以跳转页面(重定向页面) location.replace( ) 替换当前页,因为不记录历史,所以不能后退页面 location.reload( ) 重载页面,相当于F5 如果参数为true 强制刷新ctrl+F5 |
| document | document.body 返回body元素 document.creatlement 创建元素节点 document.createTextNode 创建文本节点 document.getElementById document.querySelector document.querySelectorAll document.getElementByClassName document.write 向文本写html表达式或者js代码 document.hasAttributes 文档是否有该属性 document.parentNode 文档是否有父节点 document.previousSibling 文档是否有兄弟节点 |
| screen | screen.availHeight 返回的是屏幕的高度(包含导航栏) screen.availWeight 返回的是屏幕的宽度(包含导航栏) screen.colorDepth 返回设备或者是缓冲器上的调色板的比特深度 screen.height 返回屏幕的总高度 screen.width 返回屏幕的总宽度 |
| navigator | navigator.appCodeName 返回浏览器代码名 navigator.appName 返回浏览器名 navigator.Version 返回浏览器版本号和版本信息 navigator.platform 返回运行浏览器操作系统平台 |
| innerWidth | 返回窗口文档显示区的高度 |
| innerHeight | 返回窗口文档显示区的宽度 |
| outerHeight | 返回窗口的外部高度 |
| outerWidth | 返回窗口的外部宽度 |
| name | 设置或返回窗口的名称 |
window对象方法
window.alert ( )
window.open ( )
用于打开一个新的浏览器窗口或者查找一个已命名的窗口
window.open(url,name,specs,replace)
url 可选 打开指定的页面的url链接 如果没有指定的url 打开的是空白窗口 _blank-URL 加载到一个新的窗口 _parent-URL 加载带一个新的窗口 _self-URL 替换当前的页面 _top-URL 替换任何的框架 name 窗口的名称 specs 可以选 一个逗号分隔的项目列表 replace 是在窗口浏览器历史中创建一个新条目 还是替换浏览器 true 替换浏览器历史中的创建新的条目 false 在浏览器历史中创建新的条目
window.close ( ) 关闭浏览器窗口
window.confirm ( ) 显示带有一短消息以及确认按钮和取消按钮的对话框
window.prompt ( ) 显示可提示用户输入的对话框 返回用户输入的字符串
peompt(msg,defaultText) 两个参数: msg 可选 要在对话框中显示的纯文字 defaultText 可选 默认的输入文本
元素偏移量offset系列
| offset系列属性 | 作用 |
|---|---|
| element.offsetParent | 返回作为该元素带有定位的父级元素 如果父级都没有定位则返回body |
| element.offsetTop | 返回元素相对带有定位父元素上方的偏移 |
| element.offsetLeft | 返回元素相对带有定位父元素左边的偏移 |
| element.offsetWidth | 宽度 返回自身包括padding、边框、内容区的高度,返回数值不带单位 |
| element.offsetHeight | 高度 返回自身包括padding、边框、内容区的高度,返回数值不带单位 |
scroll系列属性
| scroll系列属性 | 作用 |
|---|---|
| element.scrollTop | 返回被卷去的上侧距离,返回数值不带单位 |
| element.scrollLeft | 返回被卷去的左侧距离,返回数值不带单位 |
| window.pageTOffset | 页面被卷去的头部 |
| element.scrollWidth | 返回自身实际的宽度,不含边框,返回数值不带单位 |
| element.clientWidth | 返回自身包括padding、内容区的宽度,不含边框,返回数值不带单位 |
| element.scrollHeight | 返回自身实际的高度,不含边框,返回数值不带单位 |
| window.pageYOffset>=mainTop |
| offset系列经常获取元素位置 | offsetLeft offsetTop |
|---|---|
| client经常用于获取元素大小 | clientWidth clientHeight |
| scroll经常用于获取滚动距离 | scrollTop scrollLeft |
| 页面滚动距离通过window.pageXOffset 获得 |
window.scrollTo ( )
可以把内容滚动到指定的坐标scrollTo(x,y)两个参数: x 必填 要在窗口文档显示区左上角显示的文档的x坐标 y 必填 要在窗口文档显示区左上角显示的文档的y坐标
窗口加载事件
window.onload=function() {
};
window.addEventListener(‘load’,function( ) {
}); 用了这个script可以放在任意位置
document.affEventListener(‘DOMContentLoaded’,function() { } );
注意:
1.window.onload可以放在任意位置
2.window.onload传统注册事件只能写一次
3.addEventListener则没有限制
DOMContentLoaded是DOM 加载完毕,不包含图片 falsh css等就可以执行 加载速度比load更快一些
调整窗口大小事件
window.onresize = function( ) { } window.addEventListener(“resize”,function() { } );
定时器
| 设置setTimeout()定时器 | setTimeout() window.setTimeout(调用函数,[延迟的毫秒数]) |
|---|---|
| 停止setTimeout()定时器 | clearTimeout(定时器名字) |
| 只调用一次 |
function fn() {
console.log('时间到');
}
var timer1 = setTimeout(fn, 1000);
var timer2 = setTimeout(fn, 2000);
//--------------------------------------------
setTimeout(function () {
console.log(22222222);
}, 1000);
| 设置setInterval()定时器 | setInterval() window.setInterval()(调用函数,[延迟的毫秒数]) |
|---|---|
| 停止setInterval()定时器 | clearsetInterval(定时器名字) |
| 每隔一个时间调用一次 |
同步和异步·
事件循环
先处理console.log( );
再处理function ()
vavigator对象
下列前端代码可以判断用户在哪个终端打开页面,实现跳转
if((navigator.userAgent.match(/(phone|pad|iPhone|iPod|ios|iPaAndroid|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fenner|wOSBrowseBrowserNG|WebOS|Symbian|Windows Phone)/i))) {
window.location.href = ""; //手机
} else {
window.location.href = ""; //电脑
}
本地存储
1、数据存储在用户浏览器中
2、设置、读取方便、甚至页面刷新不丢失数据
3、容量较大,sessionStorage约5M、localStorage约20M
4、只能存储字符串,可以将对象SON.stringify( )编码后存储
| localStorage 本地存储[常用] 特点(5M): 1、生命周期永久生效,除非手动删除否则关闭页面也会一直存在, 不可跨浏览器 2、可以多窗口(页面)共享(同一浏览器可以共享) 3.以键值对的形式存储使用 |
1.设置存储数据 localStorage.setItem(“key”,value) key 自定义的localStorage属性名 value 给当前属性添加的属性值 改值可以是任意数据类型 [注意:使用localStorage存储的数据都会被转化为字符串] 2.获取数据 localStorage.getItem(“key”) 3.删除数据 localStorage.removeItem(“key”) 4.删除所有数据 [不推荐使用] localStorage.clear( ) |
|---|---|
| sessionStorage 临时会话存储 特点(20M): 1、生命周期为关闭浏览器窗口 2、在同一个窗口(页面)下数据可以共享 3.以键值对的形式存储使用 |
1.存储数据 sessionStorage.setItem(“key” , value) 2.获取数据 sessionStorage.getItem(“key”) 3.删除数据 sessionStorage.removeltem(key) 4.删除所有数据 [不推荐使用] sessionStorage.clear( ) |
| cookie [不常用] 特点(4k): Cookie 存储大小为单条 Cookie 不会自动清除 但它会过期 Cookie 可以设置有效期 |
1.存储数据 document.cookie=”属性名=属性值” 如果想依次设置多个cookie document.cookie=”属性名1=属性值1;” 2.对cookie设置有效期 document.cookie=”属性名=属性值;expires=Thu,01 Jan 1970 00:00:00 GMT” 如果当前expires里边所写的日期早于当前系统时间 表示删除cookie 如果当前expires里边所写的日期晚于当前系统时间 表示几天后过期 可以实现网站里边经常使用7天免登录 30天免登录等等效果 3.获取cookie document.cookie |
| JSON.stringfy( ) 将json转化为字符串形式 JSON.parse( ) 将字符串的json转化为对象 |
var username = document.querySelector('#username');
var remember = document.querySelector('#remember');
if (localStorage.getItem('username')) {
username.value = localStorage.getItem('username');
remember.checked = true;
}
remember.addEventListener('click', function () {
if (this.checked) {
localStorage.setItem('username', username.value)
} else {
localStorage.removeItem('username')
}
})
正则表达式
| 表单验证 | |
|---|---|
| exec方法 | exec( ) 匹配成功返回一个结果数组 失败返回null |
| test方法 | test() 检索 查看表达式与字符串是否匹配 匹配成功返回true 失败返回false |
| match方法 | match() 检索返回是一个字符串正则匹配的表达式结果 跟exec方法输出结果类似 |
| search方法 | search() 方法执行正则表达式和String对象之间一个搜索匹配 匹配成功 返回正则表达式在字符串中的首次匹配项的索引 该方法中修饰符g是无效的 匹配失败 返回-1 |
| replace方法 | replace()方法返回一个由替换值替换部分或者所有模式匹配项后的新的字符串 replace(/激情 | gay/g,’‘); 全局匹配 replace(/激情 | gay/i,’‘); 忽略大小写 |
| split方法 | split()方法 以某种形式分割字符串为字符串数组 str.split(/a/,1) |
| 修饰符 | |
|---|---|
| 忽略大小写 i | var reg=/abc/i |
| 全局匹配 g | var reg=/abc/g |
正则表达式的特点
1.灵活性、逻辑性和功能性非常的强。
2.可以迅速地用极简单的方式达到字符串的负责控制。
3.对于刚接触的人来说,比较晦涩难懂。 比如:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$
4.实际开发中,一般都是直接复制写好的正则表达式,但是要求会使用正则表达式并且根据实际情况修改正则表达式。比如用户名:\^[a-z0-9_-]{3,16}$/
| 边界符 ^ $ | |
|---|---|
| var rg=/abc/ | 正则表达式里面不需要加引号 不管是数字型还是字符型 |
| /abc/ | 只要包含有abc这个字符返回的就是true |
| /^abc/ | 必须以abc开头的 |
| /^abc$/ | 精准匹配 要求必须是abc字符串才符合规范 |
| /[abc]/ | 只要包含有 a 或者包含有 b 或者包含有 c 都返回为 true |
| /^[abc]$/ | 只有是a 或者b 或者c 这三个字母才返回 true |
| /^[a-z]$/ | 26个英文字母任何一个字母 返回true |
| 字符组合 | |
| /^[a-zA-Z0-9_-]$/ | 26个英文字母(大小写都可以)任何一个字母返回true |
| /^[^a-zA-Z0-9_-]$/ | 如果中括号里面加^代表取反 不能包含的 |
量词符 用来设定某个模式允许出现的次数
| 量词 | 说明 | |
|---|---|---|
| * | 重复零次或者更多次 | var reg=/^a*$/; |
| + | 重复一次或更多次 | var reg=/^a+$/; |
| ? | 重复零次或一次 | var reg=/^a?$/; |
| {n} | 重复n次 | var reg=/^a{3}$/; |
| {n,} | 重复n次或更多次 | var reg=/^a{3,}$/; 大于等于3 |
| {n,m} | 重复n次到m次 | var reg=/^a{3,6}$/; 大于等于3 小于等于6 |
| 元字符 预定类 | 说明 |
|---|---|
| \d | 匹配0-9之间的任一数字,相当于 [0-9] |
| \D | 匹配所有0-9以外的字符,相当于 [^0-9] |
| \w | 匹配任意的字母、数字和下划线 |
| \W | 除素有字母、数字和下划线以外的字符,相当于 [^A-Za-z0-9_] |
| \s | 匹配空格 (包括换行符、制表符、空格符等),相当于[\t\r\n\v\f] |
| \S | 匹配非空格的字符,相当于[^\t\r\n\v\f] |
| \d | 临界值 只能当前字符串结尾的字符 如果当前匹配的字符后边还有字符 则不能匹配 查找数字 |
| \D | 查找非数字字符 |
| ^ | 表示正则匹配开始 |
| $ | 表示正则匹配结束 |
| ?= | 如果前边内容匹配 则执行等号后边的内容 |
| ?! | 如果问号前边的内容匹配 匹配内容不等于!后边内容时候 匹配 |
| ?: | 如果问号前边匹配 则继续执行冒号后边的匹配项 |
| 组合 | |
| [0-9] | 0-9 |
| [a-z] | a-z |
| [A-Z] | A-Z |
| [A-z] | 查找任何从A到小写z之间的字母 |
| [xyz] | 去匹配里边的任意一个字符 |
| [^xyz] | 反向字符集 |
节流阀
为了防止轮播图连续点击造成播放过快
节流阀目的:当上一个函数执行完毕,再去执行下一个函数动画,让事件无法连续触发。
核心实现思路:利用回调函数,添加一个变量来控制,锁住函数和解锁函数。
开始设置一个变量var flag=true;
if(flag){flag=false;do something} 关闭水龙头
利用回调函数 动画执行完毕,flag=true 打开水龙头
animate(ul,num,function() { flag=true; }) var flag=true; if(flag) { flag=false; }
常见网页特效案例
window.pageYOffset 得到页面滚动的值
window.scroll(x,y) 最后是页面滚动
窗口滚动 所以对象时window
animate(window,0);
构造函数和原型
原型:原型是一个对象,我们也称为prototype为原型对象。
原型作用:共享方法。
一般情况下,我们公共属性定义到函数构造里面,公共的方法我们放到原型对象身上。
构造函数方法很好用,但是存在浪费内存的问题
function Star(uname,age) {
this.uname=uname;
this.age=age;
this.sing=function() {
console.log('我会唱歌');
}
}
var ldh=new Star('刘德华',18);
var zxy=new Star('张学友',19)
构造函数原型 prototype
构造函数通过原型分配的函数是所有对象所共享的。
JavaScript规定,每一个构造函数都有一个prototype属性,指向另一个对象。注意这个prototype就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有。
我们可以把那些不变的方法,直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法。
function Star(uname,age) {
this.uname=uname;
this.age=age;
}
Star.prototype.sing=function() {
console.log('我会唱歌');
}
var ldh=new Star('刘德华',18);
var zxy=new Star('张学友',19)
ldh.sing();
zxy.sing();
对象原型proto
对象都会有一个属性proto指向构造函数的prototype原型对象,之所以我们对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有proto原型的存在。
方法的查找规则:首先先看ldh 对象身上是否有sing方法,如果有就执行这个对象上的sing,如果么有sing 这个方法,因为有proto的存在,就去构造函数原型对象prototype身上去查找sing这个方法
constructor构造函数
对象原型(proto)和构造函数(prototype)原型对象里面都有一个属性constructor属性,constructor我们称为构造函数,因为它指回构造函教本身。
constructor主要用于记录该对象引用于哪个构造函数,它可以让原型对象重新指向原来的构造函数。
function Star(uname,age) {
this.uname=uname;
this.age=age;
}
Star.prototype={
constructor:Star,
sing:function(){
console.log('我会唱歌');
},
move:function() {
console.log('我会演电影');
}
}
var ldh=new Star('刘德华',18);
var zxy=new Star('张学友',19)
ldh.sing();
zxy.sing();
//如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数
构造函数、实例、原型对象三者之间的关系
原型链
JavaScript的成员查找机制(规则)
①当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有该属性。②如果没有就查找它的原型(也就是proto指向的prototype原型对象)。
③如果还没有就查找原型对象的原型(Object的原型对象)。
④依此类推一直找到Object为止 ( null ) 。
Star.prototype.sex=’女’;
Object.prototype.sex=’男’;
ldh.sex=’男’;
原型对象this指向
扩展内置对象
console.log(Array.prototype);
//创建一个求和的
Array.prototype.sum=function( ) {
var sum=0;
for (var i=0;i<this.length;i++) {
sum+=this[i];
}
return sum;
}
var arr=[1,2,3];
console.log(arr.sum( ));
可以通过原型对象,对原来的内置对象进行扩展自定义的方法。比如给数组增加自定义求偶数和的功能。
注意∶数组和字符串内置对象不能给原型对象覆盖操作Array.prototype ={},只能是Array.prototype.xxx = function(){}的方式。
继承
ES6之前并没有给我们提供extends继承。我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承
call()
调用这个函数,并且修改函数运行时的this指向 fum.call(thisArg,arg1,arg2,…) ● thisArg:当前调用函数this的指向对象 ● arg1,arg2:传递的其他参数
function fn( x,y ) {
console.log('测试打印内容');
}
fn.call( );
var o={
name:'andy';
}
fn.call(o,1,2);
//可以改变这个函数的this指向 此时这个函数的this就指向o这个对象
借用构造函数继承父类型属性
核心原理∶通过call)把父类型的this指向子类型的this,这样就可以实现子类型继承父类型的属性。
// 借用福构造函数继承熟型
// 1.父构造函数
function Father(uname, age) {
this.uname = uname;
this.age = age;
}
// 2.自构造函数
function Son(uname, age,score) {
Father.call(this, uname, age);
}
var son = new Son('刘德华', 18,100);
console.log(son);
借用构造函数继承父类型方法
// 借用福构造函数继承熟型
// 1.父构造函数
function Father(uname, age) {
this.uname = uname;
this.age = age;
}
function Son(uname, age,score) {
//this指向子构造函数的对象实例
Father.call(this, uname, age);
this.score=score;
}
//Son.prototype=Father.prototype;这样直接赋值会有问题,如果修改了子原型对象,父原型对象也会跟着一起变化
Son.prototype=new Father();
//如果利用对象的形式修改了原型对象,别忘了利用constructor指回原来的构造函数
Son.prototype.constructor=Son;
//这个是子构造函数专门的方法
Son.prototype.exam=function(){
console.log('孩子要考试');
}
var son = new Son('刘德华', 18,100);
console.log(son);
ES5中的新增方法
ES5中给我们新增了一些方法,可以很方便的操作数组或者字符串,这些方法主要包括:
| ●数组方法 | 迭代(遍历)方法: forEach()、map()、filter()、some()、every(); ———————————————————————- forEach() var arr=[1,2,3]; var sum=0; array.forEach ( function ( value,index,array ) { console.log(‘每个数组元素’+value); console.log(‘每个数组索引号’+index); console.log(‘数组本身’+array); sum+=value; } ) ———————————————————————- filter() var arr=[12,66,4,88]; var newArr=arr.filter(function(value.index) { return value >=20; }); console.log(newArr); filter也是查找满足条件的元素返回的是一个数组而且是把所有满足条件的元素返回回来 ———————————————————————- some() var arr=[10,30,4]; var flag=arr.some(function(value){ return value<3; return value=3; }) ; console.log(flag); 返回true或false some也是查找满足条件的元素是否存在返回的是一个布尔值如果查找到第一个满足条件的元 ———————————————————————- ●currentValue:数组当前项的值 ●index:数组当前项的索引 ●arr:数组对象本身 |
|---|---|
| ●字符串方法 | |
| ●对象方法 | Object.defineProperty(obj,prop,descriptor) Object.defineProperty()第三个参数descriptor说明:以对象形式{ }书写 ●value:设置属性的值 默认为undefined ●writable:值是否可以重写。true | false 默认为false ●enumerable:目标属性是否可以被枚举。true | false 默认为false ●configurable:目标属性是否可以被删除或是否可以再次修改特性 true | false 默认为false ———————————————————————- 用于获取对象自身所有的属性 var obj={ id=1, pname:’小米’, price:1999, num:2000 }; var arr=Object.keys(obj); arr.forEach(function(value) { console.log(value); }) ———————————————————————- Object.defineProperty(obj,’address’,{ value:’中国山东蓝翔’, writable:false, enumerable:false, }); console.log(obj); console.log(Object.keys(obj)); |
数组方法
1.把数据渲染到页面中(forEach)
2.根据价格显示数据(filter)
3.根据商品名称显示数据
如果查询数组中唯一的元素,用some方法更合适。
过滤空格
trim() 从字符串的两端删除空白字符
移动端特效
| 触摸事件 touch | touchstart 手指触摸到一个DOM元素时触发 touchmove 手指在一个DOM元素上滑动时触发 touchend 手指从一个DOM元素上移开时触发 touches 正在触摸屏幕的所有手指的一个列表 targetTouches 正在触摸当前DOM元素上的手指的一个列表 changedTouches手指状态发生了该表的列表,从无到有,从有到无变化 因为平时我们都是给元素注册触摸事件,所以重点记住targetTocuhes |
|---|---|
//拖动模块移动
var starX = 0;
var starY = 0;
var x = 0;
var y = 0;
var a1 = document.querySelector('.a1');
a1.addEventListener('touchstart', function (e) {
startX = e.targetTouches[0].pageX;
startY = e.targetTouches[0].pageY;
x = this.offsetLeft;
y = this.offsetTop;
});
a1.addEventListener('touchmove', function (e) {
moveX = e.targetTouches[0].pageX - startX;
moveY = e.targetTouches[0].pageY - startY;
this.style.left = x + moveX + 'px';
this.style.top = y + moveY + 'px';
e.preventDefault();
});
click延时解决方案
解决方案
1.禁用缩放。浏览器禁用默认的双击缩放行为并且去掉300ms的点击延迟
2.利用touch事件自己封装这个事件解决300ms延迟。
原理就是︰ 1.当我们手指触摸屏幕,记录当前触摸时间 2.当我们手指离开屏幕,用离开的时间减去触摸的时间 3.如果时间小于150ms,并且没有滑动过屏幕,那么我们就定义为点击
//封装tap,解决click 300ms延时function tap ( obj, callback){
var isMove = false;
var startTime = o; //记录触摸时候的时间变量
obj.addEventListener('touchstart ', function (e) {
startTime = Date.now(); //记录触摸时间
});
obj.addEventListener('touchmove', function (e) {
isMove = true;//看看是否有滑动,有滑动算拖拽,不算点击});
obj.addEventListener('touchend ', function (e) {
if (!isMove && (Date.now() - startTime) < 150) {//如果手指触摸和离开时间小于150ms算点击callback && callback();//执行回调函数
}
isMove = false; //取反重置startTime = 0;
});
//调用
tap(div, function () { l / 执行代码 });
3.click延时解决方案
移动端click事件会有300ms的延时,原因是移动端屏幕双击会缩放(double tap to zoom)页面。 解决方案: 使用插件。fastclick 插件解决300ms延迟。
移动端常用开发插件
解决300ms点击延迟 fastclick.js
Swiper轮播图插件
其他移动端常见插件
superslide : http://www.superslide2.com/
iscroll : https://github.com/cubiq/iscroll
前端常用的框架有Bootstrap、Vue、Angular、React等。既能开发PC端,也能开发移动端
前端常用的移动端插件有swiper、superslide、iscroll等。
框架∶大而全,一整套解决方案
插件:小而专一,某个功能的解决方案
检测网络是否链接
//通过window.navigator.onLine 来检测网络是否可用
window.addEventListener("online", function () {
$(".tips").text("网络已经连接").fadeIn(500).dalay(1000).fadeout();
})
window.addEventListener("offline", function () {
$(".tips").text("网络断开").fadeIn(500).dalay(1000).fadeout();
})
