BOM
1、BOM:Brower Object Model(浏览器对象模型)--提供专门操作浏览器的一些对象(方法和熟悉),没有标准,大部分浏览器还是统一的,唯独老IE与众不同--使用率较低。
2、重点:定时器,事件对象event
3、DOM:是有标准的,w3c规定的,几乎没有兼容性
window对象
1、代替着ES中的global
充当全局对象-保存全局变量和全局函数
2、自带一些属性和窗口,指代当前窗口
打开网页链接的方式:4种
1、替换当前页面,可以后退
-
1)、HTML:
<a href="url">内容</a> -
2)、JS:
windon.open("url","_self");
2、替换当前页面,禁止后退--场景:电商网站(付款后不允许退回去继续付款)
-
1)、history对象:记录着【当前窗口】的历史记录,只有有了历史才能前进后退
-
2)、location对象:记录着【当前窗口】正在打开的url,而他有一个方法叫做替换,替换是不会产生任何历史记录的,但是url替换后网页必然跳转
-
3)、JS:location.replace("新url");
3、新窗口打开,可以打开多个
- 1)、HTML:
<a href="url">内容</a> - 2)、JS:
window.open("url","_blank")4、新窗口打开,只能打开一个--场景:电商网站(只允许打开一个付款页面) - HTML:
<a href="url" target="自定义name"></a> - 自定义name的意思:每一个窗口底层都有一个名字,target其实就是设置名字,name如果相同,新的打开的窗口就会把旧窗口个替换掉
- JS:open("url","自定义name"); 扩展标签的作用
- 跳转
- 锚点
- 下载
<a href="xx.exe/zip/rar/7z">内容</a> - 打开
<a href="xx.图片后缀/txt">n内容</a> - 直接书写JS:
<a href ="javascript:js代码">内容</a>
window提供的属性和方法
- 属性
- 获取浏览器的完整大小
- window.outerWidth/outerHeight;
- 获取浏览的文档显示区域的大小
- innerWidth/innerHeight;
- 获取屏幕的完整大小
- screen.width/height;
- 获取浏览器的完整大小
- 方法
- 打开窗口
- open("url","自定义的name" ,"width=,height=,left=,top=");
- 关闭窗口
- window/newW.close()
- 修改窗口的大小
- newW.resizeTo(new宽 ,new高)
- 修改窗口的位置:
- newW.moveTo(x,y);
- 打开窗口
获取鼠标的位置
- 绑定事件:事件处理函数形参可以写一个e,自动获取到事件对象event
- 获取坐标:3种
- e.screenX/Y --获取相对于屏幕的位置
- e.clientX/Y ---获取相对于客户端/浏览器端的位置
- e.pageX/Y ---获取相对于页面的坐标
鼠标的跟随动画
- 事件window/document.onmousemove
- js的加载速度比图片的加载速度快,加载事件: onload事件
- 删除图片,实在动画开始时开启了定时器
定时器(重点)
1、周期性定时器
- 开启: timer=setlnterval(callback,间隔毫秒数);
- 停止: clearlnterval(timer) 2、一次性定时器
- 开启: timer=setTimeout(callback,间隔毫秒数);
- 停止::clearTimeout(timer)
注意:一次性和周星期底层都是一样的,甚至可以呼唤,所以你到底以后用哪个无所谓
BOM的其他对象
history对象
1、保存【当前窗口】的历史记录打开过的url
- 前进:history.go(1)
- 后退:history.go(-1)
- 刷新:history.go(0)
navigator对象
1、保存了当前浏览器的基本信息,可以使用JS来判断我们是什么浏览器以及版本号-类似css hack (浏览器兼容性问题的,专门针对老IE)
2、属性:navigator.user Agent;---能够得到一个字符串,包含着是什么浏览器以及版本号,想办法拿到需要的部分
3、HTML5(语义化标签、增强型表单、音频视频)和css3(过渡、动画、转换、媒体查询、阴影、弹性盒子)和ES5以上的任何东西,老IE都不支持的,所以要做兼容
location对象
1、一个url地址的组成部分
- 协议名:http /https/ftp/ws
- 域名/主机号:底层大家都是主机号,域名是需要花钱购买的
- 端口号:默认端口可以省略不写,https的默认端口号是443,http默认端口号是80
- 文件的相对路径/路由:百度加密了隐藏起来了--决定着用户看到的是哪个网页
- 查询字符串/请求消息,服务器端需要接住然后判断我们请求的是什么,才能进行响应---和后端沟通交流的关键
- 协议名://域名:端口号/路由?请求消息
- 通过location得到这个url的每一个部分,但是不要记忆,直接console.log输出location就能直接看到
- 协议名: location.protocal
- 域名: location.hostname
- 端口号: location.port
- 路由: location.pathname
- 请求消息:location.search 2、作用:跳转
- location="新url"
- 跳转都禁止后退 location.replace("新url");
- 刷新:location.reload();
event对象(重点)
1、事件:用户触发的或者浏览器自动触发的(onload)
- 绑定事件:3种
- 在HTML页面上绑定事件
- <elem 事件名="js语句">
- 缺点
- 不符合内容(html)与样式(css)与行为(js)的分离的原则
- 无法动态绑定事件(一次只能绑定一个元素)
- 无法同时绑定多个函数对象
- 在JS中使用元素的事件处理函数属性:
- elem.on事件名=function(){操作}
- 优点
- 符合内容(html)与样式(css)与行为(js)的分离的原则
- 动态绑定事件
- 没有兼容性问题
- 缺点
- 无法同时绑定多个函数对象
- 使用专门的事件API绑定事件
-
elem.addEventListener("事件名",callback);
-
老IE:elem.attachEvent("on事件名",function(){});
-
兼容
if(elem.addEventListener){ elem.addEventListener("事件名",callback); }else{ elem.attachEvent("on事件名",function(){}); } -
优点
- 符合内容(html)与样式(css)与行为(js)的分离
- 动态绑定事件
- 可以同时绑定多个函数对象
-
缺点:
- 具有兼容性问题
-
- 事件周期性
- 主流:3个阶段
- 1、捕获阶段,记录着要发生的事件有哪些
- 2、目标元素优先触发,目标元素->实际触发事件的元素
- 3、冒泡触发,向上触发所有的记录着的事件
- 老IE:2个阶段,没有捕获阶段
- 主流:3个阶段
- 获取事件对象Event(重点)
- 主流:会自动作为事件处理函数的第一个传入
- elem.on事件名 = function(e){e->event)
- 老IE:event
- 兼容:var e = event //不光老IE可用,主流也可以用
- 获取到event事件对象,可以做什么(重点)
- 获取鼠标的坐标/位置
- 阻止冒泡--笔试面试中:开发几乎不用
- 主流:e.stopPropagation()
- 老IE:e.cancelBubble=true;
- 兼容:e.cancelBubble=true
- 事件委托/利用冒泡--笔试开发中都会用到
- 优化:如果多个子元素定义了相同或相似的事件,最好只给父元素定义一次
- 为什么:每次绑定一个事件函数,其实都是创建了一个事件对象,创建的事件对象越多,网站的性能越差
- 淘汰this,当前元素
- 认识一个新目标元素:target(点击的是哪一个,永远就是哪一个)
- 主流:e.target;
- 老IE:e.srcElement;
- 兼容:e.srcElement;
- 阻止浏览器的默认行为: a标签默认跳转页面,右键自带一个弹出框,F12打开一个控制台,F5会刷新
- 主流: e.preventDefault();
- 老lE: e.returnValue=false;
- 获取键盘的键码:
- e.keyCode; === 不需要去记忆键码,要么百度查看,要么直接输出查看
- 主流:会自动作为事件处理函数的第一个传入
- 在HTML页面上绑定事件
Node.js相关知识
Node.js概述
1、不是JS,但语法和Javascript非常相似,竞争对象:Java/c/c++/php 2、做的功能绝不是特效,做的事服务器端的操作(形成了一个前端和数据库沟通交流的桥梁-数据交互) 3、目的
- 1、使用代码搭建一个服务器&文件系统(放在代老师电脑上的HTML,你们也可以访问到,而且根据你访问的网址不同,看到的网页也是不同的)
- 2、Node.js如何和数据库进行交流沟通(在这之前肯定还要学习mongoDB)
Node.js 安装
1、首先去Node.js的官网找到要下载的文件,然后开始安装,一路往下点,哪里点不动了,就把哪里勾上,千万不要取消任何东西
2、检查是否安装成功:打开cmd,输入node -v 检查版本号,如果有版本号说明已经在你的电脑里安装成功了node.js
注意:实际上,安装的node.js就是一个运行环境而已,不再需要浏览器自带的js解释器了,node.js的语法和javascript的语法非常相似
Node.js的运行方式
1、交互模式-临时测试
- 打开cmd输入,node回车,就可以开始书写的"js"代码了
- 退出:ctrl+c 2、脚本/文件模式-正式开发中
- 1、创建xx.js:里面书写自己的代码
- 2、打开cmd输入:node 文件绝对路径 3、可以在编辑器安装一些插件就可以运行了
- 1、HBuilder:安装一个插件:nodeeclipse,右键运行
- 2、VScode:安装一个插件:搜索一个run,代码处右键,第一个选项就是run
js和Node.js的异同
- 相同点:都可以使用一切的ECMAScript的一切的API和语法都可以放心大胆的使用,服务器端根本不存在任何浏览器,所以一切语法放心用
- 不同点:
- 1、javascript:DOM+BOM - 做一切特效
- 2、Node.js:虽然不支持DOM+BOM,但是他却提供了10万个以上+的模块等待我们学习
搭建服务器(重点)
固定步骤
//引入http、url、fs官方模块
var http=require("http");
var url=require("url");
var fs=require("fs");
//创建服务器
var app=http.createServer();
//为服务器设置监听的端口号
app.listen(80);//http默认端口为80,https默认端口为443
//为服务器绑定请求事件 - 请求?前端发到后端的,
app.on("request",(req,res)=>{
//req - request:保存请求对象,请求对象,前端->后端,提供了一个属性req.url,解析此属性拿到自己需要的部分(路由|请求消息)
var objUrl=url.parse(req.url,true);
//得到前端传来路由部分
var router=objUrl.pathname;
//判断前端的路由是什么,给他返回不同的页面
if(router=="/" || router=="/index.html"){
//res - response:保存响应对象,后端->前端,提供了一个方法res.end(你想要响应的东西)
fs.readFile("./public/index.html",(err,buf)=>{
res.end(buf);
})
}else if(router.match(/html/)!=null){
console.log(router);
fs.readFile("./public"+router,(err,buf)=>{
res.end(buf);
})
}else if(router.match(/css|js|jpg|png|gif|woff/)!=null){
fs.readFile("./public"+router,(err,buf)=>{
res.end(buf);
})
}
})
模块的分类
官方模块
注:不需要下载,在安装node.js环境的时候就已经安好了,但是某的模块需要引入,某的模块不用引入,就需要学习看文档
1、Globals模块
- 全局模块–全局变量在所有模块中均可使用。不需要引入
- _ _dirname 当前文件夹的绝对路径 *
- _ _filename 当前文件的完整的绝对路径
- exports 一个空对象,空开和暴露自己的成员
- module 指代当前模块本身,包含了其他4个变量*
- require() 一个函数,引入其他模块的*
- 定时器
- 控制台
2、Querysting模块
- 查询字符串
- 需要引入:var qs=require('querystring');
- 提供了解析url的查询字符串部分的功能
- var obj=qs.parse("查询字符串部分");
- 想要获取前端传来的某一个部分:obj.键名
3、Url模块
- 需要引入: var url = require("url");
- 提供了一些实用函数,用于完整的URL处理与解析
- var objUrl=ur.parse(完整的url网址",true);/此方法会将url网址的各个部分全部解析出来,支持传入第二个参数,是一个布尔值,如果传入的是一个true,自动调用querystring的parse方法,顺便也解析了查询字符串(请求消息∶前端->后端的东西)部分
- 真正的重点
- 查询字符串:objUrl.query.键名–拿到前端传到后端的东西
- 路由: objUrl.pathname; -判断路由的不同,响应不同的网页给用户看
- 真正的重点
4、Buffer模块
- 缓冲区,可以将数组变成一个16进制的数组
- 不需要引入,直接使用
- 但是,绝对不会主动使用Buffer的任何操作,但后后面的一些API可能会导致得到的结果直接就是Buffer
- Node.js大部分的API其实是支持Buffer操作的
- 理解为:Buffer是Node.js提供的一种新的数据类型
5、fs模块 (重点)
- FileSystem 文件系统
- 需要引入 let fs=require("fs");
- 提供了可以操作文件的API
-
异步读取文件
fs.readFile("文件路径",(err,buf)=>{ 拿到buf后,需要做的操作 }) -
异步写入文件
fs.wirteFile("绝对路径|文件路径",()=>{ 拿到buf后,需要做的操作 }) -
异步追加文件
fs.readFile("绝对路径|文件路径",()=>{ 拿到buf后,需要做的操作 }
-
6、http模块
第三方模块
注意:多到数不清楚,提供了很多官方模块没有的东西,有一个网址npm可以去下载:mongo、express框架(简化)
- 如何使用第三方模块:
- 1、打开网站:npm官网
- 2、搜索你需要用到的模块,尽量用带有完全符合标志的那个包
- 3、打开cmd:检查一下npm下载工具是否安装成功:npm -v
- 4、下载:npm i 包名
- 5、删除:npm un 包名 - win7系统,删除时只需删除当前包,不会删除依赖关系
- 6、更新:npm up 包名 - 有可能此项目n年后要维护,有可能包就过期了,需要更新
自定义模块
- 为什么有的模块要引入时加上./,有的模块又不需要
- 1、文件模块:创建xx.js去公开需要公开的内容,主模块想要引入必须写为require("./文件名")
- 目录模块:3种
- 1、创建名为m1的文件夹,在其中创建index.js的文件,去需要公开的内容,主模块想要引入必须写为require("./文件夹的名字")
- 2、创建名为m2的文件夹,在其中创建xx.js的文件,去需要公开的内容,主模块想要引入必须写为require("./文件夹的名字")
- 但是需要在m2文件夹中,在创建一个必须package.json的配置文件
- 3、创建一个必须名为node_modules的文件夹,在其中创建名为m3的文件夹,在其中创建index/xx.js的文件,去需要公开的内容,主模块想要引入必须写为require("文件夹的名字")
Node.js最大的特点
- 快,非常快–以前最快的是php,Node.js的速度是php的14倍,