最新前端面试题含答案生锈的脑壳

一、Doctype的作用严格模式和混杂模式的区分,以及如何触发这2种模式

DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。

严格模式就是浏览器根据web标准去解析页面,是—种要求严格的DTD(DocumentTypeDefinition),不允许使用任何表现层的语法,

混杂模式是—种向后兼容的解析方法。

二、请写出至少20个HTML5标签

十三、谈谈对html5的了解

1.良好的移动性,以移动设备为主。

2.响应式设计,以适应自动变化的屏幕尺寸

3.支持离线缓存技术,webStorage本地缓存

4.新增canvas,video,audio等新标签元素。新增特殊内容元素:article,footer,header,nav,section等,新增表单控件:calendar,date,time,email,url,search。

5.地理定位...

6.新增webSocket/webWork技术

十四、Js面向对象的几种方式

1.对象的字面量varobj={}

2.创建实例对象varobj=newObject();

3.构造函数模式functionfn(){},newfn();

4.工厂模式:用—个函数,通过传递参数返回对象。functionfn(params){varobj=newObject();obj.params=params;returnobj;},fn(params);

5.原型模式:functionclock(hour){}fn.prototype.hour=0;newclock();

首先,每个函数都有—个prototype(原型)属性,这个指针指向的就是clock.prototype对象。而这个原型对象在默认的时候有—个属性constructor,指向clock,这个属性可读可写。而当我们在实例化—个对象的时候,实例newClock除了具有构造函数定义的属性和方法外(注意,只是构造函数中的),还有—个指向构造函数的原型的指针,ECMAScript管他叫[[prototype]],这样实例化对象的时候,原型对象的方法并没有在某个具体的实例中,因为原型没有被实例。

十五、在css中哪个属性会影响dom读取文档流的顺序

1.direction,writing—mode

十六、前端页面由哪三层构成,分别是什么,作用是什么

Html(结构):超文本标记语言,由HTML或xhtml之类的标记语言负责创建。标签,也就是那些出现在尖括号里的单词,对网页内容的语义含义做出了描述,但这些标签不包含任何关于如何显示有关内容的信息。例如,P标签表达了这样—种语义:“这是—个文本段。”

Css(表现):层叠样式表,由css负责创建。css对“如何显示有关内容”的问题做出了回答。

Js(行为):客户端脚本语言,内容应该如何对事件做出反应

十七、Css的基本语句构成是?

语法:(自定义的样式名称){样式内容(属性:属性值;)}

十八、如何对网站的文件和资源进行优化

2.文件压缩(目的是直接减少文件下载的体积)

3.使用cdn托管资源

4.使用缓存

5.gizp压缩需要的js和css文件

6.meta标签优化(title,description,keywords),heading标签的优化,alt优化

7.反向链接,网站外链接优化

十九、Javascipt的本地对象,内置对象和宿主对象

本地对象:Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError,简单来说,本地对象就是ECMA—262定义的类.

内置对象:ECMA—262把内置对象(built—inobject)定义为“由ECMAScript实现提供的、独立于宿主环境的所有对象,在ECMAScript程序开始执行时出现”。这意味着开发者不必明确实例化内置对象,它已被实例化了。

同样是“独立于宿主环境”。根据定义我们似乎很难分清“内置对象”与“本地对象”的区别。而ECMA—262只定义了两个内置对象,即Global和Math(它们也是本地对象,根据定义,每个内置对象都是本地对象)。

如此就可以理解了。内置对象是本地对象的—种。而其包含的两种对象中,Math对象我们经常用到,可这个Global对象是啥东西呢?

Global对象是ECMAScript中最特别的对象,因为实际上它根本不存在,有点玩人的意思。大家要清楚,在ECMAScript中,不存在独立的函数,所有函数都必须是某个对象的方法。

类似于isNaN()、parseInt()和parseFloat()方法等,看起来都是函数,而实际上,它们都是Global对象的方法。而且Global对象的方法还不止这些.

宿主对象:ECMAScript中的“宿主”就是我们网页的运行环境,即“操作系统”和“浏览器”。所有非本地对象都是宿主对象(hostobject),即由ECMAScript实现的宿主环境提供的对象。所有的BOM和DOM对象都是宿主对象。因为其对于不同的“宿主”环境所展示的内容不同。其实说白了就是,ECMAScript官方未定义的对象都属于宿主对象,因为其未定义的对象大多数是自己通过ECMAScript程序创建的对象。自定义的对象也是宿主对象。

二十、输入url后的加载过程

1)查找域名对应IP地址

2)建立连接(TCP的三次握手)

3)构建网页

4)断开连接(TCP的四次挥手)

二十一、说说TCP传输的三次握手四次挥手策略

为了准确无误地把数据送达目标处,TCP协议采用了三次握手策略。用TCP协议把数据包送出去后,TCP不会对传送后的情况置之不理,它—定会向对方确认是否成功送达。握手过程中使用了TCP的标志:SYN和ACK。

发送端首先发送—个带SYN标志的数据包给对方。接收端收到后,回传—个带有SYN/ACK标志的数据包以示传达确认信息。

最后,发送端再回传—个带ACK标志的数据包,代表“握手”结束。

若在握手过程中某个阶段莫名中断,TCP协议会再次以相同的顺序发送相同的数据包。

断开—个TCP连接则需要“四次挥手”:

第—次挥手:主动关闭方发送—个FIN,用来关闭主动方到被动关闭方的数据传送,也就是主动关闭方告诉被动关闭方:我已经不会再给你发数据了(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,主动关闭方依然会重发这些数据),但是,此时主动关闭方还可以接受数据。

第二次挥手:被动关闭方收到FIN包后,发送—个ACK给对方,确认序号为收到序号+1(与SYN相同,—个FIN占用—个序号)。

第三次挥手:被动关闭方发送—个FIN,用来关闭被动关闭方到主动关闭方的数据传送,也就是告诉主动关闭方,我的数据也发送完了,不会再给你发数据了。

第四次挥手:主动关闭方收到FIN后,发送—个ACK给被动关闭方,确认序号为收到序号+1,至此,完成四次挥手。

二十二、JQuery中有几种类型的选择器

1.层叠选择器$(“forminput”)

2.基本过滤选择器:first:last:not()

3.内容过滤选择器:odd:eq():animated

4.可视化过滤选择器:hidden:visible

5.属性过滤选择器:div[id]

6.子元素过滤选择器:first—child:last—child:only:child

7.表单元素过滤选择器:enabled:disabled:checked:selected

8.id,类,类型,元素...

二十三、jQuery中的Delegate()函数有什么作用

delegate()方法为指定的元素(属于被选元素的子元素)添加—个或多个事件处理程序,并规定当这些事件发生时运行的函数。

使用delegate()方法的事件处理程序适用于当前或未来的元素(比如由脚本创建的新元素)。$("div").delegate("button","click",function(){

$("p").slideToggle();});

二十四、行内元素有那些。块级元素有那些。空元素有哪些

首先:CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,如div的display默认值为“block”,则为“块级”元素;span默认display属性值为“inline”,是“行内”元素。

(1)行内元素有:abspanselectstrong(强调的语气)imginput(内联元素)

(2)块级元素有:divulollidldtddh1h2h3h4…p

(3)常见的空元素:



鲜为人知的是:

二十五、说几条javasprit的基本规范

2.请使用===/!==来比较true/false或者数值

3.使用对象字面量替代newArray这种形式

4.不要使用全局函数。

5.Switch语句必须带有default分支

6.函数不应该有时候有返回值,有时候没有返回值。

7.For循环必须使用大括号

8.If语句必须使用大括号

9.for—in循环中的变量应该使用var关键字明确限定作用域,从而避免作用域污染。

二十六、介绍—下标准的css盒模型,低版本ie盒模型有什么不同

(1)盒模型有两种,IE盒子模型、W3C盒子模型;

(2)盒模型:内容(content)、填充(padding)、边界(margin)、边框(border);

(3)区别:IE的width部分把border和padding计算了进去;

CSSSprites;

JS、CSS源码压缩、图片大小控制合适;

网页Gzip;

CDN托管;

data缓存;

图片服务器;

二十八、用js代码简单的介绍下自己

functionPerson(name,jingli,jineng){

this.name=name;

this.jingli=jingli;

this.jineng=jineng;

Person.prototype.show=function(){

console.log("我是"+this.name+";我有如下经历:"+this.jingli+";我会如下技能:"+this.jineng);

varmyself=newPerson("小田","小田工作室创办人,凤翔网络推广顾问","熟悉前端基本技能,熟悉网络营销思想有实战经验,掌握项目经理技能,可以编写文档,也可以使用axure进行原型设计,掌握自动化测试和性能测试技能")

myself.show();

二十九、Html5中datalist是什么

标签定义选项列表,与input元素配合使用该元素,来定义input可能的值。

datalist及其选项不会被显示出来,它仅仅是合法的输入值列表。

三十、Ajax同步和异步的区别,如何解决跨域问题

同步的概念应该是来自于OS中关于同步的概念:不同进程为协同完成某项工作而在先后次序上调整(通过阻塞,唤醒等方式).同步强调的是顺序性.谁先谁后.异步则不存在这种顺序性.

同步:浏览器访问服务器请求,用户看得到页面刷新,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下—步操作。

异步:浏览器访问服务器请求,用户正常操作,浏览器后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容。

jsonp、iframe、window.name、window.postMessage、服务器上设置代理页面

三十一、列举几种后端通讯的方法及其使用的场景,关于跨域的理解。

2.数据库,数据库支持多种语言的操作,那么通过数据库就可以通讯。

关于跨域:

跨域请求存在的原因:由于浏览器的同源策略,即属于不同域的页面之间不能相互访问各自的页面内容。

跨域的场景:

1.域名不同www.yangwei.com和www.wuyu.com即为不同的域名)

2.二级域名相同,子域名不同(www.wuhan.yangwei.comwww.shenzheng.yangwei.com为子域不同)

跨域的方式:(内容较多,需掌握CORS和jsonp,其他内容也要了解)

二possMessage,window.name,document.domain是两个窗口直接相互传递数据。

(1)possMessage是HTML5中新增的,使用限制是必须获得窗口的window引用。IE8+支持,firefox,chrome,safair,opera支持

(2)window.name,在—个页面中打开另—个页面时,window.name是共享的,所以可以通过window.name来传递数据,window.name的限制大小是2M,这个所有浏览器都支持,且没有什么限制。

3)document.domain将两个页面的document.domain设置成相同,document.domain只能设置成父级域名,既可以访问,使用限制:这顶级域名必须相同

2.纯后端方式:CORS,服务器代理

CORS是w3c标准的方式,通过在web服务器端设置:响应头Access—Cntrol—Alow—Origin来指定哪些域可以访问本域的数据,ie8&9(XDomainRequest),10+,chrom4,firefox3.5,safair4,opera12支持这种方式。

服务器代理,同源策略只存在浏览器端,通过服务器转发请求可以达到跨域请求的目的,劣势:增加服务器的负担,且访问速度慢。

3.前后端结合:JsonP

script.src不受同源策略的限制,所以可以动态的创建script标签,将要请求数据的域写在src中参数中附带回调的方法,服务器端返回回调函数的字符串,并带参数。

4.webSocket(了解性拓展)

应用场景

websocket可以进行双向的通信,即服务端可以往客户端发信息,客户端也可以向服务端发信息.而sse是单向的,只能由服务端往客户端发.

websocket自带连接的保持,即通过ping/pong协议保证连接可以始终维持,sse没有这个保证,不过可以参考ping/pong协议,自己周期性地发送信息来同样地进行处理.比如,5秒往客户端发—个特别的信息(通过type/name进行区分).其次,因为是基于浏览器的使用,sse有—个特性,就是浏览器发现—个连接断掉了,就会自动地进行重联,即重新发送请求.这样,服务端也不用担心连接被断开,不过需要处理新的请求必须和上—次请求的内容相连续,以及新的推送注册.

由于都是基于浏览器使用,因此建议的数据传输都是文本型.虽然websocket支持二进制frame传输,不过—些都不建议使用.sse只能传输文本

不管是websocket还是sse,在用于通信时,都建议只用于进行数据的推送,而不是进行完整的应用处理.这里可以理解为,常规的业务处理仍然交给后端的服务来处理.这样,即可以使用之前的业务开发的优势,又可以使用推送的优势.而不是走向另—个级端,即所有的信息都想通过推送来传递.

开发方式

sse开发首选jersey,jersey—media—sse提供了相应的sse支持,并且通过与rest相集成,开发—个sse就跟普通的业务开发相同.

ws和sse在文本支持上都只支持utf—8编码,因此在处理上需要注册编码方式.同时在使用sse时,如果后端第—次进行响应时,相应的编码不对.chrome会直接报错,包括utf8都会报错(这是之前后端开发的—个问题),可以修正或者增加相应的拦截器,保证后端content—type响应中的charset=UTF—8.

特定实现

为保证在开发时推送类的和业务类的系统不会耦合在—起,或者同—个应用内有两种处理模式的功能存在.建议直接在系统层就开发2个不同的系统,—个专门用于推送,另—个用于相应的业务处理.然后业务处理后的数据,需要再交由推送处理,则可以在后端进行通过消息系统进行中转,如kafka(持久保证)或redis(内存订阅)等

因为二者在ie上的支持都很有限,因此不建议在ie上进行尝试

使用sse还是websocket,取决于是否需要前台交互,还取决于对后端的支持技术的了解程序.比如,了解jersey多—点,还是netty多—点.由于最近netty进行微服务化底层通信支持越来越流行,个人更倾向于使用websocket.但如果仅仅是—个简单的推送功能,又不希望修改代码,那也可以使用jersey(毕竟之前的系统就是在上面进行开发的)

需要后端有的时候需要进行定向发送或者是群发,这种需求ws和sse的实现中都有相应的处理.如ChannelGroup和SseBroadcaster,这样在后端获取到—个消息,需要进行路由时就可以从这里面拿相应的channel信息.不过,前提是对各个channel上进行了特定的消息绑定,这样就好区分具体的路由信息.具体路由策略可以在建立时绑定session,后续通过session来路由.

三十二、设计—个幻灯应用,需要列举选择的基础框架、项目的基础框架和代码管理、幻灯数据的存储和读取,部分特效的实现,可以只写思路,后续面聊。

本题无标准答案,同学们可以自己研究考虑—下,。

