(1). window对象
1.window对象
window对象表示浏览器中打开的窗口.如果文档包含框架( 或 标签),浏览器会为HTML文档创建一个window对象,并为每个框架创建一个额外的window对象.
2.window方法
-
JSON 数据格式
json数据是一种轻量级的数据格式,非常方便在互联网上传输,它的格式如下:
一般是对象或者数组,服务器端返回给前端的一般就是这种数据格式,以键值对存储,键名必须是双引号,值如果是字符串也必须是双引号,最后一个键值对不能加逗号(普通对象可以加)
[
{
"username":"zhansan",
"age":18
},
{
"username":"zhansna",
"age":19
},
{
"username":"lisi",
"age":20
}
]
- 对象和JSON之间的转换: 对象=>json: JSON.stringify(), json=>对象: JSON.parse()
var obj = {username: "zhangsan",age: 10};
//对象转json字符串
var obj = JSON.stringify(obj);
console.log(obj);
//json字符串转对象
var str2 = '{"username":"张三","age":"20"}';
str = JSON.parse(str2);
console.log(str2);
- Open() 新打开一个浏览器窗口或查询一个已命名的窗口
<!-- html: 打开这个html文件的时候会自动跳转到百度页面 -->
<body>
<script src="example.js"></script>
</body>
//example.js
window.open('http://www.baidu.com');
- setTimeout(),clearTimeout() 延迟,清除延迟
- setInterval(),clearInterval() 定时器,清除定时器(可用于在规定的时间后执行或调用函数)
//延迟执行
var timeout = setTime(function(){
console.log('you');
},2000);
//清除延迟
clearTime(timeout);
//定时器:写一个60秒的倒计时
var count = 60;
var timer = setInterval(function(){
console.log(count--);
if(count == 0){
//清除定时器
clearInterval(timer);
}
},3000)
- eval() 计算函数(可用于JavaScript字符串的计算)
eval("20+11"); //也可以是变量
- parseInt(),parseFloat() 解析函数,可以返回一个整数或浮点数(小数或整数)
parseInt('10'); //10
parseFloat('10'); //10
parseFloat('23.1'); //23.1
- encodeURI(),decodeURI() 编码和编码
var url = 'http://www.baidu.com?username=张三&age=1 8';
// 将url编码
url = encodeURI(url);
console.log(url); //http://www.baidu.com?username=%E5%BC%A0%E4%B8%89&age=1%208
// 解码
url = decodeURI(url);
console.log(url); //http://www.baidu.com?username=张三&age=1 8
3.浏览器缓存
浏览器的本地缓存: cookie, sessionStorage, localStorage
三者区别:
相同点: 都是放在客户端(浏览器端),都是浏览器缓存
不同点:
cookie数据始终在同源的http请求中携带,在浏览器和服务器来回传递,而sessionStorage和localStorage仅在本地(浏览器)保存;
大小限制区别,cookie数据不超过4kb,sessionStorage和localStorage最大为5M,她们俩是html5的特性;
数据有效期不同,cookie在设置的(服务器设置)有效期内有效;,sessionStorage仅在当前浏览器窗口关闭前有效,关闭即销毁(临时存储),localStorage始终有效,用于持久化本地存储,除非主动删除数据,否则不会过期.
<body>
<p>sessionStorage</p>
<button onclick="save()">存数据</button>
<button onclick="get()">取数据</button>
<button onclick="clearData()">清除数据</button>
<button onclick="clearAllDate()">清除全部数据</button>
<h3>
<p>存取对象</p>
<button onclick="save3()">存数据</button>
<button onclick="get3()">取数据</button>
</h3>
<p>localStorage</p>
<button onclick="save2()">存数据</button>
<button onclick="get2()">取数据</button>
<button onclick="clearData2()">清除数据</button>
<button onclick="clearAllDate2()">清除全部数据</button>
<script>
// sessionStorage存数据
function save(){
sessionStorage.setItem('username','张三');
sessionStorage.setItem('username2','李四');
//查看浏览器缓存:控制台输入sessionstorage,查看控制台的应用
}
// sessionStorage取数据
function get(){
var username = sessionStorage.getItem('username');
var username2 = sessionStorage.getItem('username2');
console.log(username);
console.log(username2);
}
// 清除
function clearData(){
sessionStorage.removeItem('username');
}
// 全部清除
function clearAllDate(){
sessionStorage.clear();
}
// localStorage存数据
function save2(){
localStorage.setItem('username3','wangwu');
localStorage.setItem('username4','zhaoliu');
}
// localStorage取数据
function get2(){
var username3 = localStorage.getItem('username3');
var username4 = localStorage.getItem('username4');
console.log(username3);
console.log(username4);
}
// 清除
function clearData2(){
localStorage.removeItem('username3');
}
// 全部清除
function clearAllDate2(){
localStorage.clear();
}
//存取对象
function save3(){
var obj = {
name:'张三',
age:18
}
//存对象时,先把对象转成json字符串
obj = JSON.stringify(obj);
localStorage.setItem('obj',obj);
}
function get3(){
//取json时,先把json转成对象
var str = localStorage.getItem('obj');
var obj = JSON.parse(str);
console.log(obj);
}
</script>
</body>
总结:
存数据setItem(‘名称’,值);
取数据getItem(‘名称’);
移除数据removeItem(‘名称’);
全部清除clear();
注意: 数据存入缓存都变成了字符串,需要存对象的时候,需要先将对象转成json字符串,取出时再把json字符串转成对象.
(2). BOM
1.BOM
浏览器对象模型(Browser Object Model)简称BOM,浏览器对象模型BOM使JavaScript有能力与浏览器’对话’.
2. BOM对象
- location 包含当前网页文档的URI信息
// 获取浏览器地址
var url = location.href;
console.log(url);
// 跳转到百度
// location.href = 'http://www.baidu.com';
// 跳转到百度带参数
location.href = 'http://www.baidu.com?a=2&b=3&c=4';
// 获取参数字符串(?后面的一串数字)
var search = location.search;
console.log(search);
// hash #号后面的字符串
console.log(location.hash);//
// host 域名
console.log(location.host);//www.baidu.com
// 把参数字符串转为对象
function getParam(name){
var search = location.search;
console.log(obj);
// 去掉?号
var search = search.slice(1);
console.log(search);
// 以&作为分割符, 把字符串变成数组
var arr = search.split('&');
console.log(arr);
// 声明对象, 用来存放参数
var obj = {};
arr.forEach(function(item){
// 以等于号进行分割
var paramArr = item.split('=');
console.log(paramArr);
obj[paramArr[0]] = paramArr[1];
});
console.log(obj);
return obj[name];
}
getParam('a');
-
history 包含浏览器窗口访问过的URI信息
history.back() 后退
history.forward() 前进
history.go() go(1)前进一个记录,go(-1)后退一个记录
<body>
<button onclick="goBack">后退</button>
<button onclick="forward">前进</button>
<button onclick="goAndBack">前进或后退</button>
<script>
function goBack(){
window.history.back();
}
function forward(){
window.history.forward();
}
function goAndBack(){
window.history.go(1);
window.history.go(-1);
}
</script>
</body>
- navigator 包含客户端有关浏览器信息,主要用于navigator.userAgent,用来判断用户使用的浏览器类型
<body>
<button onclick="goto()">判断用户使用的设备</button>
<script>
function goto(){
var userAgent = navigator.userAgent;
//判断用户使用的设备,需要手机所有的移动设备
if(userAgent.match(/Android|iPhone|iPad/)){
location.href = 'https://m.maoyan.com/#movie';
}else{
location.href = 'https://m.maoyan.com/#movie';
}
}
</script>
</body>
(3). Ajax
1. ajax
AJAX = Asynchronous JavaScript and XML(异步的JavaScript和XML).
ajax最大的优点就是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容.
2.ajax创建过程
- 创建异步ajax请求对象
- 设置请求方法和请求参数
- 发送请求
- 注册(绑定)事件
- 获取返回数据
3.get请求和post区别
-
用途
get一般用于获取数据:数据先存在服务器,通过get请求去获取
post一般用于发送数据: 比如用户注册,用户填好表单后,通过post把数据传给服务器,服务器再将数据存入数据库.
-
传递参数
get请求如果需要传递参数,那么会默认将参数拼接在url后面,然后发送给服务器;get请求传递参数大小是有限的的,是浏览器的地址栏有大小限制;
post传递参数,需要把参数放进请求体中,发送给服务器;post请求参数放进了请求体中,对大小没有要求.
-
安全性问题
get安全性相对比较低,post安全性比较高.
-
浏览器缓存
get一般会走缓存,为了防止走缓存,给url后面每次拼接的参数都不同,放在?后面,一般用个时间戳.
post请求不会走缓存.
-
get请求
//创建对象
var xhr = new XMLHttpRequest();
//设置请求参数(请求方式get/post,请求地址):此处写请求数据接口的地址?拼接参数&..&..
xhr.open('GET','http://localhost:3000/user/list?currPage=1&type='01'');
//发送请求
xhr.send();
//注册事件,获取返回数据
xhr.onreadystatechange = function(){
//请求的状态
console.log(xhr.readyState);
//状态码
console.log(xhr.status);
//ajax为json字符串,转对象
if(xhr.readyState === 4&&xhr.responseText === 200){
var res = JSON.parse(xhr.responseText);
console.log(res);
res.list.forEach(item=>{
//获取用户详情
console.log(item);
})
}
}
- post请求
//创建对象
var xhr = new XMLHttpResquest();
//设置请求对象:此处写接收数据的接口地址
xhr.open('POST','http://localhost:3000/user/list');
//设置请求头: Content-Type用来设置传递给服务器的数据格式
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
//发送请求:拼接的参数写在这
xhr.send('currPage=1&type='01'');
//绑定事件,获取返回事件
xhr.onreadystatechange = function(){
if(xhr.readyState === 4&&xhr.status === 200){
var res = JSON.parse(xhr.responseText);
cons.log(res);
}
}
4.http状态码
-
请求就绪状态(readyState)
0: 请求未初始化,还没有调用open();
1: 请求已经建立,但是还没有发送,还没有调用send();
2: 请求已发送,正在处理中(通常现在可以从响应中获取内容头);
3: 请求在处理中,通常相应中已有部分数据可用了,没有全部完成;
4: 相应已完成,可以获取并使用服务器的响应.
-
http状态码(status)
200: 请求成功,一般用于GET和POST请求.
301: 永久移动,请求的资源已被永久的移动到新的URI,返回信息会包括新的URI,浏览器会自动定向到新URI,今后任何新的请求都应使用新的URI代替.
302: 临时移动,与301类似,但资源只是临时被移动,客户端应继续使用原有URI,301和302都叫地址重定向,一个是永久重定向,一个是临时重定向.
304: 未修改,所请求的资源未修改,服务器返回此状态码时,不会返回任何资源,客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源.
403: 服务器理解请求客户端的请求,但是拒绝执行此请求.
404: 服务器无法根据客户端的请求找到资源(网页),通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面.
405: 客户端请求中的方法被禁止.
500: 服务器内部错误,无法完成请求.
5.跨域请求
-
跨域: 浏览器有同源策略,只有当"协议",“域名”,"端口号"都相同时,才能称之为是同源策略,其中有一个不同,即是跨域.
-
同源策略的作用: 同源策略限制了从同一个原加载的文档或脚本如何与来自另一个源的资源进行交互,这是一个用于隔离潜在恶意文件的重要安全机制.
-
跨域的原因: 一是前端和服务器分开部署,接口请求需要跨域,二是可能会加载其他网站的页面作为iframe内嵌.
-
跨越的方法:
jsonp和cors跨域(jsonp只能支持get请求,cors可以支持多种请求,cors是在服务器端设置);
proxy代理跨域: nginx反向代理(运营或后台),webpack设置proxy跨域(前端)
websocket跨域
postMessage
window.name + iframe,location.hash + iframe,document.domain
-
json跨域原理: 尽管浏览器有同源策略,但是
6.同步和异步
ajax默认是异步的,但它也可以设置成同步.
xhr.open('get','http://localhost:3000/user/list?currPage=1&type='01'',false);
//将open的第三个参数设置为false,则为同步,而默认是true(异步)
7.封装ajax请求的库
<script src="https://cdn.bootcdn.net/ajax/libs/axios/0.24.0/axios.min.js"></script>
<script>
axios.get('http://localhost:3000/user/list',{params:{
currPage: 2,
type: '01'
}}).then(function(res){
cosole.log(res);
}).catch(function(error){
console.log(error);
})
</script>
8.this指向
- this永远指向函数运行时所在的对象,而不是函数被创建时所在的对象
- 普通的函数调用: 函数被谁调用,this就是谁
- 匿名函数或不处于任何对象中的函数指向window
- 如果是call,apply,bind,this指向了这三者调用时传入的第一个参数
- 箭头函数的指向: 由于箭头函数和不绑定this,它会捕获其所在上下文(作用域)的this值,作为自己的this值
9.封装函数
- 封装请求函数
- 封装参数字符串转换
var utils = {
/**
* @param {*} url 请求地址
* @param {*} data 请求参数, 若无则传{}
* @param {*} callback 回调函数
*/
//封装ajax的get方法
get(url,data,callback){
var xhr = newXMLHttpresquest();
//调用方法,获取请求参数字符串
var paramStr = this.toParams(data);
xhr.open('get',`${url}?${paramsStr}`);
xhr.send();
xhr.onreadystatechange = function(){
if(xhr.readyState === 4&& xhr.status === 200){
var res = JSON.parse(xhr.responseText);
callback(res);
}
};
},
//封装ajjax的post方法
post(url,data,callback){
data = data || {};
var xhr = new XMLHttpResquest();
var paramStr = this.toParams(data);
xhr.open('post',url);
xhr.setResquestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(paramStr);
xhr.onreadystatechange = function(){
if(xhr.readyState === 4&&xhr.status === 200){
var res = JSON.parse(xhr.responseText);
callback(res);
}
};
},
//把对象变成字符串拼接形式
toParams(data){
var str = "";
for(var key in data){
str += `${key}=${data[key]}&`;
}
return str.slice(0,-1);
},
};