JavaScript
是一门编程语言,Javascript的标准是ECMAScript负责页面的行为和动作(与用户的交互)
JavaScript(js)与Java没有关系
组成
- 基础语法(常量 变量 运算符…)
- DOM: Document Object Model,文档3332对象模型,用于处理网页内容有关的方法
- BOM:Browsers Object Model,浏览器对象模型,用于处理与浏览器交互有关的方法
- 事件
书写JS
- 内联JS 写到当前html文件的script标签里,我们目前建议写到body里所有内容的最后面
- 外联JS 单独创建一个script文件,进而引入
注意:外联JS也是通过script标签引入的,需要借助src属性
但是一旦script标签添加了src属性,就不能在其里面书写js代码了
现在大多都是框架开发
内联
<script type="text/javascript">
alert(123);
</script>
外联
<script src="js/基础.js" type="text/javascript" charset="utf-8"></script>
运算符
算术运算符
加 +
减 -
乘 *
除 /
余 %
自增 ++
自减 –
++ – 单目运算符,每次增量为1 运算符在前,先执行自增或自减操作 运算符在后,先执行这行代码其他的操作
赋值运算符
=
+=
-=
*=
/=
%=
JS里的=的作用是赋值,将=右边的赋值给=左边,所以我们在阅读代码时,如果有=,请从右往左阅读
关系运算符
大于 >
小于 <
不小于 >=
不大于 <=
等于 ==
恒等于 ===
不等于 !=
恒不等于 !==
==和!=在进行运算时,不考虑数据类型是否一致,只判断值是否相等
===和!==在进行运算时,先判断数据类型是否一致,如果不一致,结果直接为false(true), 一致再判断值是否相等
逻辑运算符
与 &&
运算符两端的值都为真,整个式子的结果才为真,有一个值为假,整个式子就为假
或 ||
运算符两端的值只要有一个为真,整个式子的结果就为真,两个值都为假,整个 式子得值才为假.
非 !
真假颠倒
var a = 10;
var b = 20;
var c = 30;
console.log(true && 10);//第一个操作数为true,结果为第二个操作数10
console.log(false && 10);//第一个操作数为 false,结果是false
console.log(10 && false);//第一个操作数是非0数,结果是false
console.log(undefined && false);//第一个操作数是underfined,结果是underfined
console.log(null && false);//第一个操作数是null,结果是null
console.log(NaN && false);//第一个操作数是NaN,结果是NaN
console.log("" && false);//第一个操作数是"",结果是""
console.log(0 && false);//第一个操作数是0,结果是0
console.log(5 && 100);//第一个操作数是非0数,结果是100
console.log(a && b); //第一个a是非0数,结果是b得值
console.log(true || 10);//第一个操作数为true,结果为true
console.log(false || 10);//第一个操作数为 false,结果为第二个操作数10
console.log(10 || false);//第一个操作数是非0数,结果是10
console.log(undefined || 5);//第一个操作数是underfined,结果是5
console.log(null || false);//第一个操作数是null,结果是false
console.log(NaN || false);//第一个操作数是NaN,结果是false
console.log("" || 100);//第一个操作数是"",结果是100
console.log(0 || false);//第一个操作数是0,结果是false
console.log(5 || 100);//第一个操作数是非0数,结果是5
console.log(a || b);//第一个a是非0数,结果是a得值
运算结构
顺序结构
代码从上到下,逐行执行,每行代码只执行一遍,执行完毕之后在执行下一行.
分支结构
根据不同的结构,执行不同的代码
if
执行原理:如果条件表达式成立,就执行大括号里的代码;表达式不成立,不执行大括号里的代码,继续执行if语句后面的代码.
if (条件表达式){
代码...
}
if(条件表达式){
代码...
}else{
代码...
}
if(条件表达式1){
代码1.....
}else if(条件表达式2){
代码2.....
}...{
}else{
代码3
}
三目运算符
条件表达式? 表达式1: 表达式2
执行原理:如果条件表达式为真,整个世子结果就是表达式1值,如果为假,整个式子的结果就是表达式2的值
switch
运行原理:系统会将switch小括号里的表达式进行计算,将计算的结果与case后的值做匹配,该匹配为精确匹配,如果匹配上就执行对应大括号里的代码,switch语句结束.如果所有case均匹配不上,执行default大括号里的代码,switch语句结束
switch(表达式){
case 值1:{
代码...
break;
}
case 值2:{
代码...
break;
}
case 值3:{
代码...
break;
}
...
default:{
代码...
break;
}
}
注意:
- 最后的default可以不要
- case后的值不能相同
break关键词
结束本次case语句执行且结束整个switch语句
如果一个case语句里没有break,会向下贯穿,直遇到新的break,如果所有的case都没有break,则会执行所有的case语句
if语句和switch语句的区别:
- switch语句只支持常量值相等的分支判断,而if语句支持更为灵活,任意布尔表达式均可;
- switch语句通常比一系列嵌套if语句效率更高;逻辑更加清晰
switch语句和if语句的各自使用场景
- switch建议判断固定值的时候用
- if建议判断区间或范围的时候用
- 用switch能做的,用if都能做,单反过来则不行
if语句:
- 表达式的结果是boolean类型 常用于区间判断
switch:
- 表达式类型不能是boolean类型 常用于等值判断
循环结构
重复执行某一段代码
for
此处使用最基础的,对于for…in for…of 不进行扩展
for(1;2;3){
4循环体...
}
1:循环变量初始值(只走一遍)
2:循环条件
3:循环增量
4:循环体
正常走法1-2-4-3-2-4-3-2-4-3....
while
1
while (2.condition){
4
3
}
//控制输出5遍hello world
var a = 0;
while (a < 5){
console.log("hello world");
a++;
}
do…while
1;
do{
4;
3;
}while(2)
var j=0;
do{
console.log("hello world");
j++;
}while (j<0)
区别
for和while循环区别
一、循环的结构不同
for循环的表达式为:for(单次表达式;条件表达式;末尾循环体){中间循环体;}。
while循环的表达式为:while(表达式){循环体}。
二、执行条件的判断方式不同
for循环执行末尾循环体后将再次进行条件判断,若条件还成立,则继续重复上述循环,当条件不成立时则跳出当下for循环。
while循环当满足条件时进入循环,进入循环后,当条件不满足时,执行完循环体内全部语句后再跳出(而不是立即跳出循环)。
三、使用的目的不同
for循环的目的是为了限制循环体的执行次数,使结果更精确。
while循环的目的是为了反复执行语句或代码块。
四、语法不同
for循环的语法为:for (变量 = 开始值;变量 <= 结束值;变量 = 变量 + 步进值) {需执行 的代码 }。
while循环的语法为:while (<条件>) {需执行的代码 }。
do…while与while的区别
do…while会先执行循环体再去判断条件是否成立,
while循环先判断循环条件是否成立再决定是否执行循环体
所以,如果循环条件一开始为假,do…while也会执行一遍,而while循环一次都不执行;如果循环条件一开始成立,那么do…while与while的执行次数和结果没有区别
BOM
browser Object Mode1 浏览器对象模型
BOM是由一系列的对象组成的,每个对象都有自己的属性,它们各自负责一类功能
- window对象 是BOM里的核心对象,也是顶层对象,其余所有的对象都是从window里延伸出来的,可以理解为window的子对象
- window可以理解成浏览器窗口,而html文档由浏览器运行,所以document是window的子对象
window 方法
open
open(URL, name, features)
打开一个新的浏览器窗口URL:打开新窗口的地址
name:新窗口的名字,不要有一样的名字,如果有,系统只会打开一个窗口,我们可以结合a标签实现跨窗口跳转
features:新窗口的特性,如大小,位置 返回值:打开新窗口的window对象
var newWin = window.open("","",`width=500,height=400,left=100,top=100`);
var div1 = document.createElement("div");
div1.style.width = "200px";
div1.style.height = "200px";
div1.style.backgroundColor = "red";
newWin.document.body.appendChild(div1);
close
newWin.close();
newWin是打开的一个页面变量
moveTo/moveBy
moveTo(x,y) 移动到x,y的位置,值不能为负值
moveBy(x,y) 在当前位置的基础上移动x,y的增量,可正可负
以上方法均不可超出屏幕区域
let nWin = null;
nWin = window.open("","","width=500,height=500")
nWin.moveTo(300,300)
nWin.moveBy(10,10)
resizeTo/resizeBy
resizeTo(w,h) 重置窗口的大小为w,h
resizeBy(w,h) 在当前窗口大小的基础上增加w,h的增量,可正可负
以上方法不能超出屏幕大小
nWin.resizeTo(300,300)
nWin.resizeBy(-10,-10)
window子对象
history
该对象存储的是浏览器的浏览历史(页面的访问顺序,仅存储最近访问的,有限条目的url信息)
H5之前,为了保护个人隐私,history是禁止通过JS访问的
history常用方法
- 1.back() 在历史记录中后退,等效于 浏览器工具栏点击"后退"按钮
- 2.forward() 在历史记录中前进,等效于 浏览器工具栏点击"前进"按钮
- 3.go() 从当前页面的历史记录中加载页面,按照传入的页面索引值(当前页面的索引是0,上一页是-1,下一页是1,以此类推)
注意:通过history进行的页面切换,跳转到的页面是从缓存中读取的,而不是重新加载的新页面
location
该对象用来存储当前文档的位置(url)有关的信息 url:全球资源定位器
var urlStr = "http://www.abc.com:8080/a/b/c/index.html?pape=1&username=tom#hTop";
- protocol:协议名
- host: IP+端口号
- hostname:IP
- port:端口号
- pathname: 资源的具体路径
- search(色吃): 参数列表,? 后面的所有数据都会传递到对应的服务器,这是前端向服务器通信的一种方式
- hash:哈希值(锚部分)# 后面的部分 不会传递到服务器, 可以实现类似锚点的效果
- href: 完整的url地址
方法:
- reload()重新加载网页
- replace() 装载一个新的url地址,但是无须为期添加历史记录
navigator
该对象存储与浏览器相关的基本信息,如浏览器名称,版本,内核,系统等
var info = navigator.userAgent.toLocaleLowerCase()
console.log(info)
if (info.indexOf("firefox") != -1) {
alert("火狐浏览器");
}else if(info.indexOf("opr") != -1){
alert("欧朋浏览器");
}else if(info.indexOf("edg") != -1){
alert("Edga浏览器");
}else if(info.indexOf("Chrome") != -1){
alert("谷歌浏览器");
}else if(info.indexOf("safari") != -1){
alert("Safari浏览器");
}else {
alert("IE浏览器");
}
console.log(info);
screen
存储了客户端的屏幕信息,这些信息可以用来探测客户端的屏幕的配置
- 1.width/height 屏幕的宽度和高度
- 2.availWidth/availHeight 屏幕的可用的宽度和高度
console.log(screen.width,screen.height);
console.log(screen.availWidth,screen.availHeight);
DOM
Document Object ModeL 文档对象模型
用来处理与当前文档内容有关的所有操作
获取html元素
- document.getElementById(“id名”)是通过id值获取元素,得到的是一个html元素
- document.getElementsByTagName(“标签名”) 通过标签名获取元素,得到的是一个数组
- document.getElementsByClassName(“class名”)通过class名获取元素,得到的是一个数组
- document.querySelector(“选择器名”) 通过选择器查找元素,得到的是一个html元素(永远找到的是找到所有元素里的第一个)
- document.querySelectorAll(“选择器名”)通过选择器查找元素,得到的是一个数组(包含所有找到的元素)
操作元素的属性
常用 .语法,懂的都懂
例如:
var eleDiv = document.querySelector("div");
eleDiv.style = "witch:200px;height:200px;background-color:red;"
eleDiv.style.width = "200px";
eleDiv.style.height = "200px";
eleDiv.style.backgroundColor = "pink";
DOM树
创建节点, 插入节点, 删除节点
createElement
appendChild
removeChild
var box = document.createElement("div");
box.style.border = "1px solid red";
document.body.appendChild(box);
var imgE = document.createElement("img");
imgE.src = "../Java 07/img/6.png";
box.appendChild(imgE);
var btn = document.createElement("button");
btn.innerHTML = "删除";
btn.onclick = function(){
document.body.removeChild();
};
box.appendChild(btn);
事件
鼠标事件
-
鼠标左键单击事件 onclick
-
鼠标左键双击事件 ondblclick
-
鼠标移入移出
3.1 onmouseover:移入 onmouseout:移出
3.2 onmouseenter:移入 onmouseleave:移出
onmouseenter 和 onmouseleave的效率要高于 onmouseover 和 onmouseout
onmouseenter 和 onmouseleave不存在事件冒泡 -
鼠标移动事件 onmousemove
-
鼠标按下事件 onmousedown
-
鼠标抬起事件 onmouseup
-
鼠标右键单击事件
-
鼠标滚轮事件 onmousewheel
function randomColor(){
var r = Math.floor(Math.random()*256);
var g = Math.floor(Math.random()*256);
var b = Math.floor(Math.random()*256);
return "rgb(" + r + ',' + g + ',' + b + ')'
}
//1.鼠标左键单击事件 onclick
div1.onclick = function(e){
//获取事件对象的兼容性写法
// var even = e || event;
// console.log(event,e);
// console.log(even.clientX,even.clientY);
this.style.backgroundColor = randomColor();
}
//2.鼠标左键双击事件 ondblclick
div2.ondblclick = function(){
this.style.backgroundColor = randomColor();
}
//3.鼠标移入移出
/*
* 3.1 onmouseover:移入 onmouseout:移出
* 3.2 onmouseenter:移入 onmouseleave:移出
*
* onmouseenter 和 onmouseleave的效率要高于 onmouseover 和 onmouseout
*
* onmouseenter 和 onmouseleave不存在事件冒泡
*
*
*/
div3.onmouseover = function(){
this.style.backgroundColor = randomColor();
};
div3.onmouseout = function(){
this.style.backgroundColor = randomColor();
};
div3.onmouseenter = function(){
this.style.backgroundColor = randomColor();
};
div3.onmouseleave = function(){
this.style.backgroundColor = randomColor();
};
//4.鼠标移动事件 onmousemove
div4.onmousemove = function(){
this.style.backgroundColor = randomColor();
};
//5.鼠标按下事件 onmousedown
/*
* 通过事件对象的button属性,区分不同的按键
*/
div5.onmousedown = function(e){
// console.log("鼠标按下!");
var even = e || event;
console.log(even);
switch(even.button){
case 0:{
alert("左键");
break;
}
case 1:{
alert("滚轮!");
break;
}
case 2:{
alert("右键");
break;
}
}
};
//6.鼠标抬起事件 onmouseup
/*
* 与onclick的区别是:onclick的准确触发时机为 左键抬起,而onmouseup
*/
div6.onmouseup = function(){
this.style.backgroundColor = randomColor();
}
//7.鼠标右键单击事件
div7.oncontextmenu = function(){
this.style.backgroundColor = randomColor();
}
//8.鼠标滚轮事件 onmousewheel
div8.onmousewheel = function(){
this.style.backgroundColor = randomColor();
}
//判断鼠标滚轮方向
div8.onmousewheel = function(e) {
var even = e || event;
//console.log(even);
if(even.wheelDelta > 0) {
console.log("上!");
} else {
console.log("下!");
}
}
键盘事件
- 键盘按下事件 onkeydown 87(w) 83(s) 65(a) 68(d)
- 键盘抬起 onkeyup
- onkeypress 事件会在键盘按键被按下并释放一个键时发生。
var posX = 0;
var posY = 0;
window.onkeydown = function(e){
console.log("down");
var even = e || event;
console.log(even);
switch(even.keyCode){
case 87:{
posY -= 5;
break;
}
case 83:{
posY += 5;
break;
}
case 65:{
posX -= 5;
break;
}
case 68:{
posX += 5;
break;
}
}
img.style.left = posX + "px";
img.style.top = posY + "px";
};
//2.键盘抬起 onkeyup
window.onkeyup = function(){
console.log("抬起up");
}
//3. onkeypress
window.onkeypress = function(){
console.log("press");
}
表单事件
- 内容修改事件onchange我们一般会给输入框绑定该事件
该事件会在输入框内容输入完毕时(失去焦点,回车)进行判断,如果本次的内容与上一次的内容之间有变化,就触发该事件 - 获得焦点事件 onfocus
- 失去焦点事件 onblur
- 内容输入事件 oninput
- 数据提交事件 onsubmit 该事件绑定给form表单
事件流模型
JS里事件流模型表示的是一个事件触发的完整步骤,该步骤一共有三步
- 1.事件捕获:事件流模型的第一阶段,当某个节点触发事件后,系统会从根节点开始,一直向下寻找,直至找到真正触发该事件的节点。沿途在直系继承树上绑定了相同时间的节点会按照顺序依次触发。
- 2.事件触发:事件流模型的第二阶段,真正触发事件的节点,触发事件
- 3.事件冒泡:事件流模型的第三阶段,真正触发事件的节点触发之后,会沿着直系继承树一直向上传递该事件,一直传递到根节点,沿途绑定了相同事件的节点会依次触发。
JS里默认的事件传递方式是事件冒泡
通过addEventListener的第三个参数,可以将js默认的事件传播方式修改为捕获
div1.addEventListener("click",function(){alert("div1")},isCapture);
注意:
不管将传播的方式改为哪一种,事件流模型永远每次都要完整的执行
阻止事件
- 阻止事件冒泡的传播
通过当前事件触发之后的事件对象,去调用stopPropagation() - 阻止默认事件的执行
首先需要分析默认事件 是哪个节点的
通过事件对象,去调用preventDefault()
文章为手打内容,如有细节错误请评论告知哦~~~~谢谢