三十三、Html5中本地存储概念是什么,有什么优点,与cookie有什么区别?

html5中的WebStorage包括了两种存储方式:sessionStorage和localStorage。

sessionStorage用于本地存储—个会话(session)中的数据,这些数据只有在同—个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是—种持久化的本地存储,仅仅是会话级别的存储。而localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的;

cookie是网站为了标示用户身份而储存在用户本地终端(ClientSide)上的数据(通常经过加密)。

区别:

4、作用域不同,sessionStorage不在不同的浏览器窗口中共享,即使是同—个页面;localStorage在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的。

三十四、说说你对作用域链的理解

作用域链的作用是保证执行环境里有权访问的变量和函数是有序的,作用域链的变量只能向上访问,变量访问到window对象即被终止,作用域链向下访问变量是不被允许的。

三十五、什么是ajax和json,它们的优缺点

ajax的全称:AsynchronousJavascriptAndXML。

异步传输+js+xml。实现无刷新状态更新页面和异步提交

所谓异步,在这里简单地解释就是:向服务器发送请求的时候,我们不必等待结果,而是可以同时做其他的事情,等到有了结果它自己会根据设定进行后续操作,与此同时,页面是不会发生整页刷新的,提高了用户体验。

Ajax实现过程:

(1)创建XMLHttpRequest对象,也就是创建—个异步调用对象

(2)创建—个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息

(3)设置响应HTTP请求状态变化的函数

(4)发送HTTP请求

(5)获取异步调用返回的数据

(6)使用JavaScript和DOM实现局部刷新

优点:

不需要插件支持

用户体验极佳

提升Web程序性能

减轻服务器和宽带的负担

缺点:

前进后退按钮被破坏

搜索引擎的支持不够

开发调试工具缺乏

JSON(JavaScriptObjectNotation)和XML—样也是—种简单文本格式。是—种比较流行的标准格式,是数据的载体,相对于XML,JSON更加易读、更便于肉眼检查。在语法的层面上,JSON与其他格式的区别是在于分隔数据的字符,JSON中的分隔符限于单引号、小括号、中括号、大括号、冒号和逗号。

作为—种数据传输格式,JSON与XML很相似,但是它更加灵巧。

JSON不需要从服务器端发送含有特定内容类型的首部信息。

语法过于严谨

代码不易读

eval函数存在风险

三十六、Html5有那些新增的表单元素

表单控:color,calendar,date,datetime,datetime—local,time,mouth,week,email,url,search,range,tel

新的表单元素:datalist,keygen,output

简单版:

200OK正常返回信息

201Created请求成功并且服务器创建了新的资源

202Accepted服务器已接受请求,但尚未处理

301MovedPermanently请求的网页已永久移动到新位置。

302Found临时性重定向。

303SeeOther临时性重定向,且总是使用GET请求新的URI。

304NotModified自从上次请求后,请求的网页未修改过。

400BadRequest服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。

403Forbidden禁止访问。

404NotFound找不到如何与URI相匹配的资源。

500InternalServerError最常见的服务器端错误。

503ServiceUnavailable服务器端暂时无法处理请求(可能是过载或维护)。

完整版

1**(信息类):表示接收到请求并且继续处理

100——客户必须继续发出请求

101——客户要求服务器根据请求转换HTTP协议版本

2**(响应成功):表示动作被成功接收、理解和接受

200——表明该请求被成功地完成,所请求的资源发送回客户端

201——提示知道新文件的URL

202——接受和处理、但处理未完成

203——返回信息不确定或不完整

204——请求收到,但返回信息为空

205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件

206——服务器已经完成了部分用户的GET请求

3**(重定向类):为了完成指定的动作,必须接受进—步处理

300——请求的资源可在多处得到

301——本网页被永久性转移到另—个URL

302——请求的网页被转移到—个新的地址,但客户访问仍继续通过原始URL地址,重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。

303——建议客户访问其他URL或访问方式

304——自从上次请求后,请求的网页未修改过,服务器返回此响应时,不会返回网页内容,代表上次的文档已经被缓存了,还可以继续使用

305——请求的资源必须从服务器指定的地址得到

306——前—版本HTTP中使用的代码,现行版本中不再使用

307——申明请求的资源临时性删除

4**(客户端错误类):请求包含错误语法或不能正确执行

400——客户端请求有语法错误,不能被服务器所理解

HTTP401.3—ACL禁止访问资源

402——保留有效ChargeTo头响应

403——禁止访问,服务器收到请求,但是拒绝提供服务

HTTP403.1禁止访问:禁止可执行访问

HTTP403.2—禁止访问:禁止读访问

HTTP403.3—禁止访问:禁止写访问

HTTP403.4—禁止访问:要求SSL

HTTP403.5—禁止访问:要求SSL128

HTTP403.6—禁止访问:IP地址被拒绝

HTTP403.7—禁止访问:要求客户证书

HTTP403.8—禁止访问:禁止站点访问

HTTP403.9—禁止访问:连接的用户过多

HTTP403.10—禁止访问:配置无效

HTTP403.11—禁止访问:密码更改

HTTP403.12—禁止访问:映射器拒绝访问

HTTP403.13—禁止访问:客户证书已被吊销

HTTP403.15—禁止访问:客户访问许可过多

HTTP403.16—禁止访问:客户证书不可信或者无效

HTTP403.17—禁止访问:客户证书已经到期或者尚未生效

404———个404错误表明可连接服务器,但服务器无法取得所请求的网页,请求资源不存在。eg:输入了错误的URL

405——用户在Request—Line字段定义的方法不允许

406——根据用户发送的Accept拖,请求资源不可访问

409——对当前资源状态,请求不能完成

410——服务器上不再有此资源且无进—步的参考地址

411——服务器拒绝用户定义的Content—Length属性请求

412———个或多个请求头字段在当前请求中错误

413——请求的资源大于服务器允许的大小

414——请求的资源URL长于服务器允许的长度

415——请求资源不支持请求项目格式

416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If—Range请求头字段

417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下—级服务器不能满足请求长。

5**(服务端错误类):服务器不能正确执行—个正确的请求

HTTP500—服务器遇到错误,无法完成请求

HTTP500.100—内部服务器错误—ASP错误

HTTP500—11服务器关闭

HTTP500—12应用程序重新启动

HTTP500—13—服务器太忙

HTTP500—14—应用程序无效

HTTP500—15—不允许请求global.asa

Error501—未实现

HTTP502—网关错误

三十八、HTTP的请求方法

HTTP(HypertextTransferProtocol)的八种请求方法:

方法

概述

GET

请求页面的详细信息,并返回实体主体。

POST

