JavaScript
# JavaScript
## 基础:变量
js声明变量使用var Ctrl+Atl+L 代码格式化
js的标签使用:<script></script>
js中的字符串类型的值都是用双引号或单引号
变量作用:用来操作数据的(可以存储,可以读取)
变量声明方式:var 变量名=值888888 88;
true=真 null=空 alert()=信息框
console.log()=类似调试输出 console.dir() 打印该元素的所有属性
单行注释// 多行注释/*注释内容*/
## 变量名的注意问题
变量的名字要有意义
变量名有一定的规范:一般以字母,$符号,下划线开头,中间或者后面 可以有$符号,字母,数字
变量名一般都是小写字母
变量名如果是多个单词,第一个单词的首字母是小写的,后面的所有单词的首字母都是大写的,这种命名方式称为:驼峰命名法。例子:userName
不能使用关键字(Js自带的词)
不会单词用拼音,拼音也要遵循驼峰命名法
## Js的数据类型有哪些?
类型有:number,string,boolean,null,undefined,object
number(整数型和小数) 整数型 NaN(不是一个数字)
string(文本型) 字符串型 推荐使用单引号
boolean 布尔类型(逻辑型)true(真=1) false(假=0)
null 空类型,其实就是0或“”
undefined 未定义,值只有一个:undefined
object 对象
## 如何获取数据类型?
使用typeof来获取 typeof(变量名) typeof 变量名 这两种都可以
## Js中有哪些进制?
var num=10; 十进制
var num=012; 八进制
var num=0x123; 十六进制
## Number最大和最小值
Number.MAX_VALUE 最大值 Number.MIN_VALUE 最小值
== 两个等号相当于是否等于 不要用小数和小数相加,因为是个BUG
## String的一些问题
如果用引号,需要用转移符,类似正则表达式
msg.length返回字符串长度
如果字符串型和整数型相加,js会自动把整数型转换成字符串型进行相加
## 数据类型的转换
### 转换字符串型
变量名.toString() 将其他类型的变量转换成字符串型(类似到文本)
如果遇到需要把null和undefined转换成字符串类型,String(变量名)
字符串拼接,变量+"",和空文本相加,就是文本,如果需要改变优先级,只需要加个括号,跟易语言的运算方式一样
### 转换整数型
Number(变量名) 把字符串类型转换成整数型,只能转换数字类的文本,可以转换布尔类型,结果是0或1
parseInt(变量名) 无法转换布尔类型,结果是NaN,可以转换包含非纯数字的文本,数字必须在前面,把不是数字的文本删除掉,进行返回,只返回整数文本(类似到数值)可以用来取整数,取文字中的整数 parseint(小数变量)
parseFloat(变量名) 无法转换布尔类型,可以保留小数(到小数)其他跟Int一样
取正负数,+或-,(+变量名),不可以转换非纯数字文本,可以转换布尔类型
在用+的时候,如果前面变量是整数型,后面的是字符串型,文本型会转整数型
如果前面的变量是字符串型,后买的是整数型,整数型会转字符串型
### 转换布尔类型
Boolean(变量名)
转换成false的情况:null undefined NaN ' '空字符串 0 其他情况都是true
## 一元运算符
前置 ++和-- 前加加就是先加,然后才用这个变量;
++变量 自身先进行相加,那么变量的值就变了,然后参与运算
后置 ++和-- 后加加就是先用这个变量,然后在对这个变量做自增。
变量++ 先运算,后自身相加,那么运算结果与++无关系
## 逻辑运算符
&& 与 (两个变量必须同时是真,结果才为真,如果不同就是假)(类似且)
|| 或 (两个变量一个为真,结果就为真) (类似易语言或)
! 非 (就是取反,如果变量是真,取反后就是假)
## 关系运算符
=== 对两个变量的类型先进行判断是否一样,如果一样继续判断变量值
!=== 对两个变量的类型先进行判断,如果一样判断变量值是否不相等
判断跟易语言有差距,因为变量类型不一样,可以自动转换变量类型
*=就是乘 /=除 +=加 -=减 简写的加减乘除 2+=5 结果就是7
## 三元运算符
a > b ? a : b 变量a和变量b进行逻辑判断,真就输出a,假就输出b
其实就是如果的简写,?代表前面是判断,:代码输出A或B
## switch语句
switch(变量){
case 满足条件:
运行代码位置
break;
case 1: //变量=1的时候,就运行和break中间的代码
alert("当前为1")
break;
default: //这是所有不满足的话,运行这一个,类似else
break;
} //其实类似于易语言判断
## 循环语句
while (类似判断循环)
do...while (类似循环判断)
for (类似变量循环) for(变量起始值;判断语句;变量递增值 ){}
for的变量递增,如果+1就++,如果+2,就i=i+2,判断如果是真循环,假跳出
break (类似跳出循环)
continue (类似到循环尾)
## DeBug调试
Watch 点+可以输入监控变量的名字,会显示变量值的变化
## 数组
[] 数组的声明,在[]里面用逗号来分割,例子:[1,2,3,4,5,6] 数组起始索引是0
数组名.length (类似取数组成员数)
数组如果需要修改某个成员时,只要替换成员的值一样,用法跟易语言一样
数组如果需要增加成员时,直接给数组索引输入新成员的索引,然后进行赋值
例子:A数组,A=['a','b','c','d','e'],现在数组有5个成员,A[5]='f',这样子就增加成员了
数组重点在于和易语言的索引起始值不一样,Js索引起始值是0!0!0!
Js数组,增加成员最好用push
数组名.length = 0 ; (类似易语言清空数组)
var 数组名 = [] ; 定义一个空数组
## 函数
function 需要定义的函数名(){ 函数代码 } (类似子程序,模块)
函数名(); 就可以调用
function 函数名(形参,形参1,形参2) { 函数代码 } 带参数的函数 (类似子程序,模块)
函数名(a,b,c);
return 返回值(类似易语言返回)
arguments 的作用与妙用
每个函数都有一个arguments属性,表示函数的实参集合,这里的实参是重点,就是执行函数时实际传入的参数的集合。
arguments不是数组而是一个对象,但它和数组很相似,所以通常称为类数组对象,以后看到类数组其实就表示arguments。
arguments有length属性,可以用arguments[length]显示调用:
1 function func(){
2 for(var i=0;i<arguments.length;i++){
3 console.log(arguments[i]);
4 }
5 }
6
7 func("a",17,[1,2,3],{name:"javascript",type:"language"});
8 /*-----------------------------------------------------------*/
9 /*
10 a
11 17
12 [1, 2, 3]
13 {name: "javascript", type: "language"}
14 */
自调用函数的方式
(function(){
函数代码 })() 把函数扩起来,进行自调用,()是调用
## 代码规范
1.命名规范
变量、函数的命名必须要有意义
变量的名称一般用名词
函数的名称一般用动词
2.变量规范
操作符的前后要有空格
var name = 'zs';
3.注释规范
// 这里是注释 在//和内容中间有空格
4.空格规范
花括号之前也要有空格
## 作用域
作用域:变量或者函数可以起作用的访问 (其实就是,局部变量,全局变量)
在函数内部,不用var 声明的变量,就是全局变量
块级作用域{}内的是 let作用域
## 对象
以{}来声明对象
var a = {
name:'赵云',
age:18,
sex:'男'
}; a.name // 就是调用对象,在代码里面无类型限制
var dog = {
name:'puppy',
type:'中华田园犬', //这个是属性
bark:function(){ //这个是方法
this.name+'汪汪汪';
}
this 在方法中代表的是当前对象 this.属性名
访问方法和属性一样,对象名.属性 对象名.方法 对象名[‘属性’] 对象名[‘方法‘] 两种方法
new
this 出现在以下位置,分别代表什么
函数中 --- this指向windows
在方法中 ---- this指向这个方法所属的对象
构造函数中 --- 就是构造函数创建的对象
事件处理函数中的this -- 谁调用的该事件就指向谁
for in 可以遍历对象的成员 in就是找对象的所有属性
var obj = {
name:"张三",
sex:"男",
age:18
}
for(var i in obj){ // for in 的使用方法
console.log(obj[i])
}
删除对象
delete 对象名.属性名; 可以删除对象里面的任何属性和方法
构造函数
构造函数的名称第一个字母要大写
function Demo(a,b,c){
this.name = a;
this.sex = b;
this.age = c;
}
var name = new Demo("哈哈","女","18") // 创建必须用new创建
## 内置对象
### Math对象 具有数学常熟和函数的属性和方法,都是以静态成员的方式提供
Math.random() //返回一个浮点数,返回0-1之间的一个浮点数,例如(0.513061532)
Math.floor() //向下取整数
Math.ceil() //向上取整数
Math.PI() //圆周率
Math.random() //生成随机数 Math.random() * 5 ------(0,5)随机数
Math.round() //取整,四舍五入
Math.abs() //绝对值 这些可以去MDN去查询详细使用方法和案例
Math.max()/Math.min() //求最大和最小值 Math.max(1,2,3,5) 返回5
Math.sin()/Math.cos() //正弦/余弦
Math.trunc() //删除数字的小数部分,不区分正负数
Math.power()/Math.sqrt() //求指数次幂/求平方根
### Date对象 是一个构造函数,首先要通过new Date()来创建日期实例
var aa = +new Date() // 直接返回时间戳
Date.now() // 直接返回时间戳
toString() //转换成字符串
valueOf() //获取毫秒值
//下面格式化日期的方法,在不同浏览器可能表现不一致,一般不用
toDateString() // 国际日期
toTimeString() // 国际时间
toLocaleDateString() // 中国日期
toLocaleTimeString() // 中国时间
获取日期指定部分
getTime() //返回毫秒数和valueOF()结果一样 // 时间戳
getMilliseconds() // 返回 毫秒
getSeconds() //返回0-59 秒
getMinutes() //返回0-59 分钟
getHours() //返回0-23 小时
getDay() //返回星期几 0=周日 1=周一
getDate() //返回当前月的第几天
getMonth() //返回月份 从0开始,需要+1
getFullYear() //返回4位的年份
instanceof instance 实例 of的
变量名 instanceof Date 判断变量是否满足对象的要求,不满足返回假
var aa = {}
log(aa instanceof Object) // 判断aa这个变量是不是对象
log(aa instanceof Array) // 判断aa这个变量是不是数组
## 数组对象
### 栈操作(最先进去的最后走,最后进去的先出去,类似死胡同)
数组名.push(增加的数组成员,放到数组最后面)
数组名.pop() 取出数组中最后一个元素,数组成员进行修改
Array.isArray(数组名) 判断是否是数组
### 队列操作(最先进去的,最先走,类似排队)
shift() 取出数组中的第一个元素,修改数组成员数量
unshift() 在数组最前面插入项,返回数组长度
### 排序方法
reverse() 数组反转 ,需要一个数组来接收反转的数组
sort() 冒泡排序数组成员
var aar = [1,5,15,66,7,35]
aar.sort(function(a,b){ // 升序
return a - b
})
aar.sort(function (a,b){ // 降序
return b - a
})
### 操作方法
concat() //把参数拼接到当前数组拼接,多个数组进行合并
slice() //从当前数组中截取一个新的数组,不影响原来的数组,参数start从0开始,end从1开始
splice() //删除数组成员或替换当前数组的某些项目,参数start, deleteCount, options(要替换的项目)
### 位置方法
indexOf()、lastIndexOf() //如果没找到返回-1
### 迭代方法 不会修改原数组
every()、filter()、forEach()、map()、some()
### 方法将数组的所有元素连接到一个字符串中
join()
## 字符串对象的常用方法
### 字符方法
charAt() //获取指定位置处字符
charCodeAt() //获取指定位置处字符的ASCII码, 相当于获取键代码
str[0] //HTML5,IE8+支持 和charAt()等效
### 字符串操作方法
concat(str1,str2,str3) //拼接字符串,等效于+,+更常用
slice() //从start位置开始,截取到end位置,end取不到
substring() //从start位置开始,截取到end位置,end取不到
substr() //从start位置开始,截取length个字符
### 位置方法
indexOf() //返回指定内容在元字符串中的位置
lastIndexOf() //从后往前找,只找第一个匹配的
### 去除空白
trim() //只能去除字符串前后的空白
### 大小写转换方法
to(Locale)UpperCase() //转换大写
to(Locale)LowerCase() //转换小写
### 其它
search() //搜索
replace() //类似替换文本,两个参数,前面欲被替换的文本,后面需要替换的文本
split() //类似分割文本
fromCharCode() 接受一个指定的 Unicode 值,然后返回一个字符串
// String.fromCharCode(101, 102, 103); //把ASCII码转换成字符串
# DOM
document 文档对象
变量名 = document.getElementById() 根据ID获取元素 只能docunment调用
document.getElementsByTagName(标签名 ‘div’) 获取网页中所有标签的动态集合 伪数组
document.getElementsByClassName(Class名) 获取网页中所有的Class集合
document.getElementsByName(Name名字) 获取网页中所有Name名字的标签
document.querySelector(class名,ID名字,标签名) 根据选择器查找元素 只获取第一个,返回第一个选择器
document.querySelectorAll(class名) 根据选择器查找元素,返回所有Class
## 属性操作
### 非表单元素的属性
href、title、id、src、classname
在DOM里面Class的名字叫:ClassName
```
<body>
<button src = "http://www.baodu.com">我是按钮</button>
<div>我是文字</div>
<script>
var dv = document.querySelector("div")
var bt = document.querySelector("button")
dv.onclick = function (){
dv.innerText = "我改变了"
}
bt.onclick = function (){
bt.innerHTML = "<div>我变成了DIV</div>"
bt.src = "http://www.qq.com" // 需要支持src的控件,这个只是演示
}
console.log(dv.innerText) // 只获取文字
console.log(dv.innerHTML) // 保留格式
</script>
</body>
```
innerHTML 显示内容以HTML为主,获取的内容也会包含标签,替换后显示HTML的格式
innerText 显示的内容以文本为主,获取的内容只包含文本,替换数据也只显示文本
textContent 跟text一样,只是因为兼容问题,所以低版本的不支持text,支持content,火狐
变量名.onclick() 当点击按钮后发生什么事件,on是事件的意思,后面是功能
```
<body>
<div>按钮</div>
<script>
var dv = document.querySelector("div")
var dv1 = document.querySelector(".className")
var dv1 = document.querySelector("#id")
dv.onclick = function(){
console.log("被点击了~")
dv.disabled = true;
dv.style.backgroundColor = "red"
dv.className = "更换class"
}
</script>
</body>
```
## 表单元素属性
disabled 禁用属性
checked 复选框选中属性 这三个CSS 在JS里面是布尔类型 真为选择,假为不选
selected 下拉菜单选中属性
如果大量拼接字符串,最好用数组来拼接,join() 数组拼接
变量名.onfocus 获取焦点的事件,变量名.onfocus = function(){}
变量名.onblur 失去焦点的事件
变量名.onmouseover 鼠标进入事件
变量名.onmouseout 鼠标离开事件
变量名.onmousedown 鼠标按下
变量名.onmouseup 鼠标松开
变量名.onmouseenter 跟over用法一样,只是不触发事件冒泡
变量名.onmouseleave 跟out用法一样,只是不触发事件冒泡
阻止超链接跳转 return false 就可以了,返回假就不会跳转
## 自定义属性
获取自定义属性的值
变量名.getAttribute('data-自定义属性的名字') 获取标签自定义属性的值
变量名.setAttribute('data-自定义属性的名字','自定义属性的值') 设置自定义属性和值
变量名.removeAttribute(‘data-自定义属性名字’) 删除自定义属性包含值
element.dataset.“自定义属性名” 或者 element.dataset["listName自定义属性"] 获取值
如果自定义属性里面有多个 - 获取名称则以驼峰命名法来获取
## 节点的属性
文档:document
元素:页面中所有的标签,元素----element,(Div)标签---(Class)元素----(ID)对象
```
<div id="dv"> //这里的换行就算1个节点
<span>div中第一个span标签</span> //span算第二个节点,后边换行算第三个节点
<p>div中第二个元素,第一个p标签</p> //p标签算第四个,后边换行第五个节点
<ul> //ul算第六个节点,后面换行算第七个节点
<li>1</li>
<li>2</li>
<li>3</li>
</ul> //所以,子节点包含,标签,属性,文本(换行也属于文本)
</div>
```
节点:页面中所有的内容(标签,属性,文本),Node(节点的翻译)
根元素:html标签
```
<div id="dv">
<span>div中第一个span标签</span>
<p>div中第二个元素,第一个p标签</p>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
</div>
<script>
var ul = document.querySelector("ul")
ul.childNodes[6].innerText // 包含所有节点
ul.children[3].innerText // 获取li元素节点
ul.lastChild
</script>
```
nodeType 节点的类型 1代表标签,2代表属性,3代表文本
nodeName 节点的名字 标签节点---大写的标签名字,属性节点---小写的属性名字,文本节点---#text
nodeValue 节点的值 标签节点---null,属性节点---属性值,文本节点---文本内容
变量名.parentNode 获取变量元素的父级节点 parent 父
变量名.childNodes[i] 获取变量的所有子节点 child 子 后边无括号
变量名.parentElement 获取变量的父级元素
变量名.children 获取变量的子元素
//------------------------------以上所有浏览器都支持,下面IE8不支持-------------------------//
变量名.firstChild 获取第一个子节点
变量名.lastChild 获取最后一个子节点
变量名.firstElementChild 获取第一个子元素
变量名.lastElementChild 获取最后一个子元素
变量名.previousSibling 获取变量前一个兄弟节点
变量名.previousElementSibling 获取变量前一个兄弟元素
变量名.nextSibling 获取变量后一个兄弟节点
变量名.nextElementSibling 获取变量后一个兄弟元素
## 动态创建元素
```
<div id="dv">
<ul>
<li>1</li>
</ul>
</div>
<script>
var ul = document.querySelector("ul") // 获取元素
var li = document.createElement("li") // 创建元素
li.innerText = "你好啊" // 这样子可以设置标签属性
li.style.color = "red"
ul.appendChild(li) // 追加元素
ul.insertBefore(li,ul.children[0])) // 插入到那个元素前面
ul.removeChild(ul.children[0])
var li2 = ul.children[0].cloneNode(true) // true深度复制
ul.appendChild(li2) // false只复制元素,不复制内容
</script>
```
document.write() 会覆盖之前整个页面的代码
element.innerHTML 在原代码的下面,填入代码,如果用第二次会覆盖第一次,可以H+=H
document.createElement() 直接创建标签,需要手动放到标签内部
变量名.appendChild() 追加元素 变量名.appendChild(a) 这样子a就放到了变量名里面
变量名.removeChild(要删的元素名) 删除元素
变量名.insertBefore(位置) 把元素插入到页面的指定位置
变量名.replaceChild() 把当前元素的标签进行替换
element.innerHTML=‘内容’ 在创建简单动态元素的时候用这个
document.createElement() 在 创建复杂动态元素的时候用这个,比如创建事件
变量名.cloneNode() 克隆一个节点
## 元素绑定多个事件
addEventListener(事件名字没有on,事件处理函数,布尔类型(只写false))
变量名.addEventListener('click',function(){ },false) 这是使用方法 ,谷歌和火狐支持
变量名.attachEvent('on事件名字',事件处理函数) 这个方法跟上面一样,只是IE8支持
## 元素解绑事件
用什么方式绑定事件,就应该用对应的方式解绑事件
对象.on事件名字=事件处理函数---->绑定事件
对象.on事件名字=null;
```
<button >我是按钮</button>
<script>
var bt = document.querySelector("button")
bt.addEventListener('click',al) // 绑定事件
document.addEventListener('DOMContentLoaded',al)//页面加载事件
function al(){
alert("你好啊")
bt.removeEventListener('click',al) // 删除事件
}
</script>
```
对象.addEventListener('没有on的事件类型',命名函数,false);----绑定事件
对象.removeEventListener('没有on的事件类型',命名函数,false);
对象.attachEvent('on事件名字',命名函数);-----绑定事件 这是IE9以前使用的
对象.detachEvent('on事件名字',命名函数);
对象.addEventListener(,,false)
这个flase是冒泡模式,true是捕获模式,1是冒泡,2是目标,3是捕获,冒泡:从里到外,捕获:从外到里,eventPhase这个属性是看当前是什么阶段,一般都是冒泡
## 阻止事件冒泡 // 一直不明白事件冒泡有什么用~~
window.event.cancelBubble=true; //阻止事件冒泡 IE,谷歌支持
e.stopPropagation(); //阻止事件冒泡,火狐和谷歌支持
为同一个元素绑定多个不同事件,指向同一个事件处理函数
在形参里面可以有很多事件,可以直接打印形参查看
e.target.style.backgroundColor // e.target 相当于 this,只是用于事件中,获取谁触发的
function 函数名(形参){形参.type} 去判断形参返回来的内容是什么,就可以用判断去调用不同类型运行方式
e.pageX e.clientX 这些是获取鼠标的位置
onkeyup // 某个键盘按键被松开时触发
onkeydown // 某个键盘被按下时触发 , 无法区分大小写
onkeypress // 某个键盘按键被按下式触发,但不识别功能键,例如 ctrl shift 箭头,可以区分大小写
e.keyCode // 获取按下键盘的阿斯码值
# BOM
浏览器中有个顶级对象:window
页面中顶级对象:document
页面加载事件
window.onload = function () {
// 加载网页完毕后触发这里的事件
}
window.onunload = function () {
// 关闭网页是触发
}
window.addEventListener('load',function(){})) // 也可以这样子写
window.addEventListener('resize',function(){}))
window.onload = function () {} onload 代码放到head里面去运行,不会报错,当页面加载完成执行
window.onunload = function () {} onunload // 当用户退出页面时执行
window.resize // 当窗口变化事,触发
prompt() 类似信息框,有两个属性,第一个提示内容,第二个显示内容
confirm() 信息框的一种弹屏提醒
异步任务
1.普通事件:click、resize等
2.资源加载:load、error等
3.定时器:setInterval、setTimeout等
## location对象中的属性和方法
window.location // location对象
window.location.hash //地址栏上#及后面的内容
window.location.host //主机名及端口号
window.location.hostname //主机名
window.location.pathname //文件的路径---相对路径
window.location.port //端口号
window.location.protocol //协议
window.location.search //搜索的内容
## 设置跳转的页面的地址
location.href="域名";属性----跳转
location.assign("域名");方法---跳转
location.reload();重新加载--刷新
location.replace("域名");浏览没有历史记录
## history对象
back() 返回 window.history.back()
forward() 前进
go() 正负数控制返回和前进
## navigator对象
userAgent 通过UA获取浏览器的类型 window.navigator.userAgent
platform 获取浏览器所在系统的类型
## 计时器
第一个定时器
window.setInterval(); 参数一:函数,参数二:时间(毫秒)类似时钟
window.clearInterval() 上面定时器的返回值,填到里面就是停止
第二个定时器,一次性定时器
window.setTimeout(同上面的定时器一样);
## offset系列 元素的大小+padding+border
变量名.offsetLeft 返回左边位置 未脱离文档流时,父级(padding+margin+border)+自己margin
变量名.offsetTop 返回上边位置,整数型 脱离后,只有margin+left,跟父级无关系了
变量名.offsetHeight 返回元素高,整数型
变量名.offsetWidth 返回元素宽,整数型
## scroll系列 滚动偏移 滚动条往下拉后,内容总体长度 元素的大小+padding
var box = document.getElementById('box');
console.log(box.scrollLeft) 元素边框的左边框大小
console.log(box.scrollTop) 元素边框的上边框大小
console.log(box.scrollWidth) 包括边距的元素大小
console.log(box.scrollHeight)
## client系列 客户区大小 可视区,无边框,边框内部的宽度 内容的大小+padding
var box = document.getElementById('box');
console.log(box.clientLeft); 向左滚动条后距离0的位置
console.log(box.clientTop); 向下滚动条后距离0的位置
console.log(box.clientWidth); 可视区域
console.log(box.clientHeight); 可视区域