前端面试基础<HTTP/HTML/浏览器> [1]

150 阅读11分钟

HTTP/HTML/浏览器

说一下 HTML5 drag api

参考回答

  • dragstart:事件主体是被拖放元素,在开始拖放被拖放元素时触发。
  • darg:事件主体是被拖放元素,在正在拖放被拖放元素时触发。
  • dragenter:事件主体是目标元素,在被拖放元素进入某元素时触发。
  • dragover:事件主体是目标元素,在被拖放在某元素内移动时触发。
  • dragleave:事件主体是目标元素,在被拖放元素移出目标元素是触发。
  • drop:事件主体是目标元素,在目标元素完全接受被拖放元素时触发。
  • dragend:事件主体是被拖放元素,在整个拖放操作结束时触发

400 和 401、403 等常见状态码状态码

参考回答

列举最常见的即可

400 状态码:请求无效

产生原因: 前端提交数据的字段名称和字段类型与后台的实体没有保持一致

前端提交到后台的数据应该是 json 字符串类型,但是前端没有将对象 JSON.stringify 转 化成字符串。

解决方法:

对照字段的名称,保持一致性

将 obj 对象通过 JSON.stringify 实现序列化

401 状态码:

当前请求需要用户验证

403 状态码:

服务器已经得到请求,但是拒绝执行

404 状态码

请求的网页不存在

503 状态码

服务不可用

fetch 发送 2 次请求的原因

参考回答

fetch 发送 post 请求的时候,总是发送 2 次,第一次状态码是 204,第二次才成功? 原因很简单,因为你用 fetch 的 post 请求的时候,导致 fetch 第一次发送了一个 Options 请求,询问服务器是否支持修改的请求头,如果服务器支持,则在第二次中发送真正的 请求。

Cookie、sessionStorage、localStorage 的区别

参考回答

共同点:都是保存在浏览器端,并且是同源的

Cookie:cookie 数据始终在同源的 http 请求中携带(即使不需要),即 cookie 在浏览器 和服务器间来回传递。而 sessionStorage 和 localStorage 不会自动把数据发给服务器,仅 在本地保存。cookie 数据还有路径(path)的概念,可以限制 cookie 只属于某个路径下, 存储的大小很小只有 4K 左右。 (key:可以在浏览器和服务器端来回传递,存储容量 小,只有大约 4K 左右)

sessionStorage:仅在当前浏览器窗口关闭前有效,自然也就不可能持久保持,localStorage: 始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie 只在设置的 cookie 过期时间之前一直有效,即使窗口或浏览器关闭。(key:本身就是一个回话过程,关 闭浏览器后消失,session 为一个回话,当页面不同即使是同一页面打开两次,也被视为 同一次回话)

localStorage:localStorage 在所有同源窗口中都是共享的;cookie 也是在所有同源窗口中 都是共享的。(key:同源窗口都会共享,并且不会失效,不管窗口或者浏览器关闭与 否都会始终生效)

补充说明一下 cookie 的作用:

保存用户登录状态。例如将用户 id 存储于一个 cookie 内,这样当用户下次访问该页面 时就不需要重新登录了,现在很多论坛和社区都提供这样的功能。 cookie 还可以设置 过期时间,当超过时间期限后,cookie 就会自动消失。因此,系统往往可以提示用户保 持登录状态的时间:常见选项有一个月、三个 月、一年等。

跟踪用户行为。例如一个天气预报网站,能够根据用户选择的地区显示当地的天气情况。 如果每次都需要选择所在地是烦琐的,当利用了 cookie 后就会显得很人性化了,系统能 够记住上一次访问的地区,当下次再打开该页面时,它就会自动显示上次用户所在地区 的天气情况。因为一切都是在后 台完成,所以这样的页面就像为某个用户所定制的一 样,使用起来非常方便定制页面。如果网站提供了换肤或更换布局的功能,那么可以使 用 cookie 来记录用户的选项,例如:背景色、分辨率等。当用户下次访问时,仍然可以 保存上一次访问的界面风格。

