webSocket 如何兼容低版本浏览器?

1. Adobe Flash Socket
2. ActiveX HTMLFile (IE)
3. 基于 multipart 编码发送 XHR
4. 基于长轮询的 XHR

页面可见性(Page Visibility API) 可以有哪些用途?

这个新的 API 的意义在于,通过监听网页的可见性,可以预判网页的卸载,还可以用来节省资源,减缓电能的消耗。比如,一旦用户
不看网页,下面这些网页行为都是可以暂停的。
1. 对服务器的轮询
2. 网页动画
3. 正在播放的音频或视频
详细资料可以参考:
《Page Visibility API 教程》

实现不使用 border 画出 1 px 高的线,在不同浏览器的标准模式与怪异模式下都能保持一致的效果。

<div style="height:1px;overflow:hidden;background:red"></div>

title 与 h1 的区别?

title 属性没有明确意义只表示是个标题,h1 则表示层次明确的标题,对页面信息的抓取也有很大的影响。

<img> 的 title 和 alt 有什么区别?

  1. title 通常当鼠标滑动到元素上的时候显示
  2. alt 是 img 的特有属性,是图片内容的等价描述,用于图片无法加载时显示、读屏器阅读图片。可提图片高可访问性,除了纯装饰图片外都必须设置有意义的值,搜索引擎会重点分析。

Canvas 和 SVG 有什么区别?

  1. Canvas 是一种通过 JavaScript 来绘制 2D 图形的方法。Canvas 是逐像素来进行渲染的,因此当我们对 Canvas 进行缩放时,会出现锯齿或者失真的情况。
  2. SVG 是一种使用 XML 描述 2D 图形的语言。SVG 基于 XML,这意味着 SVG DOM 中的每个元素都是可用的。我们可以为某个元素
    附加 JavaScript 事件监听函数。并且 SVG 保存的是图形的绘制方法,因此当 SVG 图形缩放时并不会失真。
    详细资料可以参考:
    《SVG 与 HTML5 的 canvas 各有什么优点,哪个更有前途?》

网页验证码是干嘛的,是为了解决什么安全问题?

  1. 区分用户是计算机还是人的公共全自动程序。可以防止恶意破解密码、刷票、论坛灌水
  2. 有效防止黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试

渐进增强和优雅降级的定义

  1. 渐进增强:针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进优化
  2. 优雅降级:一开始就根据高版本浏览器构建完整的功能,然后再针对低版本浏览器进行兼容。

html 中attribute 和 property 的区别是什么?

  1. attribute 是 dom 元素在文档中作为 html 标签拥有的属性;
  2. property 就是 dom 元素在 js 中作为对象拥有的属性。
    对于 html 的标准属性来说,attribute 和 property 是同步的,是会自动更新的,
    但是对于自定义的属性来说,他们是不同步的。

对 web 标准、可用性、可访问性的理解

  1. 可用性(Usability):产品是否容易上手,用户能否完成任务,效率如何,以及这过程中用户的主观感受可好,是从用户的角度来看产品的质量。可用性好意味着产品质量高,是企业的核心竞争力
    1. 可访问性(Accessibility):Web 内容对于残障用户的可阅读和可理解性
    2. 可维护性(Maintainability):一般包含两个层次,一是当系统出现问题时,快速定位并解决问题的成本,成本低则可维护性好。
      二是代码是否容易被人理解,是否容易修改和增强功能。

IE 各版本和 Chrome 可以并行下载多少个资源?

  1. IE6 2 个并发
  2. iE7 升级之后的 6 个并发,之后版本也是 6 个
  3. Firefox,chrome 也是6个

怎么重构页面?

(1) 编写 CSS
(2) 让页面结构更合理化,提升用户体验
(3) 实现良好的页面效果和提升性能

浏览器架构

* 用户界面
* 主进程
* 内核
* 渲染引擎
* JS 引擎
* 执行栈
* 事件触发线程
* 消息队列
* 微任务
* 宏任务
* 网络异步线程
* 定时器线程

常用的 meta 标签

<meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。
<meta> 标签位于文档的头部,不包含任何内容。<meta> 标签的属性定义了与文档相关联的名称/值对。

