一个事件绑定多个函数:
点击
树形结构:深度遍历、广度遍历(递归)
[Vue的钩子函数路由导航守卫、keep-alive、生命周期钩子
更新视图但不重新请求页面,是前端路由原理的核心之一,目前在浏览器环境中这一功能的实现主要有2种方式,Hash模式和History模式。
Vuex是一个专为Vue服务,用于管理页面数据状态、提供统一数据操作的生态系统。它集中于MVC模式中的Model层,规定所有的数据操作必须通过 action - mutation - state change 的流程来进行,再结合Vue的数据视图双向绑定特性来实现页面的展示更新。统一的页面状态管理以及操作处理,可以让复杂的组件交互变得简单清晰,同时可在调试模式下进行时光机般的倒退前进操作,查看数据改变过程,使code debug更加方便。
Vuex框架原理与源码分析
像vue ui那样在终端用的指令??还是vue的自定义指令
在开发Vue项目的时候,大部分组件是没必要多次渲染的,所以Vue提供了一个内置组件keep-alive来缓存组件内部状态,避免重新渲染。
缺点:所有的路由组件都被缓存了,严重浪费性能,而且也不符合需求
在keep-alive上有两个属性,只有匹配的组件会被缓存。
{
path: '/',
name: 'home',
meta:{
keepAlive:true
},
component: Home
}
新的问题:组件被缓存,并没有被销毁,所以组件在切换的时候也就不会被重新创建,自然也就不会调用created等生命周期函数,所以此时要使用activated与deactivated来获取当前组件是否处于活动状态。
activated(){
console.log("哎呀看见我了")
console.log("----------activated--------")
},
deactivated(){
console.log("讨厌!!你又走了")
console.log("----------deactivated--------")
}
Vue核心思想
所有es6的新特性都要答到
JavaScript、ES5和ES6的介绍和区别
单页面应用指只有一个主页面的应用,浏览器一开始就要加载所有必须的html,js,ss,单页面的页面跳转仅刷新局部资源,多应用于pc端,
多页面就是指一个页面中有多个页面,页面跳转时是整页刷新
单页面优点:
1.用户体验好,快,内容改变不需要重新加载整个页面;
2.没有页面之间的切换,就不会出现“白屏现象”
单页面缺点:
1.首次加载耗时比较多;
2.不利于SEO
3.不可以用导航实现前进后退效果;
4.页面复杂度高
百度的webuploader,基于jquery封装的
原生ajax上传/axios.post上传+进度条+后端接收文件
掘金:前端本地文件(图片)操作与上传,并显示在页面中
底层实现还是基于input输入框,然后利用onchange
事件,监听文件选择的事件,然后利用formData
对象装载需要上传的文件,最后通过XMLHttpRequest
来进行文件的网络异步传输。
inputDom.files[0]
var fd=new FormData()
fd.append('pic',pic)
xhr.upload.onprogress
这里的处理,在于如何显示出来(读取文件)
let fileReader = new FileReader()
fileReader.onload
fileReader.readAsDataURL(this.files[0])
赋值给img标签的src
解决这个问题,上网搜索了一下,找到了办法,就是需要重新设定input的type属性。每次选择完文件后,将input元素的type设置成text,然后在下一次click的时候将其设置成file,再触发onchange事件,解决这个问题。
key1=value1&key2=value2
如果直接就是一个FormData了,那么直接用ajax发出去就行了,不用做任何处理。
dragover
事件
event.originalEvent.dataTransfer.files[0]
fileReader读url,formData,append
$(".img-container").on("dragover", function (event) {
event.preventDefault();
})
.on("drop", function(event) {
event.preventDefault();
// 数据在event的dataTransfer对象里
let file = event.originalEvent.dataTransfer.files[0];
// 然后就可以使用FileReader进行操作
fileReader.readAsDataURL(file);
// 或者是添加到一个FormData
let formData = new FormData();
formData.append("fileContent", file);
})
contenteditable="true"
paste
event.originalEvent.clipboardData.files[0]
hello, paste your image here
$("#editor").on("paste", function(event) {
let file = event.originalEvent.clipboardData.files[0];
});
1、修改服务端上传的限制配置;Nginx 以及 PHP 的上传文件限制 不宜过大,一般5M 左右为好;
2、大文件分片,一片一片的传到服务端,再由服务端合并。这么做的好处在于一旦上传失败只是损失一个分片而已,不用整个文件重传,而且每个分片的大小可以控制在4MB以内,服务端限制在4M即可。
3、使用七牛JavaScript SDK分片上传
博客园断点续传
文件头信息
hexdump
根据网速来动态调整包的大小
五月分割线
有dns的地方,就有缓存。浏览器、操作系统、Local DNS、根域名服务器,它们都会对DNS结果做一定程度的缓存。
DNS查询过程如下:
当浏览器向CDN节点请求数据时,CDN节点会判断缓存数据是否过期,若缓存数据并没有过期,则直接将缓存数据返回给客户端;否则,CDN节点就会向服务器发出回源请求,从服务器拉取最新数据,更新本地缓存,并将最新数据返回给客户端。 CDN服务商一般会提供基于文件后缀、目录多个维度来指定CDN缓存时间,为用户提供更精细化的缓存管理。
打个比方:
10年前,还没有火车票代售点一说,12306.cn更是无从说起。那时候火车票还只能在火车站的售票大厅购买,而我所在的小县城并不通火车,火车票都要去市里的火车站购买,而从我家到县城再到市里,来回就是4个小时车程,简直就是浪费生命。后来就好了,小县城里出现了火车票代售点,甚至乡镇上也有了代售点,可以直接在代售点购买火车票,方便了不少,全市人民再也不用在一个点苦逼的排队买票了。
简单的理解CDN就是这些代售点(缓存服务器)的承包商,他为买票者提供了便利,帮助他们在最近的地方(最近的CDN节点)用最短的时间(最短的请求时间)买到票(拿到资源),这样去火车站售票大厅排队的人也就少了。也就减轻了售票大厅的压力(起到分流作用,减轻服务器负载压力)。
用户在浏览网站的时候,CDN会选择一个离用户最近的CDN边缘节点来响应用户的请求,这样海南移动用户的请求就不会千里迢迢跑到北京电信机房的服务器(假设源站部署在北京电信机房)上了。
Cache-Control': 'max-age=300'
在服务端设置
里的
标签Cache-Control 与 Expires 可以在服务端配置同时启用,同时启用的时候 Cache-Control 优先级高。
若在HTML头部加载JS文件,由于JS阻塞,会推迟页面的首绘。为了加快页面渲染,一般将JS文件放到HTML底部进行加载,或是对JS文件执行async或defer加载。
拓展5:
请求报文头中,accept代表客户端希望接受的数据类型,这是浏览器自动封装的请求头。如果服务器返回的content-type是accept中的任何一个(比如text/html
),浏览器都能解析,并直接展示在网页上。如果服务器返回的content-type是其他类型,此时浏览器有三种处理状态:
8. 正常显示。例如返回类型为text/javascript
,浏览器能直接处理并展示。
9. 下载。例如返回类型为application/octet-stream(二进制流,不知道下载文件类型),这种浏览器不能直接处理的,会被下载。
10. 报错。当我们返回一个字符串hello world,却使用text/xml,格式时,浏览器不能正确解析,就会报错,并把报错信息呈现在网页中。
浏览器能直接处理很多种格式,并直接呈现在网页中,并不限于accept中规定的字段,具体有哪些,就需要自己亲自动手试试了。
data的值是一个对象, 是引用数据类型,如果不用函数return ,每个组件的data 都是同一个对象,一个数据改变了其他也改变了;
所以为了不让多处的组件共享同一data对象,只能返回函数。这都是因为js本身的特性带来的,跟vue本身设计无关。
Apache和Nginx在应用中如何选择?
看完让你彻底理解 WebSocket 原理
服务器有更新时,前端不需要去轮询(消耗资源),因为浏览器可以主动推送消息。
前端代码:
url:
if (window.WebSocket) {
// wsurl服务器地址
websocket = new WebSocket(wsurl);
//连接建立
websocket.onopen = function (evevt) {
......
}
//收到消息
websocket.onmessage = function (event) {
var msg = JSON.parse(event.data); //解析收到的json消息数据
var umsg = msg.message; //消息文本
var uname = msg.name; //发送人
......(一些操作:比如显示消息在对话框)
}
//发生错误
websocket.onerror = function (event) {
......(一些操作:比如显示错误提示在对话框)
}
//连接关闭
websocket.onclose = function (event) {
......
}
function send() {
var name = $('#name').val();
var message = $('#message').val();
var msg = {
message: message,
name: name
};
try {
websocket.send(JSON.stringify(msg)); // 复杂的数据结构要先进行序列化
} catch (ex) {
console.log(ex);
}
}
}
else {
alert('该浏览器不支持web socket');
}
浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接。(每次请求都经历三次握手和慢启动)
支持持久连接(HTTP/1.1的默认模式使用带流水线的持久连接),在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。
HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞。
缓存处理:在HTTP1.0中主要使用header里的If-Modified-Since,Expires(协商缓存/强缓存)来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match(协商缓存)等更多可供选择的缓存头来控制缓存策略。
支持断点续传 Accept-Ranges : bytes | none
(图片等资源)
HTTP 1.1还提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。
在HTTP 1.1中增加Host请求头字段。
我们可以在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点。
浏览器阻塞(HOL blocking/head of line blocking):
浏览器对于同一个域名,一般PC端浏览器会针对单个域名的server同时建立6~8个连接,手机端的连接数则一般控制在4~6个(这个根据浏览器内核不同可能会有所差异),超过浏览器最大连接数限制,后续请求就会被阻塞。HTTP1.0有这个问题。
需求分析-概要设计-详细设计-程序编码-程序测试-软件交付-客户验收-码农维护
增量模型:设计核心功能+逐步累加
$(document).ready(function(){
dosth//你要做的事情
})
document.onreadystatechange = function() //当页面加载状态改变的时候执行function
{
if(document.readyState == "complete")
{ //当页面加载状态为完全结束时进入
init(); //你要做的操作。
}
}
页面加载优化
精灵图
使用外部的JavaScript和CSS(浏览器就有可能缓存它们,从而在以后加载的时候能够直接使用缓存,而HTML文档的大小减小,从而提高加载速度)
样式表放在头部(页面内容逐步呈现,改善用户体验,防止“白屏”)、脚本放在底部(js的下载和执行会阻塞Dom树的构建)
压缩CSS和JavaScript【移除不必要的字符(如TAB、空格、回车、代码注释等)】
压缩:客户端可以通过HTTP请求中的Accept-Encoding头来表示对压缩的支持Accept-Encoding: gzip
服务器看到请求中有这个头,就会使用客户端列出来的方法中的一种来进行压缩。Web服务器通过响应中的Content-Encoding来通知 Web客户端。
Content-Encoding: gzip
浏览器缓存
cdn(将整个站点的静态资源放到一个专门的域名下,以求减小网络开销)
加载图片优化
GET | POST |
---|---|
回退时是无害的 | 再次提交请求 |
可以被收藏 | 不能被收藏 |
请求参数会被完整保留在浏览器历史记录里 | 不保留参数 |
参数是有长度限制的 | 参数无限 |
更不安全 暴露参数 | 更安全 |
参数通过URL传递 | request body |
参数的数据类型,GET只接受ASCII字符 | 无限制 |
GET请求会被浏览器主动cache | POST不会,除非手动设置 |
请求没有进入后台服务器里
原因: (1)前端提交的字段名称或者字段类型和后台的实体类不一样或者前端提交的参数跟后台需要的参数个数不一致,导致无法封装
(2)前端提交到后台的数据应该是JSON字符串类型,而前端没有将对象转化为字符串类型;
解决方法: 对照字段名称,类型保证一致
笔试题
下拉列表属性
selected(默认选中)
autocomplete
autofocus(规定下拉列表在页面加载时自动获得焦点)
disabled
select对象
selectedIndex
option对象
js事件
//js事件
οnchange="fun(this.options[this.options.selectedIndex].text)"
//获取文本的值
this.options[this.options.selectedIndex].text 是文本的值
//获取value的值
this.options[this.options.selectedIndex].value 是value值
var obj = document.getElementById("mySelect");
obj.add(new Option("4","4"));
var obj = document.getElementById("mySelect");
obj.options.length = 0;
var obj = document.getElementById("mySelect");
var index = obj.selectedIndex;
obj.options.remove(index);
var obj = document.getElementById("mySelect");
obj.parentNode.removeChild(obj); //移除当前对象
var obj = document.getElementById("mySelect");
var index = obj.selectedIndex;
obj.options[index] = new Option("three",3); //更改对应的值
obj.options[index].selected = true; //保持选中状态
直接使用< input type=“image”>即可,此标签放置在标签内就具有提交功能,如果不在< form>标签内,则可以使用< input type=“image” onClick = “formName.submit()”>方式提交。
说明:
INPUT type=image 元素 | input type=image 对象
创建一个图像控件,该控件单击后将导致表单立即被提交。
b)检查提交的数据必须符合实际
['1','2', '3'].map(parseInt)
(3) [1, NaN, NaN]
由于map的回调函数的参数index索引值作了parseInt的基数radix,导致出现超范围的radix赋值和不合法的进制解析,才会返回NaN。
parseInt(string, radix)
参数 | 描述 |
---|---|
string | 必需。要被解析的字符串。 |
radix | 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。 |
都不是Location对象的属性
pixelTop | top |
---|---|
返回以像素为单位的位置坐标的数值 | 返回带单位的位置坐标字符串 |
+
号代表前面的字符必须至少出现一次(1次或n次)*
号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)?
问号代表前面的字符最多只可以出现一次(0次、或1次)$
匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 $。|
| 两项之间的一个选择 |匹配的正则