事件委托
参考答案 :
简易版 (有缺陷 没有考虑子元素 ): bug 在于,如果用户点击的是 li 里面的 span,就没法触发 fn,这显然不对
ul.addEventListener(‘click’,function(e){
if(e.target.tagName.toLowerCase() === ‘li’){
fn() // 执行某个函数
//console.log(‘您点击了li’)
}
})
。
高级版 :思路是点击 span 后,递归遍历 span 的祖先元素看其中有没有 ul 里面的 li。
function delegate(element, eventType, selector, fn) {
element.addEventListener(eventType, e => {
let el = e.target
while (!el.matches(selector)) {
if (element === el) {
el = null
break
}
el = el.parentNode
}
el && fn.call(el, e, el)
})
return element
}
用mouse事件 写一个可以拖拽的div
参考答案 : 该题考察的比较全面 http://js.jirengu.com/mowevogufa/8/edit
//HTML 部分
// CSS部分 div{ border: 1px solid red; position: absolute; top: 0; left: 0; width: 100px; height: 100px; } *{margin:0; padding: 0;} //JS部分 //用户按下鼠标标记 判断是否在拖拽 默认没有 var dragging = false //上一次的坐标 默认为空 var position = nullxxx.addEventListener(‘mousedown’,function(e){
// 用户按下鼠标 开始拖拽
dragging = true
// 用户按下鼠标的时候 获取xy
position = [e.clientX, e.clientY]
})
// 监听鼠标的移动 mousemove 只能监听在document上面
document.addEventListener(‘mousemove’, function(e){
if(dragging === false){return}
console.log(‘hi’)
// 获取鼠标坐标
const x = e.clientX
const y = e.clientY
console.log(x,y)
// 位移 距离 用户鼠标移动的 距离 这一次 减去上一次的
const deltaX = x - position[0]
const deltaY = y - position[1]
// 先换算单位
const left = parseInt(xxx.style.left || 0)
const top = parseInt(xxx.style.top || 0)
// 位移写到div上面
xxx.style.left = left + deltaX + ‘px’
xxx.style.top = top + deltaY + ‘px’
// 这一次的坐标 继承 下一次的开始
position = [x, y]
})
document.addEventListener(‘mouseup’, function(e){
dragging = false
})
HTTP 状态码知道哪些?分别什么意思?
参考答案 :
— 2xx 表示成功
— 3xx 表示需要进一步操作
— 4xx 表示浏览器(客户端)方面出错
— 5xx 表示服务器方面出错
— 完整参考 http://www.runoob.com/http/http-status-codes.html
HTTP 缓存有哪几种?
参考答案:* 需要详细的了解 ETag、CacheControl、Expires 的异同
– 参考 https://imweb.io/topic/5795dcb6fb312541492eda8c
答题要点
1.ETag 是通过对比浏览器和服务器资源的特征值(如MD5)来决定是否要发送文件内容,如果一样就只发送 304(not modified)
2.Expires 是设置过期时间(绝对时间),但是如果用户的本地时间错乱了,可能会有问题
3.CacheControl: max-age=3600 是设置过期时长(相对时间),跟本地时间无关。
GET 和 POST 的区别 (常考)
参考答案:(误解颇多 错解,但是能过面试)
1.GET在浏览器回退时是无害的,而POST会再次提交请求。
2.GET产生的URL地址可以被加入收藏栏,而POST不可以。
3.GET请求会被浏览器主动cache,而POST不会,除非手动设置。
4.GET请求只能进行url编码,而POST支持多种编码方式。
5.GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
6.GET请求在URL中传送的参数是有长度限制的,而POST么有。
7.对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
8.GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
9.GET参数通过URL传递,POST放在Request body中
正解:就一个区别:语义——GET 用于获取资源,POST 用于提交资源
详细请参考 : https://zhuanlan.zhihu.com/p/22536382
上面五题请看这个不错的参考:https://zhuanlan.zhihu.com/p/44438844
必考:你遇到最难的问题是怎样的?
要点:一波三折。参考 https://www.zhihu.com/question/35323603
你在团队的突出贡献是什么?
把小事说大。
最近在关注什么新技术
书、博客、推特、知乎,不要说 CSDN、百度。
有没有看什么源码,看了后有什么记忆深刻的地方,有什么收获
看过源码说源码,推荐看 underscore.js 的源码
没看过源码就说同事的代码,代码烂就说哪里烂,代码好就说哪里好
收获:命名规范、设计模式
刁钻题目
代码
1、 [1,2,3].map(parseInt)
答案
1
NaN
NaN
代码
2、 var a = {name: ‘a’}
a.x = a = {}
问 a.x 是多少?
答案
undefined
3、(a 1 && a 2 && a3) 可能为 true 吗?
利用 == 会调用 valueOf() 的特性
var a = {
value: 1,
valueOf(){
return this.value++
}
}
a 1 && a 2 && a3 // true
利用 a 会读取 window.a 的特性
var value = 1;
Object.defineProperty(window, ‘a’, {
get(){
return value++;
}
})
a 1 && a 2 && a3 // true
// 或者
a =1 && a= 2 && a=3 // true