<!DOCTYPE html> H5标准声明,使用 HTML5 doctype,不区分大小写
<head lang="en"> 标准的 lang 属性写法
<meta charset="utf-8"> 声明文档使用的字符编码
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> 优先使用 IE 最新版本和 Chrome
<meta name="description" content="不超过150个字符"/> 页面描述
<meta name="keywords" content=""/> 页面关键词者
<meta name="author" content="name, email@gmail.com"/> 网页作
<meta name="robots" content="index,follow"/> 搜索引擎抓取
<meta name="viewport" content="initial-scale=1, maximum-scale=3, minimum-scale=1, user-scalable=no"> 为移动设备添加 viewport
<meta name="apple-mobile-web-app-title" content="标题"> iOS 设备 begin
<meta name="apple-mobile-web-app-capable" content="yes"/> 添加到主屏后的标题(iOS 6 新增)
是否启用 WebApp 全屏模式,删除苹果默认的工具栏和菜单栏
<meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">
添加智能 App 广告条 Smart App Banner(iOS 6+ Safari)
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
<meta name="format-detection" content="telphone=no, email=no"/> 设置苹果工具栏颜色
<meta name="renderer" content="webkit"> 启用360浏览器的极速模式(webkit)
<meta http-equiv="X-UA-Compatible" content="IE=edge"> 避免IE使用兼容模式
<meta http-equiv="Cache-Control" content="no-siteapp" /> 不让百度转码
<meta name="HandheldFriendly" content="true"> 针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓
<meta name="MobileOptimized" content="320"> 微软的老式浏览器
<meta name="screen-orientation" content="portrait"> uc强制竖屏
<meta name="x5-orientation" content="portrait"> QQ强制竖屏
<meta name="full-screen" content="yes"> UC强制全屏
<meta name="x5-fullscreen" content="true"> QQ强制全屏
<meta name="browsermode" content="application"> UC应用模式
<meta name="x5-page-mode" content="app"> QQ应用模式
<meta name="msapplication-tap-highlight" content="no"> windows phone 点击无高光
设置页面不缓存
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">

详细资料可以参考:
《Meta 标签用法大全》

css reset 和 normalize.css 有什么区别?

为什么会有 CSS Reset 的存在呢?那是因为早期的浏览器支持和理解的 CSS 规范不同,导致渲染页面时效果不一致,会出现很多
兼容性问题。
reset 的目的,是将所有的浏览器的自带样式重置掉,这样更易于保持各浏览器渲染的一致性。
normalize 的理念则是尽量保留浏览器的默认样式,不进行太多的重置,而尽力让这些样式保持一致并尽可能与现代标准相符合。reset 是最早的一种解决浏览器间样式不兼容问题的方案,它的基本思想是将浏览器的所有样式都重置掉,从而达到所有浏览器
样式保持一致的效果。但是使用这种方法,可能会带来一些性能上的问题,并且对于一些元素的不必要的样式的重置,其实反而会造成
画蛇添足的效果。
后面出现一种更好的解决浏览器间样式不兼容的方法,就是 normalize.css ,它的思想是尽量的保留浏览器自带的样式,通过在原
有的样式的基础上进行调整,来保持各个浏览器间的样式表现一致。相对与 css reset,normalize.css 的方法保留了有价值的默
认值,并且修复了一些浏览器的 bug,而且使用 normalize.css 不会造成元素复杂的继承链。
详细资料可以参考:
《关于CSS Reset 那些事(一)之 历史演变与 Normalize.css》
《Normalize.css 和 Reset CSS 有什么本质区别没?》

用于预格式化文本的标签是?

预格式化就是保留文字在源码中的格式 最后显示出来样式与源码中的样式一致 所见即所得。

<pre> 定义预格式文本,保持文本原有的格式

head 标签中必不少的是?

<head> 标签用于定义文档的头部,它是所有头部元素的容器。<head> 中的元素可以引用脚本、指示浏览器在哪里找到样式表、提供
元信息等等。

文档的头部描述了文档的各种属性和信息,包括文档的标题、在 Web 中的位置以及和其他文档的关系等。绝大多数文档头部包含的数
据都不会真正作为内容显示给读者。

下面这些标签可用在 head 部分:<base>, <link>, <meta>, <script>, <style>, 以及 <title>。

<title> 定义文档的标题,它是 head 部分中唯一必需的元素。

HTML5 新增的表单元素有?

datalist 规定输入域的选项列表,通过 option 创建! 

keygen 提供一种验证用户的可靠方法,密钥对生成器,私钥存于客户端,公钥发到服务器,用于之后验证客户端证书!

output 元素用于不同类型的输出!

在 HTML5 中,哪个方法用于获得用户的当前位置?

getCurrentPosition()

文档的不同注释方式?

  1. HTML 的注释方法
  2. CSS 的注释方法 /注释内容/
  3. JavaScript 的注释方法 /* 多行注释方式 */ //单行注释方式

disabled 和 readonly 的区别?

  1. disabled 指当 input 元素加载时禁用此元素。input 内容不会随着表单提交。
  2. readonly 规定输入字段为只读。input 内容会随着表单提交。
  3. 无论设置 readonly 还是 disabled,通过 js 脚本都能更改 input 的 value