说一下 web worker

参考回答

在 HTML 页面中,如果在执行脚本时,页面的状态是不可相应的,直到脚本执行完成后, 页面才变成可相应。web worker 是运行在后台的 js,独立于其他脚本,不会影响页面你 的性能。并且通过 postMessage 将结果回传到主线程。这样在进行复杂操作的时候,就 不会阻塞主线程了。

如何创建 web worker:

检测浏览器对于 web worker 的支持性

创建 web worker 文件(js,回传函数等)

创建 web worker 对象

对 HTML 语义化标签的理解

参考回答

HTML5 语义化标签是指正确的标签包含了正确的内容,结构良好,便于阅读,比如 nav 表示导航条,类似的还有 article、header、footer 等等标签。

iframe 是什么?有什么缺点?

参考回答

定义:iframe 元素会创建包含另一个文档的内联框架

提示:可以将提示文字放在之间,来提示某些不支持 iframe 的浏览器

缺点:

会阻塞主页面的 onload 事件

搜索引擎无法解读这种页面,不利于 SEO

iframe 和主页面共享连接池,而浏览器对相同区域有限制所以会影响性能。

Doctype 作用?严格模式与混杂模式如何区分?它们有何意义?

参考回答

Doctype 声明于文档最前面,告诉浏览器以何种方式来渲染页面,这里有两种模式,严格模式和混杂模式。

严格模式的排版和 JS 运作模式是 以该浏览器支持的最高标准运行。

混杂模式,向后兼容,模拟老式浏览器,防止浏览器无法兼容页面。

Cookie 如何防范 XSS 攻击

参考回答

XSS(跨站脚本攻击)是指攻击者在返回的 HTML 中嵌入 javascript 脚本,为了减轻这些 攻击,需要在 HTTP 头部做响应的配置set-cookie:

httponly-这个属性可以防止 XSS,它会禁止 javascript 脚本来访问 cookie。

secure - 这个属性告诉浏览器仅在请求为 https(有SSL加密手段) 的时候发送 cookie。

结果应该是这样的:Set-Cookie=....

Cookie 和 session 的区别

参考答案

  1. cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
  2. cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 COOKIE 欺骗
  3. 考虑到安全应当使用 session。
  4. session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
  5. 考虑到减轻服务器性能方面,应当使用 cookie。
  6. 单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个cookie。 HTTP 是一个无状态协议,因此 Cookie 的最大的作用就是存储 sessionId 用来唯一标识用 户。

一句话概括 RESTFUL

参考答案

就是用 URL 定位资源,用 HTTP 描述操作。

click 在 ios 上有 300ms 延迟,原因及如何解决?

参考答案

(1)粗暴型,禁用缩放

<meta name="viewport" content="width=device-width, user-scalable=no">

(2)利用 FastClick,其原理是: 检测到 touchend 事件后,立刻出发模拟 click 事件,并且把浏览器 300 毫秒之后真正出 发的事件给阻断掉

addEventListener 参数

参考答案

addEventListener(event, function, useCapture)

event 指定事件名;

function 指定要事件触发时执行的函数;

useCapture 指定事件是否在捕获或冒泡阶段执行。(false-冒泡,true-捕获)

http 常用请求头

参考答案

