题目一
- DOM是哪种基本的数据结构?:树
- DOM操作常用的API有哪些
- DOM节点的attr和property有何区别
property 和attribute
-
property:只是一个js对象的属性的修改
var obj = {x:100, y:200} console.log(obj.x) //100 var p = document.getElementsByTagName('p')[0] console.log(p.nodeName) // P 这是字符串 //nodeName就是js对象p的一个property,js对象的标准属性
-
Attribute: 是对html标签的属性的修改
//attribute 更改的是文档代码中的属性,如style,class,src等 var pList = document.querySelectorAll('p') var p = pList[0] p.getAttribute('data-name') p.setAttribute('data-name', 'imooc')
-
其实dom操作获取的就是js的对象,是个对象格式
题目二
- 如何检测浏览器类型
- 解析url各部分
navigator &screen&location & history
//screen
console.log(screen.width)
console.log(screen.height)
//history
history.back() //返回
history.forward() //前进
题目三
- 编写一个通用的事件监听函数
- 描述时间冒泡过程
- 对一个无限下拉加载图片的页面,如何给每个图片绑定事件
代理
`
<div id="div1">
<a href="#">a1</a>
<a href="#">a2</a>
<a href="#">a3</a>
<a href="#">a4</a>
</div>
`
var div1 = document.getElementById('div1')
//根据事件冒泡机制
div1.addEventListener('click', function (e) {
var target = e.target
if (target.nodeName === 'A') {
alert(target.innerHITML)
}
})
编写一个通用的事件绑定函数
function bindEvent(elem, type, selector, fn) {
if (fn == null) {
fn = selector
selector = null
}
elem.addEventListener(type, function (e) {
var target
if (selector){
//代理
target = e.target
//matches判断dom节点是否和选择器匹配的
if (target.matches(selector)){
fn.call(traget, e)
}
}else{
//不是代理
fn(e)
}
})
}
var div1 = document.getElementById('div1')
bindEvent(div1, 'click', 'a', function(e){
e.preventDefault()
console.log(this.innerHTML)
})
题目四
- 手动编写一个ajax,不依赖第三方库
- 跨域的几种实现方式
手写一个ajax
var xhr = new XMLHttpRequest()
xhr.open('GET', '/api', false) //false表示是异步请求
xhr.onreadystatechange = function () {
if (xhr.readystate == 4) {
if (xhr.status == 200) {
alert(xhr.responseText)
}
}
}
xhr.send(null)
-
状态码说明readyState
0-未初始化,还没有调动send方法
1-载入,已经调用send方法,正在发送请求
2-载入完成,send方法执行完成,已经接收到全部响应内容
3-交互,正在解析响应内容
4-完成,响应内容解析完成,可以在客户端调用了
-
状态码status说明
2xx-表示成功处理请求。如200
3xx-表示需要重定向,浏览器直接跳转
4xx-客户端请求错误,如404
5xx-服务端错误
什么是跨域
- 浏览器有同源策略,不允许ajax访问其他域接口
- 跨域条件:协议、域名、端口,有一个不同就算跨域
解决跨域的方法
- jsonp
- 服务端设置http header
题目五
- 请描述下cookie,sessionStorage和localSttorage的区别
cookie
- 本身用于客户端和服务端通信
- 但是他有本地存储的功能,于是就被‘借用’
- 使用document.cookie = ... 获取和修改即可
cookie用于存储的缺点
- 存储量太小,只有4KB
- 所有http请求都带着,会影响到获取资源的效率
- API简单,需要封装才能用
localStorage 和 sessionStorage
-
HTML5专门为存储和设计,最大容量5M
-
API加单易用
-
localStorage.setItem(key, value), localStorage.getItem(key)
-
俩区别:
1、localStorage只要不清,会一直存在
2、sessionStorage,是浏览器关了,就会清除
-
ios safari 隐藏模式下,localStorage.getItem 会报错,统一建议使用try-catch包一下
AMD(异步模块定义)
- require.js
- 全局define函数
- 全局require函数
- 依赖js会自动、异步加载
CommonJS
- nodejs模块化规范,现在被大量用在前端
- 前端开发依赖的插件和库,都可以从npm获取
- 构建工具的高度自动化,使得使用npm的成本非常低
- CommonJS不会异步加载js,而是同步一次性加载出来
AMD和commonjs的使用场景
- 需要异步加载js,使用AMD
- 使用npm之后建议使用commonjs
webpack安装好之后配置webpack.config.js
var path = require('path')
var webpack = require('webpack')
module.exports = {
context:path.resolve(__dirname, './src'),
//入口文件
entry: {
app: './app.js'
},
//打包输出文件
output: {
path: path.resoleve(__dirname, './dist'),
filename: 'bundle.js'
},
//文件压缩
plugins: [
new webpack.optimize.UglifyJsPlugin()
]
}
Linux基本命令得掌握好
加载一个资源的过程
- 浏览器根据DNS服务器得到域名的IP地址
- 向这个ip的机器发送http请求
- 服务器收到,处理并返回http请求
- 浏览器得到返回的内容
浏览器渲染页面的过程
- 根据HTML结构生成DOM Tree
- 根据css生成CSSOM
- 将DOM和CSSOM整合生成RenderTree(渲染树)
- 根据RenderTree开始渲染和展示
- 遇到script时候,会执行并阻塞渲染
xss跨站请求攻击
- 在新浪博客写一篇文章,同时偷偷插入一段script
- 攻击代码中,获取cookie(一般会有账户啥的),发送自己的服务器
- 发布博客,有人查看博客内容,会把查看者的cookie发送到攻击者的服务器
- 预防:前端替换文字:例如替换< 为<;> 替换为 > ;
XSRF
- 你已登录一个购物网站,正在浏览器商品
- 该网站的付费接口是'xxx.com/pay?id=100',但是没有任何验证
- 然后你收到一封邮件,隐藏着'<img src=xxx.com/pay?id=100>'
- 你查看邮件的时候,就已经悄悄的付费购买了
- 方法:增加验证流程,如输入指纹、密码、短信验证码等
简历
- 简介明了,重点突出项目经历和解决方案
- 把个人博客放在简历中,并且定期维护更新博客
- 把个人开源项目放在简历中,并维护开源项目
- 不要造假,保持能力和经历上的真实性
- 谈谈缺点:说说最近在学的什么就行
- 遇到不会回答得问题,说出你知道的就行