主流浏览器内核私有属性 css 前缀?

  1. mozilla 内核 (firefox,flock 等) -moz
    1. webkit 内核 (safari,chrome 等) -webkit
    2. opera 内核 (opera 浏览器) -o
    3. trident 内核 (ie 浏览器) -ms

前端性能优化?

前端性能优化主要是为了提高页面的加载速度,优化用户的访问体验。我认为可以从这些方面来进行优化。

  1. 第一个方面是页面的内容方面
(1)通过文件合并、css 雪碧图、使用 base64 等方式来减少 HTTP 请求数,避免过多的请求造成等待的情况。

(2)通过 DNS 缓存等机制来减少 DNS 的查询次数。

(3)通过设置缓存策略,对常用不变的资源进行缓存。

(4)使用延迟加载的方式,来减少页面首屏加载时需要请求的资源。延迟加载的资源当用户需要访问时,再去请求加载。

(5)通过用户行为,对某些资源使用预加载的方式,来提高用户需要访问资源时的响应速度。
  1. 第二个方面是服务器方面
(1)使用 CDN 服务,来提高用户对于资源请求时的响应速度。

(2)服务器端启用 Gzip、Deflate 等方式对于传输的资源进行压缩,减小文件的体积。

(3)尽可能减小 cookie 的大小,并且通过将静态资源分配到其他域名下,来避免对静态资源请求时携带不必要的 cookie
  1. 第三个方面是 CSS 和 JavaScript 方面
(1)把样式表放在页面的 head 标签中,减少页面的首次渲染的时间。

(2)避免使用 @import 标签。

(3)尽量把 js 脚本放在页面底部或者使用 defer 或 async 属性,避免脚本的加载和执行阻塞页面的渲染。

(4)通过对 JavaScript 和 CSS 的文件进行压缩,来减小文件的体积。

详细的资料可以参考:
《前端性能优化之雅虎35条军规》
《你真的了解 gzip 吗?》
《前端性能优化之 gzip》

Chrome 中的 Waterfall ?

详细资料可以参考:
《前端性能之 Chrome 的 Waterfall》
《教你读懂网络请求的瀑布图》 《前端妹子跟我抱怨她们的页面加载很慢的时候,如何在她面前优雅地装逼?》

扫描二维码登录网页是什么原理,前后两个事件是如何联系的?

核心过程应该是:浏览器获得一个临时 id,通过长连接等待客户端扫描带有此 id 的二维码后,从长连接中获得客户端上报给 serv
er的帐号信息进行展示。并在客户端点击确认后,获得服务器授信的令牌,进行随后的信息交互过程。在超时、网络断开、其他设备
上登录后,此前获得的令牌或丢失、或失效,对授权过程形成有效的安全防护。

我的理解

二维码登录网页的基本原理是,用户进入登录网页后,服务器生成一个 uid 来标识一个用户。对应的二维码对应了一个对应 uid 
的链接,任何能够识别二维码的应用都可以获得这个链接,但是它们没有办法和对应登录的服务器响应。比如微信的二维码登录,只
有用微信识这个二维码才有效。当微信客户端打开这个链接时,对应的登录服务器就获得了用户的相关信息。这个时候登录网页根据
先前的长连接获取到服务器传过来的用户信息进行显示。然后提前预加载一些登录后可能用到的信息。当客户端点击确认授权登陆后,
服务器生成一个权限令牌给网页,网页之后使用这个令牌进行信息的交互过程。由于整个授权的过程都是在手机端进行的,因此能够
很好的防止 PC 上泛滥的病毒。并且在超时、网络断开、其他设备上登录后,此前获得的令牌或丢失、或失效,对授权过程能够形成
有效的安全防护。
详细资料可以参考:

《微信扫描二维码登录网页》

Html 规范中为什么要求引用资源不加协议头http或者https

如果用户当前访问的页面是通过 HTTPS 协议来浏览的,那么网页中的资源也只能通过 HTTPS 协议来引用,否则浏览器会出现
警告信息,不同浏览器警告信息展现形式不同。

为了解决这个问题,我们可以省略 URL 的协议声明,省略后浏览器照样可以正常引用相应的资源,这项解决方案称为
 protocol-relative URL,暂且可译作协议相对 URL。

如果使用协议相对 URL,无论是使用 HTTPS,还是 HTTP 访问页面,浏览器都会以相同的协议请求页面中的资源,避免弹出类似
的警告信息,同时还可以节省5字节的数据量。

详细资料可以参考:
《协议相对 URL》
《Why you need protocol-relative URLs now