原本好久之前就该把前端面试系列的文章更新完,可是本身懒,加上发现网上有些文章确实写的不错,就一直拖着没写。可是有次去图书馆,看到一本书叫《前端面试江湖》,索性找了一个时间,把所有内容整合到一块儿。这里面确定有你不了解的东西,那些东西可以很大程度上提升你的开发效率。这本书2016年5月出的,却还在讲JQuery。因此有些地方我对其进行了补充javascript
获取事件:css
function et(e) { let event = window.event || e }
键盘值的获取:
Firfox下event.which和IE的event.keyCode至关html
let key = event.keyCode || event.which
事件源的获取:前端
let target = event.srcElement || event.target
事件监听:java
IE: element.attacthEvent('on' + eventName, function(){}) Firfox: element.addEventListener(eventName, handler, false)
鼠标位置:
在IE下,event对象有x、y属性,在Firfox下,event有PageX, PageY属性
全部获取鼠标位置时:git
x = event.x || event.pageX
阻止默认浏览器行为:github
e.preventDefault() || event.returnValue = false
阻止冒泡事件:面试
e.stopPropagation() || event.cancelBubble = true
<select id="test" name=""> <option value="1">text 1</option> <option value="2">text 2</option> </select>
拿到选中项的索引:数据库
let index = document.getElementById('test').selectIndex.
selectIndex表示选中项的index编程
这个问题一直在争论,我就以为明明一句话解决的问题,非要弄得这么复杂。这是书上的答案:
var xhr = new XMLHttpRequest() xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if ((xhr.status >= 200 && xhr.status < 300 || xhr.status == 304)) { alert(xhr.responseText) } else { alert('unsuccessful:' + xhr.status) } } } xhr.open('get', 'example.txt', true) xhr.send(null)
具体内容看看MDN,这里就懒的写了
1xx: 信息
2xx: 成功
3xx:重定向
4xx:客户端错误
5xx:服务器错误
getResponseHeader从响应信息中返回指定的http信息
getAllResonponseHeaders 获取响应的全部HTTP头信息
var Jsonp = document.createElement('script') // Firfox: onload, IE: onreadyStatechange Jsonp.onload = Jsonp.onreadyStatechange = function () { if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') { alert($('#demo').html()) // 清理防止IE内存泄露 Jsonp.onload = Jsonp.onreadyStatechange = null } } Jsonp.type = 'text/javascript' Jsonp.src = 'http://www.xxx.com/JS/JQuery.js' // 往header里边添加 document.getElementByTagName('head')[0].appendChild(Jsonp)
一、更多的描述性标签
二、良好的媒体支持
三、更强大的Web应用
四、跨文档信息通讯
五、Web Sockets
六、客户端存储
七、更加精美的页面
八、更强大的表单
九、提高可访问性
十、先进的选择器
十一、视觉效果
除了页面在首次加载时必然要经历该过程以外,还有如下行为会触发这个行为:
1、dom元素的添加、修改、删除。(这就是为何避免dom元素的修改,由于reflow和repaint最耗性能)
二、仅修改DOM元素的字体颜色(只有repaint,由于不须要调整布局)
三、应用新的样式或者修改任何影响元素外观的属性
四、resize浏览器窗口,滚动页面
五、读取元素的某些属性
存储:localStorage.setItem(key, value)
获取:localStorage.getItem(key)
删除:localStorage.removeItem(key)
所有删除:localStorage.clear()
cookie数据始终在同源的HTTP请求中携带。而sessionStorage和localStorage不会自动把数据发送给服务器,仅在本地保存。cookie数据还有路径(path)的概念,能够限制cookie只属于某个路径下。
存储大小限制不一样,cookie数据不能超过4KB,同时由于每次HTTP请求都会携带cookie,因此cookie只适合保存很小的数据。sessionStorage和localStorage也有存储限制,可是要大的多
数据有效期不一样: sessionStorage:仅在当前浏览器窗口关闭前有效。localStorage:始终有效,窗口或浏览器关闭也一直保存。cookie:只要在设置的cookie过时时间以前一直有效
做用域不一样:sessionStorage不在不一样的浏览器窗口中共享(咱们能够不能够经过使用sessionStorage实现跨域).localStorage在全部同源串口都是共享的。cookie在全部同源窗口都是共享的。
一、CSS Sprites: 通俗来说就是图片合并,能够把网站中一些比较通用的小图,合并到一张大图上
二、启用keep-alive属性:Keep-Alive能够理解为长链接。启用connection的Keep-Alive属性以外,这个链接能保持一段时间,从而提升页面加载的速度
三、启用浏览器缓存,能够用缓存技术来提升页面的加载速度
四、启用GZIP压缩
一、用Web Storage替换cookie
二、使用css动画代替JavaScript动画
三、使用客户端数据库
四、使用JavaScript的新功能
五、使用硬件加速
@font-face {font-family: name; src: url(url); sRules}
sRules样式表定义
前端安全问题主要有XSS、CSRF攻击
XSS:跨站脚本攻击
它容许用户将恶意代码植入到提供给其余用户使用的页面中,能够简单的理解为一种javascript代码注入。
XSS的防护措施:
过滤转义输入输出
避免使用eval、new Function等执行字符串的方法,除非肯定字符串和用户输入无关
使用cookie的httpOnly属性,加上了这个属性的cookie字段,js是没法进行读写的
使用innerHTML、document.write的时候,若是数据是用户输入的,那么须要对象关键字符进行过滤与转义
CSRF:跨站请求伪造
其实就是网站中的一些提交行为,被黑客利用,在你访问黑客的网站的时候进行操做,会被操做到其余网站上
CSRF防护措施:
检测http referer是不是同域名
避免登陆的session长时间存储在客户端中
关键请求使用验证码或者token机制
其余的一些攻击方法还有HTTP劫持、界面操做劫持
使用prototype的方法并非很好,很容易出错,建议使用ES6的class。但这里不讲,由于有些老项目没用ES6,因此了解prototype还有有必要的
借用构造函数实现继承:
function Parent1(){ this.name = "parent1" } function Child1(){ Parent1.call(this); this.type = "child1"; }
借用原型链实现继承:
function Parent2(){ this.name = "parent2"; this.play = [1,2,3]; } function Child2(){ this.type = "child2"; } Child2.prototype = new Parent2();
组合式继承:
function Parent3(){ this.name = "parent3"; this.play = [1,2,3]; } function Child3(){ Parent3.call(this); this.type = "child3"; } Child3.prototype = Object.create(Parent3.prototype); Child3.prototype.constructor = Child3;
工厂模式:
function cratePerson (name, age, job) { var o = new Object( o.name = name o.age = age o.job = job o.sayName = function () { alert(this.name) } return o } var person1 = cratePerson('Greg', 27, 'Doctor')
构造函数:
function Person (name, age, job) { this.name = name this.age = age this.job = job this.sayName = function () { alert(this.name ) } } var person1 = cratePerson('Greg', 27, 'Doctor')
原型模式:
function Person () { } Person.prototype.name = 'Greg' Person.prototype.age = 18 Person.prototype.job = 'Doctor' Person.prototype.sayName = function () { alert(this.name) } var person1 = new Person() person1.sayName() // Greg
本文只讲了一些理论性的知识,不多涉及编程。编程的部分我决定使用leetcode习题的方式进行讲解
o)由于这个不太好单独写一篇博客来进行讲解。请关注个人github了解实时的进度