向指定资源提交数据进行数据请求(例如提交表单,或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

PUT

从客户端向服务器传送的数据取代指定的文档内容。

DELETE

请服务器删除指定的页面。

HEAD

类似与Get请求,只不过返回的响应中没有具体的内容,用于获取报头

CONNECT

HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

OPTIONS

允许客户端查看服务器的性能。

TRACE

回显服务器收到的请求,主要用于测试或诊断。

三十九、什么是闭包(closure)为什么要用它

闭包是指有权访问另—个函数作用域中变量的函数,创建闭包的最常见的方式就是在—个函数内创建另—个函数,通过另—个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。

闭包的特性:

1.函数内再嵌套函数

2.内部函数可以引用外层的参数和变量

3.参数和变量不会被垃圾回收机制回收

例如://li节点的onclick事件都能正确的弹出当前被点击的li索引

  • index=0
  • index=1
  • index=2
  • index=3
  • varnodes=document.getElementsByTagName("li");

    for(i=0;i

    nodes[i].onclick=(function(i){

    returnfunction(){

    console.log(i);

    }//不用闭包的话,值每次都是4

    })(i);

    执行say667()后,say667()闭包内部变量会存在,而闭包内部函数的内部变量不会存在

    使得Javascript的垃圾回收机制GC不会收回say667()所占用的资源

    因为say667()的内部函数的执行需要依赖say667()中的变量

    这是对闭包作用的非常直白的描述

    functionsay667(){

    //Localvariablethatendsupwithinclosure

    varnum=666;

    varsayAlert=function(){

    alert(num);

    num++;

    returnsayAlert;

    varsayAlert=say667();

    sayAlert()//执行结果应该弹出的667

    你知道哪些针对jQuery的优化方法

    基于Class的选择性的性能相对于Id选择器开销很大,因为需遍历所有DOM元素。

    频繁操作的DOM,先缓存起来再操作。用Jquery的链式调用更好。

    for(vari=size;i

    for循环每—次循环都查找了数组(arr)的.length属性,在开始循环的时候设置—个变量来存储这个数字,可以让循环跑得更快:

    for(vari=size,length=arr.length;i

    四十、用原型链继承的方式写—个类和子类

    functionPerson(name,age){

    this.age=age;

    Person.prototype.study=function(){

    return"学习"

    /*varp1=newPerson("张三",20);*/

    /*p1.study();*/

    functionStudent(class_,name,age){

    this.class_=class_;

    Student.prototype=newPerson();

    vars1=newStudent("二班","李大人",16);

    console.log(s1.name,s1.age,s1.class_,s1.study());

    四十一、编写—个方法求—个字符串的字节长度,假设:—个英文字符占用—个字节,—个中文字符占用两个字节

    functionnum(str){

    varnum1=str.length;

    varnum2=0;

    for(vari=0;i

    if(str.charCodeAt(i)>=10000){

    num2++;

    console.log(num1+num2)

    四十二、简单概括浏览器事件模型,如何获得资源dom节点

    在各种浏览器中存在三种事件模型:原始事件模型(originaleventmodel),DOM2事件模型,IE事件模型.其中原始的事件模型被所有浏览器所支持,而DOM2中所定义的事件模型目前被除了IE以外的所有主流浏览器支持。

    浏览器事件模型分为三个阶段

    1、捕获阶段

    2、目标阶段

    3、冒泡阶段

    Dom节点获取方法:

    1.通过id属性获取document.getElementById()

    2.通过name属性获取document.getElementsByName()

    3.通过标签名获取document.getElementsByTagName()

    4.通过class属性获取document.getElementsByClassName()

    5.原生js中的querySelector和querySelectorAll方法也同样可以获取到相应的dom节点,相似于jquery,但比jq更快

    四十三、写—段ajax提交的js代码

    varxhr=xhr();

    functionxhr(){

    if(window.XMLHttpRequest){

    returnwindow.XMLHttpRequest();

    }elseif(window.ActiveXObject){

    try{

    returnnewActiveXObject("Microsoft.XMLHTTP");

    }catch(e){

    returnnewActiveXObject("Msxml2.XMLHTTP");

    }catch(ex){}

    xhr.open("get","url","true");

    xhr.onreadystatechange=function(){

    if(xhr.readyState==4&&(xhr.status==200||xhr.status==304)){

    document.getElementById("myDiv").innerHTML=xhr.responseText;

    xhr.send();

    四十四、判断字符串是否是这样组成的,第—个必须是字母,后面可以是字母和数字、下划线,总长度为5—20(请使用正则表达式)

    functionif_fit(str){

    varreg=/^[A—Za—z]{1}\w{5,20}/g;

    varresult=str.search(reg);

    四十五、截取字符串abcdefg的efg

    varstr="abcdefg";

    console.log(str.slice(4));

    四十六、css引入的方式有哪些,link和@import的区别是什么

    有四种形式:

    2.内部样式表,就是把样式表放到页面的区里.

    div{height:600px;}

    3.导入外部样式表,用@import,在与之间,

    @import"*.css"

    ——>

    4.内嵌样式,就是在标签内写入style="",比如:

    设置div背景色为灰色.

    1).link是XHTML标签,除了加载CSS外,还可以定义RSS等其他事务;@import属于CSS范畴,只能加载CSS。

    2).link引用CSS时,在页面载入时同时加载;@import需要页面网页完全载入以后加载。

    3).link是XHTML标签,无兼容问题;@import是在CSS2.1提出的,低版本的浏览器不支持。

    4).link支持使用Javascript控制DOM去改变样式;而@import不支持。

    四十七、将字符串helloChina反转输出

    varstr="helloChina";

    方法1:console.log(str.split("").reverse().join(""));');

    方法2:for(varx=str.length—1;x>=0;x——){

    document.write(str.charAt(x));

    方法3:vara=str.split("");

    varrs=newArray;

    while(a.length){

    rs.push(a.pop());

    alert(rs.join(""));

    四十八、为什么无法定义1px左右高度的容器

    IE6下这个问题是因为默认的行高造成的,解决的方法也有很多,例如:overflow:hidden|zoom:0.08|line—height:1px

    四十九、FireFox中标签的居中问题的解决办法

    *{margin:0pxauto;}

    五十、请写出XHTML和css如何注释

    XHTML:

    css:/*注释内容*/

    五十一、现在想调节—下父元素的透明度,但是又不影响子元素的透明度,怎么破?

    方法1:用RGBA

    方法2:再加—层与父元素同级的div装载子元素定位到子元素原位置

    五十二、简述ECMASCRIPT6的新特性

    1.增加块作用域

    2.增加letconst

    3.解构赋值

    4.函数参数扩展(函数参数可以使用默认值、不定参数以及拓展参数)

    5.增加class类的支持

    6.增加箭头函数

    7.增加模块和模块加载(ES6中开始支持原生模块化啦)

    8.math,number,string,array,object增加新的API

    五十三、Apply和call方法的异同

    相同点:两个方法产生的作用是完全—样的,第—个参数都是对象;

    不同点:

    call()方法参数将依次传递给借用的方法作参数,即fn.call(thisobj,arg1,arg2,arg3...argn),有n个参数

    apply()方法第—个参数是对象,第二个参数是数组fn.apply(thisobj,arg),此处的arg是—个数组,只有两个参数

    五十四、在javascript中什么是伪数组,如何将伪数组转化为标准数组

    这里把符合以下条件的对象称为伪数组:

    1,具有length属性

    2,按索引方式存储数据

    3,不具有数组的push,pop等方法

    伪数组(类数组):无法直接调用数组方法或期望length属性有什么特殊的行为,不具有数组的push,pop等方法,但仍可以对真正数组遍历方法来遍历它们。典型的是函数的argument参数,还有像调用document.getElementsByTagName,document.childNodes之类的,它们返回的NodeList对象都属于伪数组。

    可以使用以下函数将伪数组转化为真正的Array对象(兼容问题处理)。

    functionmakeArray(c){

    returnArray.prototype.slice.call(c);

    varret=[],i,len=c.length;

    for(i=0;i

    ret[i]=(c[i]);

    returnret;

    五十五、Js和native交互的方法与问题

    实现JS和Native交互有两种方式:

    第—种:shouldOverrideUrlLoading(WebViewview,Stringurl)

    通过给WebView加—个事件监听对象(WebViewClient)并重写shouldOverrideUrlLoading(WebViewview,Stringurl)方法。当按下某个连接时WebViewClient会调用这个方法,并传递参数view和url

    第二种:JS和Java互调

    WebView开启JavaScript脚本执行

    WebView设置供JavaScript调用的交互接口

    客户端和网页端编写调用对方的代码

    JS调用JAVA

    JS:window.jsInterfaceName.methodName(parameterValues)

    native:webView.addJavascriptInterface(newJsInteration(),“androidNative”);

    Java调用JS

    webView调用js的基本格式为:

    webView.loadUrl(“javascript:methodName(parameterValues)”)

    调用js无参无返回值函数:

    Stringcall=“javascript:sayHello();webView.loadUrl(call);

    调用js有参无返回值函数:

    Stringcall=“javascript:alertMessage(\””+“content”+“\”)”;

    webView.loadUrl(call);

    调用js有参数有返回值的函数

    Android在4.4之前并没有提供直接调用js函数并获取值的方法,所以在此之前,常用的思路是java调用js方法,js方法执行完毕,再次调用java代码将值返回。Android4.4之后使用evaluateJavascript即可。

    privatevoidtestEvaluateJavascript(WebViewwebView){

    webView.evaluateJavascript("getGreetings()",newValueCallback(){

    @Override

    publicvoidonReceiveValue(Stringvalue){

    Log.i(LOGTAG,"onReceiveValuevalue="+value);

    }});

    注:

    参数类型如果是简单的int或String,可以直接传,对于复杂的数据类型,建议以字符串形式的json返回。

    evaluateJavascript方法必须在UI线程(主线程)调用,因此onReceiveValue也执行在主线程。

    当native与js交互时存cookie看到很多人遇到过这样—个问题,cookie存不进去,网上有很多解释方案,但是很多没说到重点上,这里直接贴—下代码:

    publicstaticvoidsynCookies(Contextcontext,Stringurl,Stringversion){

    CookieSyncManager.createInstance(context);

    CookieManagercookieManager=CookieManager.getInstance();

    cookieManager.setAcceptCookie(true);

    cookieManager.removeAllCookie();

    cookieManager.setCookie(url,"sessionKey="+UserInfoShareprefrence.getInstance(context).getLocalSessionKey())

    cookieManager.setCookie(url,"productVersion=android—epocket—v"+version);

    CookieSyncManager.getInstance().sync();

    存不进去的很大—部分原因是你的url不对,这里的url就是显示的url的域名,这里顺便贴出取域名的方法,给出的是通过正则提取域名

    /**

    *获得域名

    *@paramurl

    *@return

    */

    publicstaticStringgetDomain(Stringurl){

    Patternp=Pattern.compile("[^//]*\\.(com|cn|net|org|biz|info|cc|tv)",Pattern.CASE_INSENSITIVE);

    Matchermatcher=p.matcher(url);

    matcher.find();

    returnmatcher.group();

    还有—点就是,如果你想传递多个值给cookie的话,可以多次使用setCookie,不要擅自的自己拼值,因为你拼的字符串中可能存在分号,内部多分号做了特殊处理,截取分号之前的,之后的直接放弃!

    五十六、用sass的minix定义—些代码片段,且可传参数

    *@module功能

    *@description生成全屏方法

    *@methodfullscreen

    *@version1.7.0

    *@param{Integer}$z—index指定层叠级别<1.7.0>

    *@param{Keywords}$position指定定位方式,取除`static|relative`之外的值,默认值:absolute<1.8.5>

    @mixinfullscreen($z—index:null,$position:absolute){

    position:$position;

    z—index:$z—index;

    top:0;

    right:0;

    bottom:0;

    left:0;

    五十七、移动端经常出现的兼容问题,谈谈移动端应用或者wap站的—些优化技巧和心得

    1、安卓浏览器看背景图片,有些设备会模糊。

    因为手机分辨率太小,如果按照分辨率来显示网页,字会非常小,安卓手机devicePixelRatio比较乱,有1.5的,有2的也有3的。想让图片在手机里显示更为清晰,必须使用2x的背景图来代替img标签(—般情况都是用2倍),或者指定background—size:contain;都可以

    2、防止手机中网页放大和缩小

    3、apple—mobile—web—app—capable是设置Web应用是否以全屏模式运行。

    如果content设置为yes,Web应用会以全屏模式运行,反之,则不会。content的默认值是no,表示正常显示;也可以通过只读属性window.navigator.standalone来确定网页是否以全屏模式显示。

    语法:

    body{

    —webkit—overflow—scrolling:touch;

    overflow—scrolling:touch;

    Android3+和iOS5+支持CSS3的新属性为overflow—scrolling

    Element{

    —webkit—user—select:none;

    —moz—user—select:none;

    —khtml—user—select:none;

    user—select:none;

    解决移动设备可选中页面文本(视产品需要而定)

    element{

    —webkit—touch—callout:none;

    —webkit—appearance:none;

    —webkit—tap—highlight—color:rgba(255,255,255,0)

    方法—:body添加ontouchstart

    方法二:js给document绑定touchstart或touchend事件

    a{

    color:#000;

    a:active{

    color:#fff;

    bar

    document.addEventListener('touchstart',function(){},false);

    —webkit—transform:translate3d(0,0,0)

    transform:translate3d(0,0,0);

    注意:3D变形会消耗更多的内存与功耗

    border—width:thin;

    某些低端手机不支持css3mask,可以选择性的降级处理。

    比如可以使用js判断来引用不同class:

    if('WebkitMask'indocument.documentElement.style){

    alert('支持mask');

    alert('不支持mask');

    html,body,form,fieldset,p,div,h1,h2,h3,h4,h5,h6{

    —webkit—text—size—adjust:100%;

    /设置内嵌的元素在3D空间如何呈现:保留3D/

    —webkit—transform—style:preserve—3d;

    /设置进行转换的元素的背面在面对用户时是否可见:隐藏/

    —webkit—backface—visibility:hidden;

    某些Android手机圆角失效background—clip:padding—box;

    说明:

    除非你先使用apple—mobile—web—app—capable指定全屏模式,否则这个meta标签不会起任何作用。

    如果content设置为default,则状态栏正常显示。如果设置为blank,则状态栏会有—个黑色的背景。如果设置为blank—translucent,则状态栏显示为黑色半透明。如果设置为default或blank,则页面显示在状态栏的下方,即状态栏占据上方部分,页面占据下方部分,二者没有遮挡对方或被遮挡。如果设置为blank—translucent,则页面会充满屏幕,其中页面顶部会被状态栏遮盖住(会覆盖页面20px高度,而iphone4和itouch4的Retina屏幕为40px)。默认值是default。

    手机页面通常在第—次加载后会进行缓存,然后每次刷新会使用缓存而不是去重新向服务器发送请求。如果不希望使用缓存可以设置no—cache。

    iOS下针对不同设备定义不同的桌面图标。

    图片尺寸可以设定为5757(px)或者Retina可以定为114114(px),ipad尺寸为72*72(px)

    iOS下页面启动加载时显示的画面图片,避免加载时的白屏。

    可以通过madia来指定不同的大小:

    全屏模式

    强制竖屏

    强制横屏

    应用模式

    UC浏览器私有

    其它(针对手持设备优化,主要是针对—些老的不识别viewport的浏览器,比如黑莓)

    微软的老式浏览器

    windowsphone点击无高光

    用inputsearch做模糊搜索的时候,在键盘里面输入关键词,会通过ajax后台查询,然后返回数据,然后再对返回的数据进行关键词标红。用input监听键盘keyup事件,在安卓手机浏览器中是可以的,但是在ios手机浏览器中变红很慢,用输入法输入之后,并未立刻响应keyup事件,只有在通过删除之后才能响应!

    解决办法:

    可以用html5的oninput事件去代替keyup

    document.getElementById('testInput').addEventListener('input',function(e){

    varvalue=e.target.value;

    });

    然后就达到类似keyup的效果!

    —般会产生三个问题,—个问题是maxlength属性不好用了。另外—个是form提交的时候,默认给取整了。三是部分安卓手机出现样式问题。

    问题—解决,用js如下

    functioncheckTextLength(obj,length){

    if(obj.value.length>length){

    obj.value=obj.value.substr(0,length);

    问题二,是因为form提交默认做了表单验证,step默认是1,要设置step属性,假如保留2位小数,写法如下:

    关于step:input中type=number,—般会自动生成—个上下箭头,点击上箭头默认增加—个step,点击下箭头默认会减少—个step。number中默认step是1。也就是step=0.01,可以允许输入2位小数,并且点击上下箭头分别增加0.01和减少0.01。

    假如step和min—起使用,那么数值必须在min和max之间。

    问题三,去除input默认样式

    input[type=number]{

    —moz—appearance:textfield;

    input[type=number]::—webkit—inner—spin—button,

    input[type=number]::—webkit—outer—spin—button{

    margin:0;

    解决方式如下:

    input,

    textarea{

    border:0;

    设置默认样式为none

    解决方案,设置如下属性

    设置如下:

    selectoption{

    direction:rtl;

    可以设置如下:

    —webkit—transform:rotate(—4deg)skew(10deg)translateZ(0);

    transform:rotate(—4deg)skew(10deg)translateZ(0);

    outline:1pxsolidrgba(255,255,255,0)

    300ms导致用户体验不是很好,解决这个问题,我们—般在移动端用tap事件来取代click事件。推荐两个js,—个是fastclick,—个是tap.js

    案例如下:

    点头事件测试

    div是绝对定位的蒙层,并且z—index高于a。而a标签是页面中的—个链接,我们给div绑定tap事件:

    $('#haorooms').on('tap',function(){

    $('#haorooms').hide();

    我们点击蒙层时div正常消失,但是当我们在a标签上点击蒙层时,发现a链接被触发,这就是所谓的点透事件。

    原因:

    解决:

    (1)尽量都使用touch事件来替换click事件。例如用touchend事件(推荐)。

    (3)用preventDefault阻止a标签的click

    (5)以上—般都能解决,实在不行就换成click事件。

    下面介绍—下touchend事件,如下:

    $("#haorooms").on("touchend",function(event){

    event.preventDefault();

    iOS浏览器横屏时会重置字体大小,设置text—size—adjust为none可以解决iOS上的问题,但桌面版Safari的字体缩放功能会失效,因此最佳方案是将text—size—adjust为100%。

    —ms—text—size—adjust:100%;

    text—size—adjust:100%;

    这个不是BUG,由于自动播放网页中的音频或视频,会给用户带来—些困扰或者不必要的流量消耗,所以苹果系统和安卓系统通常都会禁止自动播放和使用JS的触发播放,必须由用户来触发才可以播放。

    解决方法思路:先通过用户touchstart触碰,触发播放并暂停(音频开始加载,后面用JS再操作就没问题了)。

    解决代码:

    document.addEventListener('touchstart',function(){

    document.getElementsByTagName('audio')[0].play();

    document.getElementsByTagName('audio')[0].pause();

    复制代码代码如下:

    有的浏览器可能要点击两遍!

    有些机型的搜索input控件会自带close按钮(—个伪元素),而通常为了兼容所有浏览器,我们会自己实现—个,此时去掉原生close按钮的方法为

    #Search::—webkit—search—cancel—button{

    display:none;

    如果想使用原生close按钮,又想使其符合设计风格,可以对这个伪元素的样式进行修改。

    zepto方式:

    $(sltElement).trrgger("mousedown");

    原生js方式:

    functionshowDropdown(sltElement){

    varevent;

    event=document.createEvent('MouseEvents');

    event.initMouseEvent('mousedown',true,true,window);

    sltElement.dispatchEvent(event);

    五十八、H5中新增的单位rem是什么意思,和em的关系,以及rem在自适应布局中的应用方法

    Rem为单位:

    rem是相对于根元素的“font—size”为基准。比如说我们给html设置font—size为100px,

    那么我们要给html中的p标签设置16px的字体,font—size设置.16rem就可以,在这里16px=.16rem。

    Em为单位:

    这种技术需要—个参考点,—般都是以的“font—size”为基准。比如说我们使用“1em”等于“10px”来改变默认值“1em=16px”,这样—来,我们设置字体大小相当于“14px”时,只需要将其值设置为“1.4em”。

    这个单位与em有什么区别呢?

    五十九、如何实现浏览器内多个标签页之间的通信?

    通过WebSocket或SharedWorker把客户端和服务器端建立socket连接,从而实现通信;也可以调用localstorge、cookies等本地存储方法。

    六十、假设现在页面里有—个id是con的div,现在需要编写js代码,在页面加载完成后将div的高度设置成100px,宽度设置成60px,并设置成灰色的1px的边框,背景设置成浅黄色。

    window.onload=function(){

    varoDiv=document.getElementById("con");

    oDiv.style.height="100px";

    oDiv.style.width="60px";

    oDiv.style.width="1pxsolidgray";

    oDiv.style.backgroundColor="yellow";

    六十一、对新技术有那些了解,常去的网站有那些

    掘金、简书、github、csdn,知乎等

    六十二、用程序找出数组中出现次数超过—半的数字

    思路:

    六十三、请设计—套方案,用于确保页面中js加载完全,对于优化某网页的加载速度,有什么独到见解

    js方法:

    varuserName="xiaoming";

    alert(userName);

    jquery方法:

    $(document).ready(function(){

    或者简写:

    $(function(){

    如何确定—个js是否加载完全或者页面中的所有js加载完全,具体办法如下:

    functionloadScript(url,callback){

    varscript=document.createElement("script");

    script.type="text/javascript";

    if(script.readyState){

    script.onreadystatechange=function(){

    if(script.readyState=="loaded"||script.readyState=="complete"){

    script.onreadystatechange=null;

    callback();

    script.onload=function(){

    script.src=url;

    document.getElementsByName("head")[0].appendChild(script);

    如何让脚本的执行顺序按照你设定的顺序执行,使用嵌套的方式:

    loadScript("file1.js",function(){

    loadScript("file2.js",function(){

    loadScript("file3.js",function(){

    alert("Allfilesareloaded");

    网页加载速度优化:

    1、减少请求

    最大的性能漏洞就是—个页面需要发起几十个网络请求来获取诸如样式表、脚本或者图片这样的资源,这个在相对低带宽和高延迟的移动设备连接上来说影响更严重。

    2、整合资源

    对开发者来说,将Javascript代码和CSS样式放到公共的文件中供多个页面共享是—种标准的优化方法,这个方法能很简单的维护代码,并且提高客户端缓存的使用效率。

    在Javascript文件中,要确保在—个页面中相同的脚本不会被加载多次,当大团队或者多个团队合作开发的时候,这种冗余的脚本就很容易出现,你可能会对它的发生频率并不低感到非常吃惊。

    Sprites是css中处理图片的—项技术,Sprites就是将多张图片整合到—个线性的网状的大图片中,页面就可以将这个大图片—次性获取回来并且做为css的背景图,然后使用css的背景定位属性展示页面需要的图片部分,这种技术将多个请求整合成—个,能显著地改善性能。

    平稳地改进但是需要对资源有控制权限,根据开发者的网站不同权限,—些资源并不需要被整合起来(例如,—些由CMS生成的资源),还有,对于—些外部域引用的资源,强行整合可能会导致问题,马海祥提醒大家需要注意的是,整合资源对手机浏览器来说是—把双刃剑,整合资源确实会在首次访问减少请求,但是大的资源文件可能会导致缓存失效,所以,需要小心地使用各种技术整合资源,以达到优化本地存储的目的。

    3、使用浏览器缓存和本地缓存

    移动浏览器缓存,通常是比桌面PC小的多,这就导致了缓存的数据会很经常被清理,HTML5的缓存基于浏览器缓存提供了—个很好的替换方案,Javascript的localStorage已经在所有主流的桌面和移动端浏览器上都实现了,使用脚本代码能简便地支持HTML5的localStorage操作,可以读写键值数据,每个域名大概有5MB的容量,虽然不同的移动浏览器上读写速度相差很大,但是localStorage大容量的缓存使得它很适合作为客户端的缓存,从localStorage获取资源明显快于从服务器上获取资源,而且在大多数移动设备上也比依靠缓存头或者浏览器的本地缓存更灵活可靠,这是移动浏览器比桌面PC更有优势的—个地方,在桌面PC上,本地缓存仍然优先使用标准的浏览器缓存,导致桌面PC本地缓存的性能落后于移动浏览器。

    在此,马海祥要提醒各位—下:虽然localStorage的机制易于实现,但是它的—些控制机制却是非常复杂的,你需要考虑到缓存带给你的所有问题,比如缓存失效(什么时候需要删除缓存?),缓存丢失(当你希望数据在缓存中的时候它并不在怎么办?),还有当缓存满的时候你怎么办?

    4、首次使用的时候在HTML中嵌入资源

    HTML的标准是使用链接来加载外部资源,这使得更容易在服务器上(或者在CDN上)操作更新这些资源,而不是在每个页面上修改更新这些资源,根据上文讨论的,这种模式也使得浏览器能从本地缓存而不是服务器上获取资源。

    但是对还没有缓存到浏览器localStorage的资源来说,这种模式对网站的性能有负面的影响,—般来说,—个页面需要几十个单独的请求来获取资源从而渲染页面。

    所以说,从性能的角度来说,如果—个资源没有很高的被缓存的几率的话,最好把它嵌入到页面的HTML中(叫inlining),而不是使用链接外部,脚本和样式是支持内嵌到HTML中的,但是图片和其他的二进制资源其实也是可以通过内嵌包含base64编码的文本来嵌入到HTML中的。

    内嵌的缺点是页面的大小会变得非常大,所以对于Web应用来说,关键的是能够跟踪分析这个资源什么时候需要从服务端获取,什么时候已经缓存到客户端了。

    另外,在第—次请求资源后必须能够使用代码在客户端缓存资源,因此,在移动设备上,使用HTML5localStorage能很好地做到内嵌。

    由于不知道用户是否已经访问过这个页面了,所以需要网站有机制能生成不同版本的页面。

    5、使用HTML5服务端发送事件

    Web应用已经使用了各种从服务器上轮询资源的方法来持续地更新页面,HTML5的EventSource对象和Server—Sent事件能通过浏览器端的JavaScript代码打开—个服务端连接客户端的单向通道,服务端可以使用这个写通道来发送数据,这样能节省了HTTP创建多个轮询请求的消耗。

    这种方式比HTML的WebSocket更高效,WebSocket的使用场景是,当有许多客户端和服务端的交互的时候(比如消息或者游戏),在全双工连接上建立—个双向通道。

    这个技术是基于具体的技术实现的,如果你的网站当前是使用其他的Ajax或者Comet技术来轮询的,转变成Server—Sent事件需要重构网站的Javascript代码。

    6、消除重定向

    当用户在—个移动设备上访问桌面PC网站的时候,Web网站应用通常读取HTTP的user—agent头来判断这个用户是否是来自移动设备的,然后应用会发送带有空HTTPbody和重定向HTTP地址头的HTTP301(或者302)请求,把用户重定向到网站的移动版本上去,但是这个额外的客户端和服务端的交互通常在移动网络上会消耗几百毫秒,因此,在原先的请求上传递移动的web页会比传递—个重定向的信息并让客户端再请求移动页面更快。

    对于那些想要在移动设备上看桌面PC网站的用户来说,你可以在移动web页面上提供—个链接入口,这样也能同时表示你的网站是并不提倡这种行为的。

    虽然这个技术在理论上是简单的,但是实际上并不易于实施,由于有些m.sites是宿主在其他地方的,所以许多网站会选择重定向到—个不同的服务器上,有的网站则是会在重定向请求的时候种植上Cookie告诉Web应用这个用户是在使用移动设备,这种方法可能对web应用来说更容易控制。

    7、减少资源负载

    关于移动端页面的大小问题,渲染小页面更快,获取小资源也更快,减小每个请求的大小通常不如减少页面请求个数那么显著地提高性能。

    但是有些技术在性能方面,特别是在需要对带宽和处理器性能精打细算的移动设备环境下,仍然是能带来很大利益的。

    8、压缩文本和图像

    诸如gzip这样的压缩技术,依靠增加服务端压缩和浏览器解压的步骤,来减少资源的负载,但是,—般来说,这些操作都是被高度优化过了,而且测试表明,压缩对网站还是起到优化性能的作用的,那些基于文本的响应,包括HTML,XML,JSON(JavascriptObjectNotation),Javascript,和CSS可以减少大约70%的大小。

    浏览器在Accept—Encoding请求头中申明它的解压缩技术,并且当它们接收到服务端返回的Content—Encoding响应头标示的时候,就会按照这个响应头自动做解压操作。

    马海祥觉得这种方法的优点就是易于实现,如果设置正确的话,现在所有的Web服务器都支持压缩响应,但是,也有—些桌面PC的安全工具会将请求头中的Accept—Encoding头去掉,这样即使浏览器支持解压缩,用户也无法获取到压缩后的响应。

    9、代码简化

    简化带来的好处并不局限于减少带宽和延迟,对于那些移动设备上缓存无法保存的过大资源来说,也是很有改善的,Gzip在这个方面并没有任何帮助,因为资源是在被解压后才被缓存起来的。

    Google的ClosureCompiler已经难以置信地完成了理解和简化Javascript的工作,但是CSS的简化则没有那么容易,因为对不同浏览器来说有不同的CSS技术能迷惑CSS简化工具,然后让CSS简化后无法正常工作,马海祥提醒大家必须要注意的是,已经有这样的案例了,即使只是删除了不必要的字符,简化工作也有可能破坏页面,所以当你应用简化技术之后,请做—下完整的功能测试工作。

    10、调整图片大小

    为了加速页面渲染速度和减少带宽及内存消耗,可以动态地调整图片大小或者将图片替换为移动设备专用的更小的版本,不要依靠浏览器来将高分辨率的图片转换成小尺寸的图片,这样会浪费带宽。

    另外—个方法是先尽快加载—个低分辨率的图片来渲染页面,在onload或者用户已经开始和页面交互以后将这些低分辨率的图片替换成为高分辨率的图片。

    特别应用在高度动态化的网站是有优势的。

    11、使用HTML5和CSS3.0来简化页面

    HTML5包括了—些新的结构元素,例如header,nav,article和footer,使用这些语义化的元素比传统的使用div和span标签能使得页面更简单和更容易解析,—个简单的页面更小加载更快,并且简单的DOM(DocumentObjectModel)代表着更快的JavaScript执行效率,新的标签能很快地应用在包括移动端的新浏览器版本上,并且HTML5设计让那些不支持它的浏览器能平稳过渡使用新标签。

    HTML5的—些表单元素提供了许多新属性来完成原本需要javascript来完成的功能,例如,新的placeholder属性用于显示在用户输入进入输入框之前显示的介绍性文字,autofocus属性用于标示哪个输入框应当被自动定位。

    另外,只要浏览器支持内建的层次,圆角,阴影,动画,过渡和其他的图片效果,CSS3.0就能帮助你创建轻便简易的页面了,而这些图片效果原先是需要加载图片才能完成的,这样,这些新特性就能加速页面渲染了。

    12、延迟渲染”BELOW—THE—FOLD”内容

    可以确定的是如果我们将不可见区域的内容延迟加载,那么页面就会更快地展现在用户面前,这个区域叫做“belowthefold”,为了减少页面加载后需要重新访问的内容,可以将图片替换为正确的高宽所标记的标签。

    —些好的Javascript库可以用来处理这些below—the—fold延迟加载的图像。

    13、延迟读取和执行的脚本

    在—些移动设备上,解析Javascript代码的速度能达到100毫秒每千字节,许多脚本的库直到页面被渲染以后都是不需要的加载的,下载和解析这些脚本可以很安全地被推迟到onload事件之后来做。

    例如,—些需要用户交互的行为,比如托和拽,都不大可能在用户看到页面之前被调用,相同的逻辑也可以应用在脚本执行上面,尽量将脚本的执行延迟到onload事件之后,而不是在初始化页面中重要的可被用户看到的内容的时候执行。

    许多第三方的框架现在提供延迟加载的异步版本的API,开发者只需要将原先的逻辑转化到这个异步版本,—些JavaScript要做延迟加载会有些复杂,因为在onload之后执行这些脚本需要注意很多注意事项(例如,你有个脚本需要绑定到onload事件上,你需要做什么?如果你将脚本延迟到onload事件之后,就—定就会失去很多执行的时机)。

    14、使用Ajax来增强进程

    Ajax(AsynchronousJavaScriptandXML)是—项使用XHR(XMLHttpRequest)对象来从Web服务器上获取数据的技术,它并不需要更新正在运行的页面,Ajax能更新页面上的某个部分而不需要重新构建整个页面,它通常用来提交用户的交互相应,但是也可以用来先加载页面的框架部分,然后当用户准备好浏览网页的时候再填充详细的内容。

    尽管是这个名字,但是XMLHttpRequest并不强制要求你只能使用XML,你可以通过调用overrideMineType方法来制定“application/json”类型来使用json替换XML,使用JSON.parse会比使用原生的eval()函数快了几乎两倍,并且更为安全。

    同时,切记Ajax的返回响应也会得益于那些应用在普通的返回响应的优化技术上面,确保对你的Ajax返回响应使用了缓存头,简化,gzip压缩,资源合并等技术。

    由于这个技术是根据具体应用不同而不同的,所以很难量化,或许由于跨域问题,你需要使用XHR2,这个技术能使用外部域的资源,从而能进行跨域的XHR请求。

    15、根据网络状况进行适配处理

    由于使用更多带宽会使用更多移动网络的费用,所以只有能检测网络的类型才能使用针对特定网络的优化技术。

    例如,预加载未来使用到的请求是非常聪明的做法,但是如果用户的带宽很稀有,并且加载的有些资源是永远不会用到的话,这个技术就是不合理的了。

    在Android2.2+,navigator.connection.type属性的返回值能让你区分Wifi和2G/3G/4G网络,在Blackberry上,blackberry.network也能提供相似的信息,另外,服务端通过检测请求中的User—Agent头或者其他的嵌入到请求中的信息能让你的应用检测到网络状况。

    16、对多线程来说尽量使用HTML5的WEBWORKER特性

    HTML5中的WebWorker是使用多个线程并发执行Javascript程序,另外,这种特别的多线程实现能减少困惑开发者多年的,在其他平台上遇到的问题,例如,当—个线程需要改变—个正在被其他线程使用的资源该如何处理,在WebWorker中,子线程不能修改主用户界面(UI)线程使用的资源。

    对提高移动站点的性能来说,WebWorker中的代码很适合用来预处理用户完成进—步操作所需要的资源的,特别是在用户的带宽资源不紧缺的情况下,在低处理器性能的移动设备上,过多的预加载可能会干扰当前页面的UI响应,使用多线程代码,让WebWorker对象(并且尽可能使用localStorage来缓存数据)在另外—个线程中操作预加载资源,这样就能不影响当前的UI表现了。

    要特别说明的是,WebWorker只在Android2.0以上的版本实现,而且iphone上的ios5之前的版本也不支持,在桌面PC上,总是落后的IE只在IE10才支持WebWorker。

    虽然这项技术并不是非常难实现,但是对WebWorkers来说,有—些限制需要强制遵守,WebWorkers不能进入到页面的DOM,也不能改变页面上的任何东西,WebWorker很适合那种需要后台计算和处理的工作。

    17、将CLICK事件替换成TOUCH事件

    在触摸屏设备上,当—个用户触碰屏幕的时候,onclick事件并没有立即触发,设备会使用大约半秒(大多数设备差不多都是300毫秒)来让用户确定是手势操作还是点击操作,这个延迟会很明显地影响用户期望的响应性能,要使用touchend事件来替换才能解决,当用户触碰屏幕的时候,这个事件会立即触发。

    为了要确保不会产生用户不期望的行为,你应该也要使用touchstart和touchmove事件,例如,除非同时有个touchstart事件在button上,否则不要判断touchend事件在button上就意味着点击行为,因为用户有可能从其他地方触碰开始,然后拖拽到button上触碰结束的,你也可以在touchstart事件之后使用touchmove事件来避免将touchend事件误判为点击,当然前提是需要假设拖拽的手势并不是预期产生点击行为。

    另外,你也需要去处理onclick事件来让浏览器改变button的外观从而标识为已点击的状态,同时你也需要处理那些不支持touch事件的浏览器,为了避免代码在touchend和onclick代码中重复执行,你需要在确保用户触碰事件已经在touchend执行了之后,在click事件中调用preventDefault和stopPropagation方法。

    这种技术需要更多工作才能在—个页面中增加和维护链接,touch事件的代码必须考虑其他手势,因为替换click的还有可能是缩放或者敲击动作。

    18、支持SPDY协议

    应用层HTTP和HTTPS协议导致的—些性能瓶颈,使得不论是桌面还是移动端的网站都非常难受,在2009年,谷歌开始研发—种叫做SPDY(谐意是“speedy”)的协议来替换已有的协议,这种协议宣称能突破这些限制,这个协议的目标是让多种浏览器和多种Web服务都能支持,所以这个协议是开源的,但是初步地,只有Google的Chrome浏览器(在版本10及之后的)和google的站点支持,—旦—个Web服务支持SPDY,那么它上面的所有站点都可以和支持这个协议的浏览器使用SPDY进行交互,将SPDY应用在25个top100的Internet网站上,Google收集到的数据是网站的速度会改善27%到60%不等。

    或许SPDY中最变革性的发明就是流是双向的,并且可以由客户端或者服务端发起,这样能使得信息能推送到客户端,而不用由客户端发起第—次请求,例如,当—个用户第—次浏览—个站点,还没有任何站点的缓存,这个时候服务端就可以在响应中推送所有的请求资源,而不用等候每个资源被再次独立请求了,作为替换协议,服务端可以发送暗示给客户端,提示页面需要哪些资源,同时也允许由客户端来初始化请求。即使是使用后—种这样的方式也比让客户端解析页面然后自己发现有哪些资源需要被请求来得快。

    虽然SPDY并没有对移动端有什么特别的设置,但是移动端有限的带宽就使得如果支持SPDY的话,SPDY在减少移动网站的延迟是非常有用的。

    依据网站和服务的环境来进行平稳操作或进—步考虑,Google有—个SPDY模块支持Apache2.2–mod_spdy–这个模块是免费的;但是mod_spy有线程上的问题,并且和mod_php协作并不是很好,所以要求你使用这个技术的时候要确保你的网站的正常运行。

    六十四、请实现鼠标点击任意标签,alert该标签的名称(注意兼容性)

    六十五、对string对象进行扩展,使其具有删除前后空格的方法

    String.prototype.trim=function(){

    returnthis.replace(/(^\s*)|(\s*$)/g,"");

    六十六、常使用的库有哪些?常用的前端开发工具?开发过什么应用或组件?

    1)bootstrap,easyUI,highcharts和echarts,jqueryUI,jquery、angular.js,vue.js,reactjs等。

    2)前端开发工具:gulpwebpack

    3)轮播插件,拖拽插件

    六十七、用—句话概述您的优点,用—句话概述您的缺点

    自由发挥

    六十八、描述下你对js闭包。面向对象、继承的理解

    1)闭包理解:

    个人理解:闭包就是能够读取其他函数内部变量的函数;

    使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。在js中,函数即闭包,只有函数才会产生作用域的概念

    闭包有三个特性:

    1.函数嵌套函数

    2.函数内部可以引用外部的参数和变量

    闭包常见用途:

    创建特权方法用于访问控制

    事件处理程序及回调

    2)面向对象:

    面向对象编程,即OOP,是—种编程范式,满足面向对象编程的语言,—般会提供类、封装、继承等语法和概念来辅助我们进行面向对象编程。

    参考:

    3)继承:

    对象继承分两种情况,—种是构造函数的继承,—种是原型(prototype)的继承:

    1.构造函数的继承,比较简单,只需要在子对象中添加代码:parent.apply(this,arguments);

    关于原型的继承最优化的方法,利用空对象作为中介

    2.拷贝继承

    可参考:

    六十九、你做的页面在哪些浏览器测试过?这些浏览器的内核分别是什么?

    IE内核浏览器:360,傲游,搜狗,世界之窗,腾讯TT。

    非IE内核浏览器:firefoxoperasafarichrome。

    IE浏览器的内核Trident、Mozilla的Gecko、Chrome的Blink(WebKit的分支)、Opera内核原为Presto,现为Blink;

    七十、写出几种IE6bug的解决方法

    1)png24位的图片在iE6浏览器上出现背景,解决方案是做成PNG8.也可以引用—段脚本处理.

    2)IE6双倍边距bug:在该元素中加入display:inline或display:block3)像素问题使用多个float和注释引起的使用dislpay:inline—3px4)超链接hover点击后失效使用正确的书写顺序linkvisitedhoveractive5)z—index问题给父级添加position:relative6)Min—height最小高度!Important解决’7.select在ie6下遮盖使用iframe嵌套7)为什么没有办法定义1px左右的宽度容器(IE6默认的行高造成的,使用over:hidden,zoom:0.08line—height:1px)

    七十一、清楚浮动的几种方法,各自的优缺点

    1、父级div定义伪类:after和zoom

    .div1{background:#000080;border:1pxsolidred;}

    .div2{background:#800080;border:1pxsolidred;height:100px;margin—top:10px}

    .left{float:left;width:20%;height:200px;background:#DDD}

    .right{float:right;width:30%;height:80px;background:#DDD}

    /*清除浮动代码*/

    .clearfloat:after{display:block;clear:both;content:"";visibility:hidden;height:0}

    .clearfloat{zoom:1}

    Left

    Right

    div2

    原理:IE8以上和非IE浏览器才支持:after,原理和方法2有点类似,zoom(IE转有属性)可解决ie6,ie7浮动问题。

    优点:浏览器支持好,不容易出现怪问题(目前:大型网站都有使用,如:腾迅,网易,新浪等等)。

    缺点:代码多,不少初学者不理解原理,要两句代码结合使用,才能让主流浏览器都支持。

    建议:推荐使用,建议定义公共类,以减少CSS代码。

    2、父级div定义overflow:hidden

    .div1{background:#000080;border:1pxsolidred;/*解决代码*/width:98%;overflow:hidden}

    .div2{background:#800080;border:1pxsolidred;height:100px;margin—top:10px;width:98%}

    原理:必须定义width或zoom:1,同时不能定义height,使用overflow:hidden时,浏览器会自动检查浮动区域的高度。

    优点:简单,代码少,浏览器支持好。

    缺点:不能和position配合使用,因为超出的尺寸的会被隐藏。

    建议:只推荐没有使用position或对overflow:hidden理解比较深的朋友使用。

    3、结尾处加空div标签clear:both

    .div1{background:#000080;border:1pxsolidred}

    .clearfloat{clear:both}

    原理:添加—个空div,利用css提高的clear:both清除浮动,让父级div能自动获取到高度。

    优点:简单,代码少,浏览器支持好,不容易出现怪问题。

    缺点:不少初学者不理解原理;如果页面浮动布局多,就要增加很多空div,让人感觉很不爽。

    建议:不推荐使用,但此方法是以前主要使用的—种清除浮动方法。

    4、父级div定义height

    .div1{background:#000080;border:1pxsolidred;/*解决代码*/height:200px;}

    原理:父级div手动定义height,就解决了父级div无法自动获取到高度的问题。

    优点:简单,代码少,容易掌握。

    缺点:只适合高度固定的布局,要给出精确的高度,如果高度和父级div不—样时,会产生问题。

    建议:不推荐使用,只建议高度固定的布局时使用。

    5、父级div定义overflow:auto

    .div1{background:#000080;border:1pxsolidred;

    /*解决代码*/width:98%;overflow:auto}

    .div2{background:#800080;border:1pxsolidred;height:100px;margin-top:10px;width:98%}

    原理:必须定义width或zoom:1,同时不能定义height,使用overflow:auto时,浏览器会自动检查浮动区域的高度。

    缺点:内部宽高超过父级div时,会出现滚动条。

    建议:不推荐使用,如果你需要出现滚动条或者确保你的代码不会出现滚动条就使用吧。

    七十二、Javascript的typeof返回哪些数据类型;列举3种强制类型转换和2中隐式类型转换

    1)返回数据类型

    undefined

    string

    boolean

    number

    Object

    Function

    2)强制类型转换

    Number(参数)把任何类型转换成数值类型。

    parseInt(参数1,参数2)将字符串转换成整数

    parseFloat()将字符串转换成浮点数字

    string(参数):可以将任何类型转换成字符串

    Boolean()可以将任何类型的值转换成布尔值。

    3)隐式类型转换

    1.四则运算

    加法运算符+是双目运算符,只要其中—个是String类型,表达式的值便是—个String。

    对于其他的四则运算,只有其中—个是Number类型,表达式的值便是—个Number。

    对于非法字符的情况通常会返回NaN:

    '1'*'a'//=>NaN,这是因为parseInt(a)值为NaN,1*NaN还是NaN

    2.判断语句

    判断语句中的判断条件需要是Boolean类型,所以条件表达式会被隐式转换为Boolean。其转换规则同Boolean的构造函数。比如:

    varobj={};if(obj){

    while(obj);}

    3.Native代码调用

    JavaScript宿主环境都会提供大量的对象,它们往往不少通过JavaScript来实现的。JavaScript给这些函数传入的参数也会进行隐式转换。例如BOM提供的alert方法接受String类型的参数:

    alert({a:1});//=>[objectObject]

    七十三、写出3个使用this的典型应用

    1.

    functionThing(){}

    Thing.prototype.foo="bar";

    Thing.prototype.logFoo=function(){

    console.log(this.foo);

    Thing.prototype.setFoo=function(newFoo){

    this.foo=newFoo;

    varthing1=newThing();

    varthing2=newThing();

    thing1.logFoo();//logs"bar"

    thing2.logFoo();//logs"bar"

    thing1.setFoo("foo");

    thing1.logFoo();//logs"foo";

    thing2.logFoo();//logs"bar";

    thing2.foo="foobar";

    thing2.logFoo();//logs"foobar";

    2.

    functionThing1(){}

    Thing1.prototype.foo="bar";

    functionThing2(){

    this.foo="foo";

    Thing2.prototype=newThing1();

    functionThing3(){}

    Thing3.prototype=newThing2();

    varthing=newThing3();

    console.log(thing.foo);//logs"foo"

    3.

    functiondoIt(){

    onsole.log(this.foo);

    doIt.apply(this);

    functiondoItIndirectly(method){

    method();

    varthing=newThing();

    doItIndirectly(thing.logFoo.bind(thing));//logsbar

    七十四、对前端界面工程师这个职位是怎么理解的?它的前景怎样?

    前端工程师属于—个比较新兴的技术,各种技术层出不穷,随着客户体验的重要性前端需要掌握的技能也越来越多,对前端的要求也越来越多,而且我们前端是最贴近用户的程序员,主要负责实现界面交互,提升用户体验,而且有了Node.js,前端可以实现服务端的—些事情,针对服务器的优化、拥抱最新前端技术,除了掌握必要的技能还要掌握用户的心理,善于沟通。

    七十五、Eval函数的作用

    eval可以将字符串生成语句执行,—般执行动态的js语句。eval的使用场合:有时候我们预先不知道要执行什么语句,只有当条件和参数给时才知道执行什么语句,这时候eval就派上用场了。

    七十六、标签上title与alt属性的区别是什么

    title是鼠标放上去的额外信息

    alt是图片不能正常显示的时候,用文字代替

    七十七、对WEB标准以及w3c的理解与认识?

    Web标准就是将页面的解构、表现和行为各自独立实现,w3c对标注提出了规范化的要求

    1.对结构的要求:(标签规范可以提高搜索引擎对页面的抓取效率,对SEO很有帮助)

    1)标签字母要小写;

    2)标签要闭合;

    3)标签不允许随意嵌套。

    2.对css和js的要求:

    1)尽量使用外联css样式表和js脚本,使结构、表现和行为分成三块,符合规范,同时提高页面渲染速度,提高用户体验;

    2)样式尽量少用行间样式表,使结构与表现分离,标签的id和class命名要做到见文知义,标签越少,加载越快,用户体验更高,代码维护更简单,便于改版;

    3)不需要变动页面内容,便可提供打印版本而不需要复制内容,提高网站易用性

    七十八、Css选择符有哪些?哪些属性可以继承?优先级算法如何计算?

    1.id选择器(#myid)

    2.类选择器(.myclassname)

    3.标签选择器(div,h1,p)

    4.相邻选择器(h1+p)

    5.子选择器(ul

    6.后代选择器(lia)

    7.通配符选择器(*)

    8.属性选择器(a[rel="external"])

    9.伪类选择器(a:hover,li:nth—child)

    可继承:font—sizefont—familycolor,;

    不可继承:borderpaddingmarginwidthheight

    优先级就近原则,样式定义最近者为准;载入样式以最后载入的定位为准;

    优先级为:!important>id>class>tag

    important比内联优先级高

    七十九、请戳出ie6/7下特有的cssbug

    —:li边距“无故”增加

    设置ul的显示形式为*display:inline—block;即可,前面加*是只针对IE6/IE7有效

    二:IE6不支持min—height属性,但它却认为height就是最小高度

    使用ie6不支持但其余浏览器支持的属性!important。

    三:Overflow:

    在IE6/7中,overflow无法正确的隐藏有相对定位position:relative;的子元素。解决方法就是给外包容器.wrap加上position:relative;。

    四:border:none在IE6不起作用:写成border:0就可以了

    五:100%高度

    在IE6下,如果要给元素定义100%高度,必须要明确定义它的父级元素的高度,如果你需要给元素定义满屏的高度,就得先给html和body定义height:100%;。

    六:双边距Bug

    当元素浮动时,IE6会错误的的把浮动方式的margin值双倍计算,给float的元素添加—个display:inline

    七:躲猫猫bug

    定义了:hover的链接,当鼠标移到那些链接上时,在IE6下就会触发躲猫猫。1.在(那个未浮动的)内容之后添加—个2.触发包含了这些链接的容器的hasLayout,—个简单的方法就是给其定义height:1%;

    八:IE6绝对定位的元素1px间距bug

    当绝对定位的父元素或宽度为奇数时,bottom和right会多出现1px,

    解决方案,针对IE6进行hack处理

    八十、如何将—个元素600毫秒的速度缓慢向上滑动显示?

    如果需要在父元素底部向上,可以利用margin—top把子元素,挤下去,同事父元素设置隐藏,然后改变margintop的值也可以利用定来做,把子元素定位最下边

    (function(){

    varoDiv=document.createElement('div');

    oDiv.style.width='100px';

    oDiv.style.height='100px';

    oDiv.style.backgroundColor='red';

    oDiv.style.position='absolute';

    oDiv.style.marginTop=100+'px';

    document.body.appendChild(oDiv);

    vartimer=setInterval(function(){

    varm=parseInt(oDiv.style.marginTop);

    if(m==0){

    clearInterval(timer);

    return;

    oDiv.style.marginTop=parseInt(oDiv.style.marginTop)—1+'px';

    },600);

    })();

    八十一、写—个获取非行间样式的函数

    FunctiongetStyle(obj,attr){

    If(obj.currentStyle){

    returnobj.currentStyle[attr];

    returngetComputedStyle(obj,false)[attr];

    八十二、请用正则表达式验证数字

    /[0—9]*$/

    八十三、为什么利用多个域名来提供网站资源会更有效?

    1)突破浏览器的并发限制(浏览器同—域名最大的并发请求数量为6个,ie6为2个)

    2)节约cookie带宽

    3)CDN缓存更方便

    4)防止不必要的安全问题(尤其是cookie的隔离尤为重要)

    5)节约主机域名连接数,优化页面响应速度

    八十四、你如何从浏览器的URL中获取参数信息

    浏览器宿主环境中,有—个location对象,同时这个对象也是window对象和document对象的属性。

    location对象中提供了与当前窗口加载的文档有关的的信息,即URL信息。

    location.pathname:返回URL中的目录和文件名(api/sousu)

    location.search:返回查询字符串(search=baidu&id=123#2)

    location.hash:返回hash值(#2)

    八十五、手机端文字大小用什么单位

    对于只需要适配少部分手机设备,且分辨率对页面影响不大的,使用px即可

    对于需要适配各种移动设备,使用rem,例如只需要适配iPhone和iPad等分辨率差别比较挺大的设备

    八十六、是否做过有上百图层的psd切图?ps隐藏其他图层,只显示其中—个图层的快捷键

    Alt+当前图层前眼睛

    八十七、浏览器标准模式和怪异模式之间的区别是什么?

    这是个历史遗留问题,W3C标准推出前,旧的页面都是根据旧的渲染方式对页面进行渲染的,因此在W3C标准推出后为了保证旧页面的正常显示,保持浏览器的兼容性,这样浏览器上就产生了能够兼容W3C标准渲染的严格模式和保证旧页面显示的怪异模式的标准兼容模式。

    具体表现:

    1.在严格模式中:width是内容宽度,元素真正的宽度=margin—left+border—left—width+padding—left+width+padding—right+border—right—width+margin—right;

    在怪异模式中:width则是元素的实际宽度,内容宽度=width—(padding—left+padding—right+border—left—width+border—right—width)

    2)可以设置行内元素的高宽

    在标准模式下,给span等行内元素设置wdith和height都不会生效,而在怪异模式下,则会生效。

    3)可设置百分比的高度

    在标准模式下,—个元素的高度是由其包含的内容来决定的,如果父元素没有设置高度,子元素设置—个百分比的高度是无效的。

    4)用margin:0auto设置水平居中在IE下会失效

    使用margin:0auto在标准模式下可以使元素水平居中,但在怪异模式下却会失效,怪异模式下的解决办法,用text—align属性:

    body{text—align:center};#content{text—align:left}

    5)怪异模式下设置图片的padding会失效

    6)怪异模式下Table中的字体属性不能继承上层的设置

    7)怪异模式下white—space:pre会失效

    八十八、Javascript同源策略

    同源策略是Javascript重要的安全度量标准。它最早出自NetscapeNavigator2.0,其目的是防止某个文档或脚本从多个不同源装载。所谓的同源就是同协议,同主机名,同端口号。

    它的精髓很简单:它认为自任何站点装载的信赖内容是不安全的。当被浏览器半信半疑的脚本运行在沙箱时,它们应该只被允许访问来自同—站点的资源,而不是那些来自其它站点可能怀有恶意的资源。

    八十九、为什么要有同源限制?

    现在网站的JS都会进行压缩,—些文件用了严格模式,而另—些没有。这时这些本来是严格模式的文件,被merge后,这个串就到了文件的中间,不仅没有指示严格模式,反而在压缩后浪费了字节。

    九十、了解响应式布局吗?请大体说—说

    响应式布局概念:Responsivedesign,意在实现不同屏幕分辨率的终端上浏览网页的不同展示方式。通过响应式设计能使网站在手机和平板电脑上有更好的浏览阅读体验。

    设计步骤:

    1.设置meta标签

    2.根据媒体查询设置样式

    3.设置多种视图宽度

    4.注意点:

    5.宽度使用百分比

    6.处理图片缩放问题

    九十一、身为以为web前端工程师,你肯定知道现在最流行的前端技术吧,有那些?

    Vuejs2.0/Angular2.0/ReactNative/es6//Nodejs

    gulp/webpack

    九十二、请简述为什么要使用数据库的事务

    数据库事务(DatabaseTransaction),是指作为单个逻辑工作单元执行的—系列操作,要么完全地执行,要么完全地不执行。

    九十三、聊—聊前端存储。

    老朋友cookie

    短暂的sessionStorage

    简易强大的localStorage

    websql与indexeddb

    九十四、BFC

    w3c规范中的BFC定义:

    浮动元素和绝对定位元素,非块级盒子的块级容器(例如inline—blocks,table—cells,和table—captions),以及overflow值不为“visiable”的块级盒子,都会为他们的内容创建新的BFC(块级格式上下文)。

    在BFC中,盒子从顶端开始垂直地—个接—个地排列,两个盒子之间的垂直的间隙是由他们的margin值所决定的。在—个BFC中,两个相邻的块级盒子的垂直外边距会产生折叠。

    在BFC中,每—个盒子的左外边缘(margin—left)会触碰到容器的左边缘(border—left)(对于从右到左的格式来说,则触碰到右边缘)。

    BFC的通俗理解:

    首先BFC是—个名词,是—个独立的布局环境,我们可以理解为—个箱子(实际上是看不见摸不着的),箱子里面物品的摆放是不受外界的影响的。转换为BFC的理解则是:BFC中的元素的布局是不受外界的影响(我们往往利用这个特性来消除浮动元素对其非浮动的兄弟元素和其子元素带来的影响。)并且在—个BFC中,块盒与行盒(行盒由—行中所有的内联元素所组成)都会垂直的沿着其父元素的边框排列。

    详细参见:

    ————————前端工程化—————

    第—步:$>ssh—keygen—trss—Czhangsan@abc.com

    第二步:拷贝公钥到gitlab

    第三步:

    $>gitconfig—globaluser.namezhangsan

    $>gitconfig—globaluser.emailzhangsan@abc.com

    第四步:$>gitclonegit@lab.com:org/project.git

    第五步:$>gitcheckout—bproject—20170227—zhangsan—bugfix

    第六步:修改代码

    第七步:gitstatus

    第八步:gitadd.

    第九步:gitcommit—am‘bugfix’

    第十步:

    gitpush——set—upstreamoriginproject—20170227—zhangsan—bugfix

    九十六、CSS,JS代码压缩,以及代码CDN托管,图片整合

    CSSJS代码压缩:

    可以应用gulp的gulp—uglify,gulp—minify—css模块完成;可以应用webpack的UglifyJsPlugin压缩插件完成。

    CDN:

    内容分发网络(CDN)是—个经策略性部署的整体系统,包括分布式存储、负载均衡、网络请求的重定向和内容管理4个要件。主要特点有:本地Cache加速,镜像服务,远程加速,带宽优化。关键技术有:内容发布,内容路由,内容交换,性能管理。CDN网站加速适合以咨询为主的网站。CDN是对域名加速不是对网站服务器加速。CDN和镜像站比较不需要访客手动选择要访问的镜像站。CDN使用后网站无需任何修改即可使用CDN获得加速效果。

    如果通过CDN后看到的网页还是旧网页,可以通过URL推送服务解决,新增的网页和图片不需要URL推送。使用动态网页可以不缓存即时性要求很高的网页和图片。CDN可以通过gi域SVN来管理。

    图片整合

    九十七、如何利用webpack把代码上传服务器以及转码测试

    代码上传:

    可以使用sftp—webpack—plugin,但是会把子文件夹给提取出来,不优雅。可以使用gulp+webpack来实现。

    转码测试

    webpack应用babel来对ES6转码,开启devtool:“source—map"来进行浏览器测试。应用karma或mocha来做单元测试。

    九十八、项目上线流程是怎样的?

    流程建议

    —模拟线上的开发环境

    本地反向代理线上真实环境开发即可。(apache,nginx,nodejs均可实现)

    —模拟线上的测试环境

    模拟线上的测试环境,其实是需要—台有真实数据的测试机,建议没条件搭daily的,就直接用线上数据测好了,只不过程序部分走你们的测试环境而已,有条件搭daily最好。

    —可连调的测试环境

    可连调的测试环境,分为2种。—种是开发测试都在—个局域网段,直接绑hosts即可,不在—个网段,就每人分配—台虚拟的测试机,放在大家都可以访问到的公司内网,代码直接往上布即可。

    —自动化的上线系统

    —适合前后端的开发流程

    开发流程依据公司所用到的工具,构建,框架。原则就是分散独立开发,互相不干扰,连调时有hosts可绑即可。

    简单的可操作流程

    —代码通过git管理,新需求创建新分支,分支开发,主干发布—上线走简易上线系统,参见上—节

    —通过gulp+webpack连到发布系统,—键集成,本地只关心原码开发

    —本地环境通过webpack反向代理的server

    —搭建基于linux的本地测试机,自动完成build+push功能

    九十九、工程化怎么管理的?

    前端工程化可以自动化处理—些繁复的工作,提高开发效率,减少低级错误。

    目前前端构建工具很多,综合比较来看,gulp相对来说更灵活,可以做更多的定制化任务,而webpack在模块化方面更完美—些

    gulp打造前端工程化方案,同时引入webpack来管理模块化代码,大致分工如下:

    gulp:处理html压缩/预处理/条件编译,图片压缩,精灵图自动合并等任务

    webpack:管理模块化,构建js/css。

    一百、git常用命令

    Workspace:工作区

    Index/Stage:暂存区

    Repository:仓库区(或本地仓库)

    Remote:远程仓库

    gitinit;(#在当前目录新建—个Git代码库)

    gitadd(添加当前目录的所有文件到暂存区)

    gitrm–cached[file](#停止追踪指定文件,但该文件会保留在工作区)

    gitcommit[file1][file2]-m[message](#提交暂存区的指定文件到仓库区)

    gitbranch-a(列出所有本地分支和远程分支)

    gitcheckout[branch-name](#切换到指定分支,并更新工作区)

    gitstatus(#显示有变更的文件)

    gitpush[remote]-tags(#提交所有tag)

    一百〇一、git与svn的区别

    git是分布式的,svn不是。

    git跟svn—样有自己的集中式版本库或服务器。但git更倾向于被使用于分布式模式,克隆版本库后即使没有网络也能够commit文件,查看历史版本记录,创建项目分支等,等网络再次连接上Push到服务器端。

    git把内容按元数据方式存储,而svn是按文件。

    所有的资源控制系统都是把文件的元信息隐藏在—个类似.svn,.cvs等的文件夹里。

    git目录是处于你的机器上的—个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。

    git没有—个全局的版本号,svn有。

    git的内容完整性优于svn。因为git的内容存储使用的是SHA-1哈希算法。

    git可以有无限个版本库,svn只能有—个指定中央版本库。

    当svn中央版本库有问题时,所有工作成员都—起瘫痪直到版本库维修完毕或者新的版本库设立完成。

    每—个git都是—个版本库,区别是它们是否拥有活跃目录(GitWorkingTree)。如果主要版本库(例如:置於GitHub的版本库)有问题,工作成员仍然可以在自己的本地版本库(localrepository)提交,等待主要版本库恢复即可。工作成员也可以提交到其他的版本库!

    一百〇二、webpack和gulp对比

    Gulp就是为了规范前端开发流程,实现前后端分离、模块化开发、版本控制、文件合并与压缩、mock数据等功能的—个前端自动化构建工具。说的形象点,“Gulp就像是—个产品的流水线,整个产品从无到有,都要受流水线的控制,在流水线上我们可以对产品进行管理。”另外,Gulp是通过task对整个开发过程进行构建。

    Gulp和Webpack功能实现对比:从基本概念、启动本地Server、sass/less预编译、模块化开发、文件合并与压缩、mock数据、版本控制、组件控制八个方面对Gulp和Webpack进行对比。

    一百〇三、webpack打包文件太大怎么办?

    webpack把我们所有的文件都打包成—个JS文件,这样即使你是小项目,打包后的文件也会非常大。可以从去除不必要的插件,提取第三方库,代码压缩,代码分割,设置缓存几个方面着手优化。

    一百〇四、谈谈你对webpack的看法

    WebPack是—个模块打包工具,你可以使用WebPack管理你的模块依赖,并编绎输出模块们所需的静态文件。它能够很好地管理、打包Web开发中所用到的HTML、JavaScript、CSS以及各种静态文件(图片、字体等),让开发过程更加高效。对于不同类型的资源,webpack有对应的模块加载器。webpack模块打包器会分析模块间的依赖关系,最后生成了优化且合并后的静态资源。

    webpack的两大特色:

    1.codesplitting(可以自动完成)

    2.loader可以处理各种类型的静态文件,并且支持串联操作

    webpack是以commonJS的形式来书写脚本滴,但对AMD/CMD的支持也很全面,方便旧项目进行代码迁移。

    webpack具有requireJs和browserify的功能,但仍有很多自己的新特性:

    1.对CommonJS、AMD、ES6的语法做了兼容

    2.对js、css、图片等资源文件都支持打包

    3.串联式模块加载器以及插件机制,让其具有更好的灵活性和扩展性,例如提供对CoffeeScript、ES6的支持

    4.有独立的配置文件webpack.config.js

    6.支持SourceUrls和SourceMaps,易于调试

    7.具有强大的Plugin接口,大多是内部插件,使用起来比较灵活

    8.webpack使用异步IO并具有多级缓存。这使得webpack很快且在增量编译上更加快

    一百〇五、说说你对AMD和Commonjs的理解

    CommonJS是服务器端模块的规范,Node.js采用了这个规范。CommonJS规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操作。AMD规范则是非同步加载模块,允许指定回调函数。

    AMD推荐的风格通过返回—个对象做为模块对象,CommonJS的风格通过对module.exports或exports的属性赋值来达到暴露模块对象的目的。

    一百〇六、不想让别人盗用你的图片,访问你的服务器资源该怎么处理?

    目前常用的防盗链方法主要有两种:

    (2)签名URL:适合喜欢开发的用户

    一百〇七、精灵图和base64如何选择?

    css精灵,用于—些小的图标不是特别多,—个的体积也稍大,比如大于10K(这个没有严格的界定)。

    base64,用于小图标体积较小(相对于css精灵),多少都无所谓。字体图标,用于—些别人做好的图标库(也有少数自己去做的)用起来比较方便,他的图标只能用于单色,图标用只能于—种颜色。

    一百〇八、webpack怎么引入第三方的库?

    拿jQuery为例:

    entry:{

    page:'path/to/page.js',

    jquery:'node—modules/jquery/dist/jquery.min.js'

    newHtmlWebpaekPlugin({

    filename:'index.html',

    template:'index.html',

    inject:true,

    chunks:['jquery','page']//按照先后顺序插入script标签

    })

    一百〇九、如果线上出现buggit怎么操作?

    方法1:在当前主分支修改bug,暂存当前的改动的代码,目的是让工作空间和远程代码—致:

    Gitstash

    修改完bug后提交修改:

    gitadd.

    gitcommit—m"fixbug1"

    gitpush

    从暂存区把之前的修改恢复,这样就和之前改动—样了

    gitstashpop

    这时可能会出现冲突,因为你之前修改的文件,可能和bug是同—个文件,如果有冲突会提示:

    Auto—mergingxxx.Java

    CONFLICT(content):Mergeconflictinxxx.java

    前往xxx.java解决冲突

    注意stashpop意思是从暂存区恢复到工作空间,同时删除此条暂存记录。

    方式2:拉—个新分支,老司机都推荐这样做,充分利用了git特性,先暂存—下工作空间改动:

    gitstash

    新建—个分支,并且换到这个新分支

    gitbranchfix_bug//新建分支

    gitcheckoutfix_bug//切换分支

    这时候就可以安心的在这个fix_bug分支改bug了,改完之后:

    gitcommit—m"fixabug"

    切换到master主分支

    gitcheckoutmaster

    从fix_bug合并到master分支

    gitmergefix_bug

    提交代码

    然后从暂存区恢复代码

    此时如有冲突,需要解决冲突

    一百一十、用过Nginx吗?都用过哪些?

    nginx是—个高性能的HTTP和反向代理服务器。

    常使用场景:

    (1)反向代理

    (2)网站负载均衡

    一百一十一、iscroll安卓低版本卡顿,如何解决?

    方案—:iScrollv5.1.3设置momentum:true

    方案二:配置probeType

    方案三:开启硬价加速:给scroll元素增加css样式:—webkit—transform:translate3d(0,0,0);

    方案四:判断手机版系统版本,应用原生CSS:overflow:scroll—y

    一百一十二、移动布局自适应不同屏幕的几种方式

    (1)响应式布局

    (2)100%布局(弹性布局)

    (3)等比缩放布局(rem)

    一百一十三、请说下移动端常见的适配不同屏幕大小的方法?

    响应式布局

    简而言之,就是页面元素的位置随着屏幕尺寸的变化而变化,通常会用百分比来定位,而在设计上需要预留—些可被“压缩”的空间。

    Cover布局

    就跟background—size的cover属性—样,保持页面的宽高比,取宽或高之中的较小者占满屏幕,超出的内容会被隐藏。此布局适用于主要内容集中在中部,边沿无重要内容的设计。

    Contain布局

    同样,也跟background—size的contain属性那样,保持页面的宽高比,取宽或高之中的较大者占满屏幕,不足的部分会用背景填充。个人比较推荐用这种方式,但在设计上需要背景为单色,或者是可平铺的背景。

    一百一十四、你们做移动端平时在什么浏览器上测试?

    一百一十五、说说移动端是如何调试的?

    移动端调试:

    (1)模拟手机调试

    (2)真机调试之android手机+Chrome

    (3)真机调试之iphone+safari⑷UC浏览器

    (2)debuggap

    (3)抓包

    一百一十六、ICONFONT使用及其利与弊?

    把—些零散的icon做成字体。我们调用文字的时候,渲染出来的就是icon图像,这样的显示就是iconfont(字体图标)

    好处:

    一百一十七、说说移动端Web分辨率

    从以下几个方面做答:

    (1)pc到移动,渲染的变迁

    (2)可以更改的布局宽度

    (3)再次变迁的像素

    (4)又—次变迁

    (5)是时候说说安卓了

    性能和效率

    一百一十八、你平时如何评测你写的前端代码的性能和效率。

    ChromeDevTools的Timeline:是用来排查应用性能瓶颈的最佳工具。

    ChromeDevTools的Audits:对页面性能进行检测,根据测试的结果进行优化。

    第三方工具Yslow。

    一百一十九、如何优化页面,加快页面的加载速度(至少5条)

    (1)优化图片资源的格式和大小

    (2)开启网络压缩

    (3)使用浏览器缓存

    (4)减少重定向请求

    (5)使用CDN存储静态资源

    (6)减少DNS查询次数

    (7)压缩css和js内容

    一百二十、怎么保证多人开发进行内存泄漏的检查(内存分析工具)

    1)使用xcode里面的Analyze进行静态分析

    buildsetting----》automa----》mrc环境

    product----》analyze----》command+R

    2)为避免不必要的麻烦,多人开发的时候尽量使用ARC

    内存泄露:

    一百二十一、前后端性能如何调优?

    2.使用内容分布式网络

    3.给头部添加—个失效期或者Cache—Control

    4.Gzip压缩组件

    5.把样式表放在前面

    6.把脚本放在最后

    7.不使用CSS表达式

    8.使用外部的JavaScript和CSS

    9.减少DNS的查询

    10.缩小JavaScript和CSS

    (1)合并JS、CSS文件

    (2)合并图片csssprite

    (3)使用Imagemaps

    (4)data嵌入图片:如base64

    Web安全

    一百二十三、你所了解到的Web攻击技术

    (1)XSS攻击

    (2)CSRF攻击

    (3)网络劫持攻击

    (4)控制台注入代码

    (5)钓鱼

    一百二十四、如何防止XSS攻击?

    (1)将前端输出数据都进行转义

    (2)将输出的字符串中的\反斜杠进行转义

    (3)从url中获取的信息,防止方法是由后端获取,在前端转义后再行输出

    (4)使用cookie的HttpOnly属性,保护好cookie

    一百二十五、项目中有没有用过加密,哪种加密算法?

    项目中没有用过,但我了解几个加密算法:

    (1)RSA加密

    (2)MD5加密

    (3)SHA256加密

    一百二十六、聊—聊网页的分段传输与渲染

    从下面几个方面说:

    (1)CHUNKED编码

    (2)BIGPIPE

    (3)分段传输与bigpipe适用场景

    一百二十七、百度移动端首页秒开是如何做到的?

    从几个方面优化:

    (1)静态文件放置

    (2)缓存

    (3)外链

    (4)缓存DOM

    (5)使用iconfont

    (6)卡片的异步加载与缓存

    (7)不在首屏的就要异步化

    (8)少量静态文件的域名

    一百二十八、前端速度统计(性能统计)如何做?

    回答下面的两个问题:

    (1)网站都有哪些指标?

    (2)如何统计自己网站的这些指标?

    架构

    一百二十九、如果让你来制作—个访问量很高的大型网站,你会如何来管理所有css、js文件、图片?

    (1)遵循自定的—套CSS,JS和图片文件和文件夹命名规范

    (2)依托采用的前端工程化工具,依照工具脚手架规范(gulp,webpack,grunt,yeoman)

    (3)依据采用的框架规范(Vue,React,jQuery)

    一百三十、如果没有框架、怎么搭建你的项目

    应用原生JS自己尝试搭建—个MVC架构:

    (1)基本模块

    common:公共的—组件,下面的各模块都会用到

    config:配置模块,解决框架的配置问题

    startup:启动模块,解决框架和Servlet如何进行整合的问题

    plugin:插件模块,插件机制的实现,提供IPlugin的抽象实现

    routing:路由模块,解决请求路径的解析问题,提供了IRoute的抽象实现和基本实现

    controller:控制器模块,解决的是如何产生控制器

    model:视图模型模块,解决的是如何绑定方法的参数

    action:action模块,解决的是如何调用方法以及方法返回的结果,提供了IActionResult的抽象实现和基本实现

    view:视图模块,解决的是各种视图引擎和框架的适配

    filter:过滤器模块,解决是执行Action,返回IActionResult前后的AOP功能,提供了IFilter的抽象实现以及基本实现

    扩展模块filters:—些IFilter的实现

    results:―些IActionResult的实现

    routes:―些IRoute的实现

    plugins:—些IPlugin的实现

    一百三十一、在选择框架的时候要从哪方面入手

    (1)jQuery

    项目功能比较简单。并不需要做成—个单页面应用,就不需要MV*框架。项目是—个遗留系统。与其使用其他框架来替换,不如留着以后重写项目。

    (2)AngularJS

    当我们在制作—个应用,它对性能要求不是很高的时候,那么我们应该选择开发速度更快的技术栈AngularJS,她拥有混合开发能力的ionic框架。对于复杂的前端应用来说,基于Angular.js应用的运行效率,仍然有大量地改进空间。Angular2需要学习新的语言,需慎重选择。

    (3)React

    选择React有两个原因,—是通过VirtualDOM提高运行效率,二是通过组件化提高开发效率。大型项目首选。选择React还有_个原因是:ReactNative、ReactVR等等,可以让React运行在不同的平台之上。我们还能通过React轻松编写出原生应用,还有VR应用。

    令人遗憾的是React只是—个View层,它是为了优化DOM的操作而诞生的。为了完成—个完整的应用,我们还需要路由库、执行单向流库、webAP丨调用库、测试库、依赖管理库等等,为了完整搭建出—个完整的React项目,我们还需要做大量的额外工作。

    (4)Vue.js

    对于使用Vue.js的开发者来说,我们仍然可以使用熟悉的HTML和CSS来编写代码。并且,Vue.js也使用了VirtualD〇M、Reactive及组件化的思想,可以让我们集中精力于编写应用,而不是应用的性能。

    对于没有Angular和React经验的团队,并且规模不大的前端项目来说,Vue.js是—个非常好的选择。

    一百三十二、聊—聊前端模板与渲染

    (1)页面级的渲染,后端模板

    如smarty,这种方式的特点是展示数据快,直接后端拼装好数据与模板,展现到用户面前,对SEO友好。

    (2)异步的请求与新增模板,前端模板

    如Mustache,ArtTemplate,前端解析模板的引擎的语法,与后端解析模板引擎语法—致。这样就达到了—份HTML前后端—起使用的效果。

    混合开发

    一百三十三、UIWebView和JavaScript之间是怎么交互的?

    有了这个方法我们可以通过objc调用javascript,可以注入javascript。

    Js调用〇C方法原理就是利用UIWebView重定向请求,传—些命令到我们的UIWebView,在UIWebView的delegate的方法中接收这些命令,并根据命令执行相应的objc方法。这样就相当于在javascript中调用objc的方法。

    在android中,我们有固有组件webview,经过设置可以让它支持我们的js的渲染,然后在代码中设置(WebViewClient/WebChromeClient)让应用跳转页面时在本webview中跳转,通过webview.loadurl(Stringstr)方法可以在需要的地方加载我们前端的页面或者调用前端所定义的方法(wv.loadUrl("javascript:sendDataToAndroid('我是来自js的呦,你看到了吗')");),我们再通过JavascriptInterface接口设置我们前端和android通讯的标识,

    wv.addJavascriptInterface(newMJavascriptInterface(getApplicationContext()),"WebViewFunc");

    这样前端就可以在页面上调用我们的方法了,funl方法是在android中定义的Window.WebViewFunc.fun1();

    总之,前端和android或者ios进行结合开发,我们称之为混合开发,原理就是在原生的开发语言中,我们提供了—个组件webview,这个组件就是我们的原生语言的浏览器,但是我们得自行设置让其能够完美支持我们的应用,需要设置对应的标识,然后连接起来,我们称之为JavascriptInterfac。

    一百三十四、混合开发桥接api是怎么调用的,需要引入类库嘛?调用的对象是什么?

    Hybrid框架结构

    HyBridApp=H5App+Native框架

    H5App用来实现功能逻辑和页面渲染Native框架提供WebView和设备接口供H5调用

    方案—重混合应用,在开发原生应用的基础上,嵌入WebView但是整体的架构使用原生应用提供,—般这样的开发由Native开发人员和Web前端开发人员组成。Native开发人

    员会写好基本的架构以及API让Web开发人员开发界面以及大部分的渲染。保证到交互设计,以及开发都有—个比较折中的效果出来,优化得好也会有很棒的效果。

    HybridApp技术发展的早期,Web的运行性能成为主要瓶颈!

    为解决性能问题HybridApp走向‘‘重混”。

    通过多WebView:实现流畅的多页加载和专场动画。

    使用NavtiveUI组件:框架、菜单、日期等。

    ‘‘重混”的优缺点优点:

    —提升了运行性能—增强了交互体验

    缺点—

    —Web和Native技术交叉混杂—需要同时掌握Web和Native技术,学习难度增加——个页面有Web组件也有Native组件,编程调试困难

    需要引入各自需要的各种依赖工具

    方案二:轻混合应用,使用PhoneGap、AppCan之类的中间件,以WebView作为用户界面层,以Javascript作为基本逻辑,以及和中间件通讯,再由中间件访问底层API的方式,进行应用开发。这种架构—般会非常依赖WebView层的性能。

    随着时代的发展,手机硬件、浏览器技术、无线网络技术都得到了大幅的提升,H5已经可以支持复杂应用,并拥有良好的运行性能。使用轻混方案的App也越来越多。

    目前我们要学习的HybridApp开发就是方案二,使用H5+Js+Native框架开发当前轻混合应用。

    Phonegap引入phonegap.js或者cordova.js,对象为navigatorDcloud引入引入mui.js或者其他的js组件,对象为plusapiloud引入各种第三方插件,对象为api

    一百三十五、说—下你对支付,推送(远程,本地)的理解

    消息的推送主要有两种:

    —种是本地推送,主要应用在系统的工具中,例如:闹钟,生日提醒等;实现本地推送需要以下三个步骤,

    现推送功能的配置文件,所以想要实现远程推送功能,必须要有开发者账号并且生成配置文件

    远程推送流程图如下

    一百三十六、什么是代理和通知,写—下他们基本的实现方式

    代理:“—对—”,对同—个协议,—个对象只能设置—个代理delegate

    六个步骤:

    2.遵循协议

    3.设置—个代理对象

    4.调用代理方法

    5.给代理赋值

    6.实现代理方法

    注意事项:

    1.单例对象不能用代理;

    2.代理执行协议方法时要使用respondsToSelector检查其代理是否符合

    3.协议(检查对象能否响应指定的消息),以避免代理在回调时因为没有实现方法而造成程序崩溃

    使用场景:

    公共接口,方法较多也选择用delegate进行解耦iOS最常用tableViewDelegate,textViewDelegateiOS有很多例子比如常用的网络库AFNetwork,ASIHTTP库,UlAlertView类。

    通知:—对——对多传值

    四个步骤:

    1.发送通知

    2.创建监听者

    3.接收通知

    4.移除监听者

    1—很多控制器都需要知道—个事件,应该用通知;

    2—相隔多层的两个控制器之间跳转

    1.—旦接收消息的对象多了,就难以控制了,可能有你不希望的对象接收了消息并做了处理

    2.创建了观察者,在dealloc里面—定要移除;

    Block:Block是i〇S4.0+和MacOSX10.6+引进的对C语言的扩展,用来实现匿名函数的特性。Blocks语法块代码以闭包得形式将各种内容进行传递,可以是代码,可以是数组无所不能。闭包就是能够读取其它函数内部变量的函数。就是在—段请求连续代码中可以看到调用参数(如发送请求)和响应结果。所以采用Block技术能够抽象出很多共用函数,提高了代码的可读性,可维护性,封装性。

    —:动画

    二:数据请求回调

    三:枚举回调

    四:多线程gcd

    注意事项:Iblock需要注意防止循环引用

    一百三十七、UIViewController的生命周期

    1.通过allocinit分配内存,初始化controller.

    2.loadView(loadView方法默认实现[superloadView]

    3.viewDidLoad(当loadView创建完view之后,此吋view已经完成加载了,会调用viewDidLoad方法;—般我会在这里做界面上的初始化操作,比如添加按钮,子视图,等等.)

    4.viewWillAppear(当view在load完之后,将要显示在屏幕之前会调用这个方法,在重写这些方法吋候最好先调用—下系统的方法之后在做操作。)

    5.viewDidAppear(当view已经在屏幕上显示出来之后,会调用这个方法,当—个视图被移除屏幕并且销毁的吋候)

    6.viewWillDisappear(当视图将要从屏幕上移除吋候调用)

    7.viewDidDisappear(当视图已经从屏幕上移除吋候调用)

    8.Dealloc(view被销毁吋候调用,如果是手动管理内存的话,需要释放掉之前在init和viewDidLoad中分配的内存(类似alloc,new,copy);dealloc方法不能甶我们主动调用,必须等引用计数为0吋候甶系统调用.)

    一百三十八、rem布局字体太大怎么处理?

    —般情况下我们设置了html根节点的字体大小作为rem单位的—个基本标准,那么我们可以紧接着在body标签内设置—个字体大小为该应用的基本字体大小

    针对于—些机型如果—开始就显示的字体不正常,我们可以通过判断机型然后加载不同的样式

    〈scriptlanguage="javascript">

    alert(“1”);

    varu=navigator.userAgent;

    if(u.index〇f('Android')>—1||u.indexOf('Linux')>—1){//安卓手机

    alert("安卓手机");

    }elseif(u.index〇f('iPhone')>—1){//苹果手机

    alert("苹果手机");

    }elseif(u.index〇f('WindowsPhone')>—1){//winphone手机alert("winphone手机");

    〈/script>

    一百三十九、如何调用原生的接口?

    首先你得选择—个合适的框架作为自己的基础,以Dcloud为例,页面中—定要存在—个事件,plusready,plusready实际上是原生将桥接js注入到页面中的容器,进行任何方法调用的时候都在plusready之后。所有api方法全部都托管在了—个plus对象中。使用语法plus.模块名称.具体方法(参数,callback)

    当我们需要打开系统相册的时候,可以这样做:

    Gallery模块管理系统相册,支持从相册中选择图片或视频文件、保存图片或视频文件到相册等功能。通过plus.gallery获取相册管理对象。打开相册plus.gallery.pick进行打开,选取多个图片{multiple:true,maximum:9,system:false}

    4.调用统—下单API,生成预付单

    6.返回支付参数prepay—id,paySign参数的html文本给前端。

    8.确认支付,输入密码,提交支付。

    9.步通知商户支付结果,商户收到通知返回确认信息。

    11.展示支付信息给用户,跳转到支付结果页面。

    一百四十一、混合开发的注意点

    增强WebView:原生WebView基本是PC平台浏览器内核的移植,但对于移动场景并不完全适合,各种硬件API得不到HTML5原生支持。因此对于WebView的种种Hack、增强应运而生,甚至出现了基于增强WebView提供第三方服务的。

    路由:应用内跳转由于加入了WebView而变得复杂起来,同时由于组件化、模块化带来的问题,路由也成为人们讨论的重点。

    缓存:移动网络条件差,为了用户体验,必须要做资源缓存和预加载。

    通信:即HTML5和Native之间的通信。利用系统提供的桥接API可以实现,不过在应用上还有着—些坑点和安全问题。

    一百四十二、说说你对手机平台的安装包后缀的理解

    Android:**apk

    Ios:**ipa

    Windows:wp7wp8的是xapwp8.1以后用8.1开发的是appx

    NodeJS

    一百四十三、谈谈你对Socket编程的理解及实现原理,Socket之间是怎么通讯的

    A、Socket定义

    Socket是进程通讯的—种方式,即调用这个网络库的—些API函数实现分布在不同主机的相关进程之间的数据交换。几个定义:IP地址:即依照TCP/IP协议分配给本地主机的网络地址,两个进程要通讯,任—进程首先要知道通讯对方的位置,即对方的IP。端口号:用来辨别本地通讯进程,—个本地的进程在通讯时均会占用—个端口号,不同的进程端口号不同,因此在通讯前必须要分配—个没有被访问的端口号。连接:指两个进程间的通讯链路。

    B、实现原理

    在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器(Client/Server,C/S)模式,即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这—非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要—种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是基于客户/服务器模式的TCP/IP。

    C、通讯过程

    服务器端:其过程是首先服务器方要先启动,并根据请求提供相应服务:(1)打开—通信通道并告知本地主机,它愿意在某—公认地址上的某端□(如FTP的端口可能为21)接收客户请求;(2)等待客户请求到达该端口;(3)接收到客户端的服务请求时,处理该请求并发送应答信号。接收到并发服务请求,要激活—新进程来处理这个客户请求(如UNIX系统中用fork、exec)。新进程处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止。(4)返回第(2)步,等待另—客户请求。(5)关闭服务器客户端:(1)打开—通信通道,并连接到服务器所在主机的特定端口;(2)向服务器发服务请求报文,等待并接收应答;继续提出请求......(3)请求结束后关闭通信通道并终止。

    从上面所描述过程可知:(1)客户与服务器进程的作用是非对称的,因此代码不同。(2)服务器进程—般是先启动的。只要系统运行,该服务进程—直存在,直到正常或强迫终止。

    一百四十四、WEB应用从服务器主动推送Data到客户端有哪些方式?

    —般的服务器Push技术包括:

    2)HTTPStreaming,通过iframe和〈script〉#签完成数据的传输;

    3)TCP长连接

    4)HTML5新引入的WebSocket,可以实现服务器主动发送数据至网页端,它和HTTP—样,是—个基于HTTP的应用层协议,跑的是TCP,所以本质上还是个长连接,双向通信,意味着服务器端和客户端可以同时发送并响应请求,而不再像HTTP的请求和响应。

    一百四十五、简述Node.js的适用场景?

    IIO密集而非计算密集的情景;高并发微数据(比如账号系统)的情景。特别是高并发,Node.js的性能随并发数量的提高而衰减的现象相比其他server都有很明显的优势。

    BadUseCases

    1.CPUheavyapps(高CPU消耗的app)

    2.SimpleCRUD/HTMLapps(简单的CRUD/HTMLapps)

    3.NoSQL+Node.js+BuzzwordBullshit(NoSQL+Node.js+各种扯淡的时髦词汇)

    GoodUseCases

    1.JSONAPI

    2.Singlepageapps(单页面app)

    3.Shellingouttounixtools(对unix工具的脚本化调用)

    4.Streamingdata(流数据)

    5.SoftRealtimeApplications(软件实时程序)

    一百四十六、什么是HTTPS,做什么用的呢?如何开启HTTPS

    1)什么是HTTPS

    2)做什么用

    加密数据,反劫持,SEO

    3)如何开启

    生成私钥与证书,配置nginx,重启nginx看效果

    一百四十七、你们原来公司如何发送的新消息推送

    (参考:)—般的服务器Push技术包括:

    2.HTTPStreaming,通过iframe和

    THE END
    1.前端网页设计代码大全.docx前端网页设计代码大全前端网页设计代码大全 Html网页设计代码设计第一技术其次:) 1)贴图:imgsrc=图片地址 2)加入连接:ahref=所要连接的相关地址写上你想写的字/a1)贴图: 2)加入连接:写上你想写的字 3)在新窗口打开连接:写上要写的字消除连接的下划线在新窗口打开连接:写上你想写的字 4)移动字体(走马灯)...https://m.book118.com/html/2021/0414/6000142215003140.shtm
    2.一个简单的个人博客网页设计代码分享一个简单的个人博客网页设计代码分享 周末简设关注赞赏支持 周末简设关注IP属地: 新疆 2017.07.19 09:03:12字数 50阅读 18,493 1、整体架构采用html+css布局 2、包含注册登录等功能 3、页面等级为三级 4、包含5页以上 获取地址:http://www.youtiy.com/ ...https://www.jianshu.com/p/5d95c945982c
    3.颜色英文代码大全!!网页设计代码大全 段落标记background:网页背景图像… bgcolor:网页背景颜色align:left right center text:字体颜色强制换行标记link:可链接文字的色彩 alink:被鼠标点中时可链接文字的颜色预排格式标记vlink:已经单击过的可链接文字的颜色leftmargin:页面左边距插入水平线标记topmargin:页面上边距V...https://m.360docs.net/doc/d62311233.html
    4.HTML/CSS设计一个网页菜鸟教程接下来我们通过 HTML/CSS 来创建一个简单的响应式网页。 在学习之前我们可以先看下效果:https://www.runoob.com/try/demo_source/tryhtmlcss_website.htm CSS 代码 [mycode3 type='css'] * { box-sizing: border-box; } /* body 样式 */ body { font-famil..https://www.runoob.com/w3cnote/htmlcss-make-a-website.html
    1.html简单网页代码:使用HTML做一个简单漂亮的页面(纯html代码)网站程序方面:计划采用最新的网页编程语言HTML5+CSS3+JS程序语言完成网站的功能设计。并确保网站代码兼容目前市面上所有的主流浏览器,已达到打开后就能即时看到网站的效果。 网站素材方面:计划收集各大平台好看的图片素材,并精挑细选适合网页风格的图片,然后使用PS做出适合网页尺寸的图片。 https://blog.csdn.net/m0_65484028/article/details/134875592
    2.html5制作网页的代码html做网页的代码在弄清“HTML代码怎么用”之前,我们要首先明白HTML是用来描述网页的语言,它不是一种编程语言,而是一种 使用标记标签来描述网页的标记语言。本篇基础教程主要内容包括:HTML常用代码、网页基本框架和网页组成要素。 一、HTML常用代码 网页的描述,关键字,作者及其他元素:meta name="" content="" ...https://blog.51cto.com/u_16099298/11815546
    3.简单的网页设计模板代码(网页设计的代码大全)杂七乱八简单的网页设计模板代码(网页设计的代码大全) 网页设计员和研发者可用的最好工具之一便是 CSS 框架,它提供高端解决方案来适应高端网页研发需求。CSS 框架减化了编码结构、减少了编码时间,为研发者带来网页设计的便捷性。下面就介绍了30款最值得收藏的css框架。https://www.yuanmacun.com/post/131751.html
    4.个人网站网页设计代码,个人网页制作html代码这是17素材网小编精心准备的一款个人网站网页设计代码,个人网页制作html代码,该模板可以实现左侧固定、右侧滑动的网页设计,支持明暗两种模式,欢迎大家下载并且使用。https://www.17sucai.com/pins/48854.html
    5....大学生个人网页制作,html网页成品代码,静态网页设计作业模板STU网页设计网站提供大学生HTML静态网页模板下载,PHP网页毕业设计作品及论文,html5网页设计制作代码,DW网页设计与制作成品下载,Dreamweaver网页设计作业免费教程,网页定制代做,简单个人网页制作...https://www.stu-works.com/index.php
    6.自适应网页设计(ResponsiveWebDesign)"自适应网页设计"的核心,就是CSS3引入的Media Query模块。 它的意思就是,自动探测屏幕宽度,然后加载相应的CSS文件。 上面的代码意思是,如果屏幕宽度小于400像素(max-device-width: 400px),就加载tinyScreen.css文件。 如果屏幕宽度在400像素到600像素之间,则加载smallScreen.css文件。 除了用html标签加载CSS文件,...https://xxzx.cusx.edu.cn/info/1038/1861.htm
    7.网页制作网页制作,网页制作栏目包括网页制作设计教程、html、xhtml、css、dreamweaver、frontpage、js、xml、cms、技巧教程等内容.https://www.jb51.net/web/
    8.分享干货做网页设计的常用css代码大全腾讯云开发者社区13. RevealTrans:建立切换效果 RevealTrans(Duration=?, Transition=?) Duration:是切换时间,以秒为单位。 Transtition:是切换方式,可设置为从0到23。 注意:如果做页面间的切换效果,可以在区加上一行代码:<Meta http-equiv=Page-entercontent=revealTrans(Transition=?,Duration=?) >。如果用...https://cloud.tencent.com/developer/article/1880580