1.BOM:Bowser Object Model,浏览器对象模型。
a.window对象介绍:扮演两个角色
1.代替ES中的global,充当全局对象保存全局变量和全局函数。
2.自己也带有一些属性和方法指代当前窗口本身。
a.网页打开新链接的方式:
HTML:<a href="url">内容</a>
js:open("url","_self")
b.替换当前页面禁止后退:history对象记录着当前窗口记录,只有有了记录才可以后退。
location对象:记录着当前窗口正在打开的url,替换不产生任何记录。
location.replace("新url")
c.新窗口打开,可以打开多个
HTML:<a href="url" traget="_blank">内容</a>
js:open("url","_blank")
d.新窗口打开,只能打开一个
HTML:<a href="url" traget="自定义name">内容</a>
js:open("url","自定义name")
自定义的name:每一个窗口底层都有一个名字,target就i是在设置名字,name相同,新的窗口打开就会把旧窗口替换掉(刷新);
e.扩展a标签的作用:
1.跳转
2.锚点
3.下载:<a href="xx.exe/zip/rar/7z">内容</a>
4.打开:<a href="xx.图片后缀名/txt">内容</a>
5.直接书写:打开:<a href="javascipt:js代码">内容</a>
b.window提供的属性和方法:
属性:获取浏览器的完整大小:outerWidth/outerHeight
获取浏览器文档显示区域大小:innerWidth/innerHeight
获取屏幕大小:screen.width/height
方法:
1.打开窗口 var newW=open("url","自定义name","wdith=,height=,left=,top=,")
注意:第三个配置参数没传入时窗口大小和浏览器一样,并且为一体。写入第三个参数则会脱离浏览器为一个独立的小窗口,并且可以保存为其设置绑定事件。设置的宽高也不宜过小。
2.关闭窗口:window/newwindow.close()
3.修改窗口大小:newwindow.resizeTo(新宽,新高);
4.修改窗口位置:newwindow.moveTo(x,y);
c.定时器:
1.周期性定时器
开启:timer=setInterval(callback,间隔毫秒数);
停止:clearInterval(timer)
2.一次性定时器:
开启:timer=setTimeout(callback,间隔毫秒数);
停止:clearTimeout(timer)
*****函数、循环、定时器都能反复执行操作,区别是什么?时机不同
a.函数:是由用户触发的或者程序员调用。
b.循环:瞬间执行完毕。
c.定时器:等一段时间执行一次。
3.扩展:
a.绑定事件,事件处理函数形参可以写一个e,自动获取到event对象。
b.获取坐标。
相对于屏幕:e.screen x/y
相对于浏览器:e.client x/y
相对于页面:e.page x/y
c.扩展:鼠标跟随动画
1.事件:window/document.onmousemove
2.js加载速度比图片快,加载事件:onload事件
3.删除图片,实际是在动画开始时开启了定时器
d.history对象:保存当前窗口的历史记录打开过的url.
前进:history.go(1)
后退:history.go(-1);
刷新:history.go(0)
e.navigator对象,保存了当前浏览器基本信息,可以用js来判断是什么浏览器已经版本号。
属性:navigator.userAgent
f.location对象:保存当前窗口正在打开的url
1.网址的组成部分:5部分
a.协议名:http/https/ftp/ws(直播)
b.域名,主机号:底层是主机号域名是需要购买的
c.端口号:默认端口可以省略,http默认80,https默认443
d.文件的相对路径:路由据欸的那个用户是想看哪一个网页。
e.查询字符串、请求消息:客户端发送到服务器的东西,服务器接住判断请求才能进行响应,是后端沟通的关键。
协议名://域名:端口号/路由?请求消息
协议名:location.protocal
域名:location.hostname
端口号:location.port
路由:location.pathname
请求消息:location.search
g.event对象:事件对象
事件:用户触发的或者浏览器自动触发的(onload)
a.在html页面上绑定:
<elem on事件名="js语句"></elem>
缺点:不符合内容、样式、行为相分离原则,且无法动态绑定事件,和不能同时绑定多个对象。
b.在js中是使用元素事件处理函数属性:
elem.on事件名=function(){
操作;
}
优点:符合内容、样式、行为相分离原则,动态绑定事件,没有兼容性问题。
c.使用专门的事件API绑定:
主流:elem.addEventListener("事件名",callback)
老IE:elem.attachEvent("事件名",callback)
兼容:if(elem.addEventListener){
elem.addEventListener("事件名",callback)
}else{
elem.attchEvent("事件名",callback)
}
优点:符合内容样式行为相分离原则,动态绑定事件,同时可以绑定多个对象;
缺点:具有兼容性问题;
h.事件周期:
1.捕获阶段,记录着要发生的事件有哪些
2.目标元素优先触发
3.冒泡触发,向上触发所有记录着的事件
i.获取事件对象event:
主流:会自动作为事件处理函数的第一个形参传入
elem.on事件名=function(e){e->event}
老IE:event
兼容:var e=event
获取到的event事件可以做什么?
1.获取鼠标位置
2.阻止冒泡
主流:e.stopPropagation()
老IE:e.cancelBubble=true
兼容:e.cancelBubble=true
3.事件委托、利用冒泡
优化:如果多个子元素定义了相同或者相似的事件,最好只给父元素定义一次。
为什么?每一次绑定一个事件函数都是为了创建一个事件对象,创建的事件对象越多网站性能越差。
主流:e.target
老IE:e.srcElement
兼容:e.srcElement
4.阻止浏览器默认行为:
a标签默认跳转页面,右键自带弹出框F12打开一个控制台,F5刷新。
主流:e.preventDefault()
老IE:e.returnValue=false
兼容:e.returnValue=false
新事件:window.oncontentmenu=()=>{鼠标右键事件}
window.onkeydown=()=>{键盘按下事件}
5.获取键盘键码
e.keyCode
2.Node.js知识点
1.js和node的区别?
相同:都可以使用ECMAScript的一切API语法
不同:
a.javascript DOM+BOM做一切特效
b.Node.js提供的模块
2.每个js文件都可以称之为模块
a.模块化开发:以电商为例按功能划分很多模块:商家模块、商品模块、,需要分模块合作:将每个模块交给对应的人做,最后由主模块引入。
1.每个模块都可以公开、暴露字的成员:
a. exports.属性名=值;
b. module.exprots={....}
2.每个模块都有一个操作,可以用于其他模块引入;
var xxx.require("./文件名");.js后缀名可以省略
exports和module.exports的区别,exports的底层就是module.exports。
3.模块分类
a.官方模块 b.第三方模块 c.自定义模块
4.官方模块
a.Globals:全局模块
__dirname 当前文件夹的绝对路径
__filename 当前文件的完整绝对路径
exports 一个空对象{},公开和暴露自己成员
require 一个函数,引入其他模块
module 指代当前模块本身,包含其他四个变量
b.Querystring模块:查询字符串
需要引入:let qs=requery(querystring");
可以解析url的查询字符串部分功能;
var obj=qs.parse("查询字符串部分")
obj.键名---获取前端传来的某一部分
c.url模块
需要引入:let url=require("ur");
用于完整解析url
var obj=url.parse("完整的url网址","true")
查询字符串:objUrl.query.键名;--拿到前端传到后端的东西
路由:objUrl.pathnanme;--判断路由的不同,响应不同的网页给用户。
d.Buffer模块:缓冲区,可以将数组变成一个16进制数字。
e.fs模块:FileSystem文件系统
需要引入:let fs=requery("fs");
异步读取文件:
fs.readFile("绝对路径|文件相对路径",(err,buf)=>{
拿到buffer之后的操作;
})
异步写入文件:
fs.writeFile("绝对路径|文件相对路径","写入新内容",()=>{
拿到buffer之后的操作;
})
异步追加文件:
fs.appendFile("绝对路径|文件相对路径","写入新内容",()=>{
拿到buffer之后的操作;
})
f.http模块:使用代码搭建服务器
固定步骤:
1.引入http\url\fs官方模块
var http=require("http");
var url=require("url");
var fs=require("fs");
2.创建服务器
var app=http.createSever();
3.为服务器设置监听的端口号
app.listen(80);
4.为服务器绑定请求事件
app.on("request",(req,res)=>{
属性req.url,解析此属性拿到自己需要的部分(路由|请求消息)
var objUrl=url.parse(req.url,true);
得到前端传来的路由部分
var router=objUrl.pathname;
判断前端传来的路由是什么,返回不同的页面
if(router=="/"||router=="/index.html"){
属性req.url,解析此属性拿到自己需要的部分(路由|请求消息)
fs.readFile("./public/index.html",(err,buf)=>{
res.end(buf)
})
}else if(router.match(/html/)!=null){
fs.readFile("./public"+router,(err,buf)=>{
res.end(buf);
})
}lese if(router.match(/css|js|jpg|png|gif|webp|woff/)!=null){
fs.readFile("./public"+router,(err,buf)=>{
res.end(buf);
})
}
})
强调:
1、*****前端的一切action、href、src,所有引入路径的地方,全都被node.js当作了是一个路由请求,解析请求,读取对应的文件给用户看
2、自己想要访问自己,打开浏览器,可以使用127.0.0.1访问自己,访问别人(前提:关闭防火墙),需要别人把自己的ipv4地址给你,打开cmd,输入ipconfig
g.模块(每个.js文件)分类:
1、官方模块:var xx=require("官方模块名")
2、第三方模块
3、自定义模块:2大类
为什么有的模块要引入时加上./,有的模块又不需要
1、文件模块:创建xx.js去公开需要公开的内容,主模块想要引入必须写为require("./文件名")
2、目录模块:3种
1、创建名为m1的文件夹,在其中创建index.js的文件,去需要公开的内容,主模块想要引入必须写为require("./文件夹的名字")
2、创建名为m2的文件夹,在其中创建xx.js的文件,去需要公开的内容,主模块想要引入必须写为require("./文件夹的名字")
但是需要在m2文件夹中,在创建一个必须package.json的配置文件
3、创建一个必须名为node_modules的文件夹,在其中创建名为m3的文件夹,在其中创建index/xx.js的文件,去需要公开的内容,主模块想要引入必须写为require("文件夹的名字")
其实真实开发中,我们程序员用的最多的就是文件模块,目录模块的第三种方式根本就不是人用的,是机器npm的使用的
h、npm:node package manager:node的模块/包管理器:专门管理第三方模块的,作用:下载安装、删除、更新、维护包的依赖关系...
如何使用第三方模块:
1、打开网站:npm官网
2、搜索你需要用到的模块,尽量用带有完全符合标志的那个包
3、打开cmd:检查一下npm下载工具是否安装成功:npm -v
4、下载:npm i 包名
5、删除:npm un 包名 - win7系统,删除时只需删除当前包,不会删除依赖关系
6、更新:npm up 包名 - 有可能此项目n年后要维护,有可能包就过期了,需要更新
下周:使用mongoDB
i、介绍一下数据
数据库产品 - 放着很多很多和网站相关的数据
关系型数据库 - 以表格为主
Oracle - Oracle(甲骨文)
主要应用于【企业级】开发市场,企业级:大公司、国企、事业单位(银行、警察局),不差钱的公司,安全性很高
MySQL - Oracle(甲骨文)
主要应用于【互联网】开发市场,安全性相对较低,但是免费的,中小型公司的首选,但是和Node.js搭配不友好
sql server - 微软:大学讲课
非关系型数据库 - 没有固定的格式
是一种运动 - 反关系型数据库
主流产品 - mongoDB,以JSON数据格式为主