- 网页加载过程
- 性能优化
- 安全
页面加载过程
题目
- 从输入url到渲染出url的整个过程
- window.onload与DOMContentLoaded的区别
css放在head中,为什么
先生成cssom与dom形成render树一步到位渲染,若不是头部可能重复渲染。
js放在最后,为什么
js可能修改dom先生成页面,然后再根据js再修改页面,如果等js加载执行完,可能要阻塞很久
img不会阻塞渲染
性能优化
让加载更快
让渲染更快
CDN
SSR服务器渲染
先预览preview
防抖debounce
// const input1=document.getElementById('input1')
// let timer = null
// input1.addEventListener('keyup',function(){
// if(timer){
// clearTimeout(timer)
// }
// timer=setTimeout(()=>{
// //模拟触发事件
// console.log(input1.value)
// //清空定时器
// timer=null
// },1000)
// })
//防抖
function debounce(fn,delay=500){
//timer是闭包中的
let timer =null
return function(){
if(timer){
clearTimeout(timer)
}
timer = setTimeout(()=>{
fn()
timer=null
},delay)
}
}
input1.addEventListener('keyup',debounce(function(){
console.log(input1.value)
},600))
注释的是原理,下面的是封装使用
节流throttle
<style>
#div1{
border: 1px solid #000000;
width: 100px;
height: 100px;
}
</style>
<body>
<div id='div1' draggable="true">可托</div>
</body>
<script>
const div1=document.getElementById('div1')
let timer = null
div1.addEventListener('drag',function(e){
if(timer){
return
}
timer = setTimeout(()=>{
console.log(e.offsetX,e.offsetY)
timer = null
},500)
})
</script>
//封装
function throttle(fn,delay=100){
let timer=null
return function(){
if(timer){
return
}
timer=setTimeout(()=>{
//关于this和arguments,如果不做对象绑定,arguments就会传到throttle函数中,而我们希望的是它传到fn中。
fn.apply(this,arguments)
timer = null
},delay)
}
}
const div1=document.getElementById('div1')
div1.addEventListener('drag',throttle(function(e){
console.log(e.offsetX,e.offsetY)
}))
#安全
问题:
- 常见的web前端攻击方式有哪些
csrf Cross-site request forgery 跨站请求伪造