JavaScript 基础

JavaScript

是一门编程语言,Javascript的标准是ECMAScript负责页面的行为和动作(与用户的交互)
JavaScript(js)与Java没有关系

组成

  1. 基础语法(常量 变量 运算符…)
  2. DOM: Document Object Model,文档3332对象模型,用于处理网页内容有关的方法
  3. BOM:Browsers Object Model,浏览器对象模型,用于处理与浏览器交互有关的方法
  4. 事件

书写JS

  1. 内联JS 写到当前html文件的script标签里,我们目前建议写到body里所有内容的最后面
  2. 外联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(表达式){
     case1:{
         代码...
         break;
     }
     case2:{
         代码...
         break;
     }
     case3:{
         代码...
         break;
     }
     ...
     default:{
         代码...
         break;
     }
}

注意:

  1. 最后的default可以不要
  2. case后的值不能相同

break关键词
结束本次case语句执行且结束整个switch语句
如果一个case语句里没有break,会向下贯穿,直遇到新的break,如果所有的case都没有break,则会执行所有的case语句

if语句和switch语句的区别

  1. switch语句只支持常量值相等的分支判断,而if语句支持更为灵活,任意布尔表达式均可;
  2. switch语句通常比一系列嵌套if语句效率更高;逻辑更加清晰

switch语句和if语句的各自使用场景

  1. switch建议判断固定值的时候用
  2. if建议判断区间或范围的时候用
  3. 用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元素

  1. document.getElementById(“id名”)是通过id值获取元素,得到的是一个html元素
  2. document.getElementsByTagName(“标签名”) 通过标签名获取元素,得到的是一个数组
  3. document.getElementsByClassName(“class名”)通过class名获取元素,得到的是一个数组
  4. document.querySelector(“选择器名”) 通过选择器查找元素,得到的是一个html元素(永远找到的是找到所有元素里的第一个)
  5. 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);

事件

鼠标事件

  1. 鼠标左键单击事件 onclick

  2. 鼠标左键双击事件 ondblclick

  3. 鼠标移入移出
    3.1 onmouseover:移入 onmouseout:移出
    3.2 onmouseenter:移入 onmouseleave:移出
    onmouseenter 和 onmouseleave的效率要高于 onmouseover 和 onmouseout
    onmouseenter 和 onmouseleave不存在事件冒泡

  4. 鼠标移动事件 onmousemove

  5. 鼠标按下事件 onmousedown

  6. 鼠标抬起事件 onmouseup

  7. 鼠标右键单击事件

  8. 鼠标滚轮事件 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("下!");
    }
}

键盘事件

  1. 键盘按下事件 onkeydown 87(w) 83(s) 65(a) 68(d)
  2. 键盘抬起 onkeyup
  3. 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");
}

表单事件

  1. 内容修改事件onchange我们一般会给输入框绑定该事件
    该事件会在输入框内容输入完毕时(失去焦点,回车)进行判断,如果本次的内容与上一次的内容之间有变化,就触发该事件
  2. 获得焦点事件 onfocus
  3. 失去焦点事件 onblur
  4. 内容输入事件 oninput
  5. 数据提交事件 onsubmit 该事件绑定给form表单

事件流模型

JS里事件流模型表示的是一个事件触发的完整步骤,该步骤一共有三步

  • 1.事件捕获:事件流模型的第一阶段,当某个节点触发事件后,系统会从根节点开始,一直向下寻找,直至找到真正触发该事件的节点。沿途在直系继承树上绑定了相同时间的节点会按照顺序依次触发。
  • 2.事件触发:事件流模型的第二阶段,真正触发事件的节点,触发事件
  • 3.事件冒泡:事件流模型的第三阶段,真正触发事件的节点触发之后,会沿着直系继承树一直向上传递该事件,一直传递到根节点,沿途绑定了相同事件的节点会依次触发。

JS里默认的事件传递方式是事件冒泡
通过addEventListener的第三个参数,可以将js默认的事件传播方式修改为捕获

div1.addEventListener("click",function(){alert("div1")},isCapture);

注意:
不管将传播的方式改为哪一种,事件流模型永远每次都要完整的执行

阻止事件

  1. 阻止事件冒泡的传播
    通过当前事件触发之后的事件对象,去调用stopPropagation()
  2. 阻止默认事件的执行
    首先需要分析默认事件 是哪个节点的
    通过事件对象,去调用preventDefault()

文章为手打内容,如有细节错误请评论告知哦~~~~谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值