协议说明
Accept可接受的响应内容类型(Content-Types)
Accept-Charset可接受的字符集
Accept-Encoding可接受的响应内容的编码方式。
Accept-Language可接受的响应内容语言列表。
Accept-Datetime可接受的按照时间来表示的响应内容版本
Authorization用于表示 HTTP 协议中需要认证资源的认证信息
Cache-Control用来指定当前的请求/回复中的,是否使用缓存机制。
Connection客户端(浏览器)想要优先使用的连接类型
Cookie由之前服务器通过Set-Cooki(e 见下文)设置的一个HTTP协议Cookie
Content-Length以 8 进制表示的请求体的长度
Content-MD5请求体的内容的二进制 MD5 散列值(数字签名),以 Base64 编码的结果
Content-Type请求体的 MIME 类型 (用于 POST 和 PUT 请求中)
Date发送该消息的日期和时间(以 RFC 7231 中定义的"HTTP 日期"格式
来发送)
Expect表示客户端要求服务器做出特定的行为
From发起此请求的用户的邮件地址
Host表示服务器的域名以及服务器所监听的端口号。如果所请求的端口是对应的服务的标准端口(80),则端口号可以省略。
If-Match仅当客户端提供的实体与服务器上对应的实体相匹配时,才进行对应的操作。主要用于像 PUT 这样的方法中,仅当从用户上次更新某个资源后,该资源未被修改的情况下,才更新该资源。
If-Modified-Since允许在对应的资源未被修改的情况下返回 304 未修改
If-None-Match允许在对应的内容未被修改的情况下返回 304 未修改( 304 NotModified ),参考 超文本传输协议 的实体标记
If-Range如果该实体未被修改过,则向返回所缺少的那一个或多个部分。否则,返回整个新的实体
If-Unmodified-Since仅当该实体自某个特定时间以来未被修改的情况下,才发送回应。
Max-Forwards限制该消息可被代理及网关转发的次数。
Origin发起一个针对跨域资源共享的请求(该请求要求服务器在响应中加入一个 Access-Control-Allow-Origin 的消息头,表示访问控制所允许的来源)。
Pragma与具体的实现相关,这些字段可能在请求/回应链中的任何时候产生。
Proxy-Authorization用于向代理进行认证的认证信息。
Range表示请求某个实体的一部分,字节偏移以 0 开始。
Referer表示浏览器所访问的前一个页面,可以认为是之前访问页面的链接将浏览器带到了当前页面。Referer 其实是 Referrer 这个单词,但 RFC制作标准时给拼错了,后来也就将错就错使用 Referer 了。
TE浏览器预期接受的传输时的编码方式:可使用回应协议头
Transfer-Encoding中的值(还可以使用"trailers"表示数据传输时的分块方式)用来表示浏览器希望在最后一个大小为 0 的块之后还接收到一些额外的字段。
User-Agent浏览器的身份标识字符串
Upgrade要求服务器升级到一个高版本协议。
Via告诉服务器,这个请求是由哪些代理发出的。
Warning一个一般性的警告,表示在实体内容体中可能存在错误。

强缓存,协商缓存

参考答案

标题获取资源形式状态码发送请求到服务器
强缓存从缓存取200(from cache)否,直接从缓存取
协商缓存从缓存取304(not modified)是,通过服务器来告知缓存是否可用

强缓存相关字段有 expires,cache-control。如果 cache-control 与 expires 同时存在的话, cache-control 的优先级高于 expires。

协商缓存相关字段有 Last-Modified/If-Modified-Since,Etag/If-None-Match

强缓存、协商缓存什么时候用哪个

参考答案

因为服务器上的资源不是一直固定不变的,大多数情况下它会更新,这个时候如果我们 还访问本地缓存,那么对用户来说,那就相当于资源没有更新,用户看到的还是旧的资 源;所以我们希望服务器上的资源更新了浏览器就请求新的资源,没有更新就使用本地 的缓存,以最大程度的减少因网络请求而产生的资源浪费。

graph TD
浏览器请求 --> 有缓存-->是否过期? --是--> Etag?;是否过期?--否-->从缓存读取-->呈现;Etag?--是-->向web服务器发送请求带IF-MODIFIED-MATCH--服务器决策-->200/304?--304-->从缓存读取-->呈现;Etag--否-->Last-modified?--是-->向服务器发送请求带IF-MODIFIED-SINCE--服务器决策-->200/304?--200-->请求响应缓存协商-->呈现;Last-modified?--否-->向web服务器发送请求-->请求响应缓存协商-->呈现