我是靠谱客的博主 无限太阳,最近开发中收集的这篇文章主要介绍面试题---背题版浏览器兼容问题 移动端兼容问题:,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.http是什么

http是超文本传输协议,http规定了请求报文和相应报文的格式,在传输过程中数据不会加密

2.https是和http的不同

https为安全超文本传输协议,是通过数据加密的方式传输数据的

状态码

2xx   成功

3xx    重定向

301    Moved Permanently    永久重定向。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替.

302    Found    临时重定向。与301类似。

304:如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。即客户端和服务器端只需要传输很少的数据量来做文件的校验,如果文件没有修改过,则不需要返回全量的数据。

4xx  客户端错误    服务器拒绝请求,或是找不到请求的数据

(1)400状态码:请求无效

产生原因:

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

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

(2)401状态码:当前请求需要用户验证

(3)403状态码:服务器已经得到请求,但是拒绝执行

5xx  服务端错误

500    Internal Server Error    服务器内部错误,无法完成请求

3.Cookie、sessionStorage、localStorage

Cookie:cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递。

三者的区别:

cookie数据不能超过4K,webStorage虽然也有存储大小的限制,但是比cookie大得多,可以达到5M或更大

数据的有效期不同sessionStorage:仅在当前的浏览器窗口关闭有效;localStorage:始终有效,窗口或浏览器关闭也一直保存,因此用作持久数据;cookie:只在设置的cookie过期时间之前一直有效,即使窗口和浏览器关闭

sessionStorage:不在不同的浏览器窗口中共享,即使是同一个页面;localStorage:在所有同源窗口都是共享的;cookie:也是在所有同源窗口中共享的

GET和POST的区别

get参数通过url传递,post放在request body中。

get请求在url中传递的参数是有长度限制的,而post没有。

get比post更不安全,因为参数直接暴露在url中,所以不能用来传递敏感信息。

get请求只能进行url编码,而post支持多种编码方式

get请求会浏览器主动cache,而post支持多种编码方式。

get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留。

GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。

GET产生一个TCP数据包;POST产生两个TCP数据包。

4.web worker

web worker是运行在后台的js,不会影响页面的性能。解析完成之后,通过postMessage将结果回传到主线程。这样在进行复杂操作的时候,就不会阻塞主线程了。

5.xss漏洞

 原理:通过将js代码注入网页,在其他用户访问网站时,发起攻击

危害:窃取cookie,传播蠕虫等

修复:1.将cookie标记为http only 2.过滤特殊标签,如 script,iframe 3.过滤事件

6.强缓存/协商缓存

强缓存:直接从缓存读取   cache-control:max-age  /  no-cache

协商缓存:通过服务器来告知缓存是否可用 

ETag  /  Last-Modified     If-none-match  /  If-Modified-since

前端优化

降低请求量:合并资源,减少HTTP 请求数,minify / gzip 压缩,webP,lazyLoad。

加快请求速度:预解析DNS,减少域名数,并行加载,CDN 分发。

缓存:HTTP 协议缓存请求,离线缓存 manifest,离线数据缓存localStorage。

渲染:JS/CSS优化,加载顺序,服务端渲染,pipeline。

浏览器工作原理

输入url后,查询DNS服务器,得到服务器的ip地址以及相应的端口号,建立TCP链接,发送http请求,服务器响应数据,浏览器开始解析html,形成DOM树,内联样式构建一个CSS对象模型树CSSOM树,构建完成后和DOM树合并为渲染树,之后开始根据位置大小进行布局,最后进行绘制

盒子模型

在标准的盒子模型中,width指content部分的宽度,

在IE盒子模型中,width表示content+padding+border这三个部分的宽度

语义化标签的好处

  • 语义化标签具有可读性,使得文档结构清晰
  • 浏览器便于读取,有利于SEO优化
  • 展现在页面中时,用户体验好
  • 便于团队开发和维护

link标签和@import

link属于html标签,而@import是css提供的

页面被加载时,link会同时被加载,而@import引用的css会等到页面加载结束后加载。

link是html标签,因此没有兼容性,而@import只有IE5以上才能识别。

link方式样式的权重高于@import的。

BFC(块级格式化上下文,用于清楚浮动,防止margin重叠等)

块级格式化上下文,是一个独立的渲染区域,子元素不会影响到外面

哪些元素会生成BFC:

根元素

float不为none的元素

position为fixed和absolute的元素

display为inline-block、table-cell、table-caption,flex,inline-flex的元素

overflow不为visible的元素

垂直居中的方法

父元素table布局,子元素设置vertical-align:center;

父元素display:flex,align-items:center;

元素绝对定位,top:50%,margin-top:-(高度/2)

多行元素的文本省略号

display: -webkit-box

-webkit-box-orient:vertical

-webkit-line-clamp:3

overflow:hidden

浮动清除

clear:both;

overflow:hidden;或overflow:auto;

CSS选择器有哪些,优先级

id 选择器,class 选择器,标签选择器,伪元素选择器,伪类选择器等

内联样式> 内部样式 > 外部样式 > 浏览器用户自定义样式 > 浏览器默认样式

一个元素的背景颜色,背景颜色会填充哪些区域

颜色会填充元素的content、padding、border区域

原型链继承

A.prototype.__proto__ = B.prototype

构造函数继承

function A(){

 B.call( this ) 

}

组合继承

function A(){

 B.call( this ) 

}

A.prototype.__proto__ = B.prototype

寄生组合继承

function A(){

 B.call( this ) 

}

A.prototype  = Object.create( B.prototype )

clientHeight,scrollHeight,offsetHeight

clientHeight:表示的是可视区域的高度,不包含border和滚动条

offsetHeight:表示可视区域的高度,包含了border和滚动条

scrollHeight:表示了所有区域的高度,包含了因为滚动被隐藏的部分。

异步加载js的方法

defer:只支持IE如果您的脚本不会改变文档的内容,可将 defer 属性加入到<script>标签中,以便加快处理文档的速度。

async,HTML5属性仅适用于外部脚本,并且如果在IE中,同时存在defer和async,那么defer的优先级比较高.

创建script标签,插入到DOM中

Ajax解决浏览器缓存问题

在ajax发送请求前加上 anyAjaxObj.setRequestHeader("If-Modified-Since","0")。

在ajax发送请求前加上 anyAjaxObj.setRequestHeader("Cache-Control","no-cache")。

在URL后面加上一个随机数: "fresh=" + Math.random()。

在URL后面加上时间搓:"nowtime=" + new Date().getTime()。

垃圾回收机制

标记清除

这是最常见的垃圾回收方式,当变量进入环境时,就标记这个变量为”进入环境“,从逻辑上讲,永远不能释放进入环境的变量所占的内存,永远不能释放进入环境变量所占用的内存,只要执行流程进入相应的环境,就可能用到他们。当离开环境时,就标记为离开环境。

垃圾回收器在运行的时候会给存储在内存中的变量都加上标记(所有都加),然后去掉环境变量中的变量,以及被环境变量中的变量所引用的变量(条件性去除标记),删除所有被标记的变量,删除的变量无法在环境变量中被访问所以会被删除,最后垃圾回收器,完成了内存的清除工作,并回收他们所占用的内存。

引用计数法

另一种不太常见的方法就是引用计数法,引用计数法的意思就是每个值没引用的次数,当声明了一个变量,并用一个引用类型的值赋值给改变量,则这个值的引用次数为1,;相反的,如果包含了对这个值引用的变量又取得了另外一个值,则原先的引用值引用次数就减1,当这个值的引用次数为0的时候,说明没有办法再访问这个值了,因此就把所占的内存给回收进来,这样垃圾收集器再次运行的时候,就会释放引用次数为0的这些值。

内存泄漏/内存溢出

内存泄漏是指程序在申请内存后,无法释放已申请的内存空间。

内存溢出是指程序申请内存时,没有足够的内存供申请者使用

实现深拷贝

function deepCopy( obj ){
  var newObj = {}
  if( typeof obj !== 'object') return obj       // 给 obj[i] 做判断
  if( obj === null) return obj                     // obj[i]一些特殊值的判断
  if( obj instanceof Date) return new Date(obj)    // obj[i]一些特殊值的判断
  if( obj instanceof RegExp) return new RegExp(obj)     // obj[i]一些特殊值的判断
  for(var i in obj) {
    if(obj.hasOwnProperty(i)){
      newobj[i] = deepCope( obj[i] )
    }
  }
  return newobj 
}

原生的ajax封装成promise

var  myNewAjax=function(url){
  return new Promise(function(resolve,reject){
    var xhr = new XMLHttpRequest();
    xhr.open('get',url);
    xhr.send(data);
    xhr.onreadystatechange=function(){
      if(xhr.status==200&&readyState==4){
        var json=JSON.parse(xhr.responseText);
        resolve(json)
      }else if(xhr.readyState==4&&xhr.status!=200){
        reject('error');
       }
    }
  })
}

数组去重的方法

1.Array.from(new Set( arr ))

2.reduce  +  includes

3.双重for循环

JS实现跨域 

JSONP:通过动态创建script,再请求一个带参网址实现跨域通信。document.domain + iframe跨域:两个页面都通过js强制设置document.domain为基础主域,就实现了同域。

CORS:服务端设置Access-Control-Allow-Origin即可,前端无须设置,若要带cookie请求,前后端都需要设置。

代理跨域:启一个代理服务器,实现数据的转发

==运算符

如果两个操作数都是对象,则仅当两个操作数都引用同一个对象时才返回true

如果一个操作数是null,另一个操作数是undefined,则返回true

如果两个操作数是不同类型的,就会尝试在比较之前将它们转换为相同类型:

  • 当数字与字符串进行比较时,会尝试将字符串转换为数字值。
  • 如果操作数之一是Boolean,则将布尔操作数转换为1或0。
    • 如果是true,则转换为1
    • 如果是 false,则转换为0
  • 如果操作数之一是对象,另一个是数字或字符串,会尝试使用对象的valueOf()toString()方法将对象转换为原始值。

event loop

js的事件循环机制,js是单线程的语言,在调用栈中执行完被压入栈中的同步代码之后,会先执行微任务队列里的代码,再执行消息队列里的代码

宏任务,微任务

微任务执行时机比宏任务先执行

微任务 > DOM渲染 > 宏任务

宏任务:DOM事件,定时器,AJAX请求

微任务:promise,async/await

vue生命周期

 

let const var的区别 

var声明的变量是全局或者整个函数块的,而let,const声明的变量是块级的变量,var声明的变量存在变量提升,let,const不存在,let声明的变量允许重新赋值,const不允许

Vue的通信方式有几种?隔代组件通信方式用哪种方式解决

  • Props/$emit 适用父子组件通信
  • Ref与parent/parent适用于父子组件通信;
  • attrs/listeners 适合隔代组件通信;
  • Provide/inject适用于隔代组件的通行;
  • Evenbus(中央事件总线)适用于父子隔代兄弟组件;
  • Vuex适用于隔代组件的通信
  • Slot插槽方式

封装mytypeof方法

 function mytypeOf(target) {
        let res = typeof target
        const typeObj = {
          '[Object Array]': 'array',
          '[Object Object]': 'ocject',
          '[Object String]': 'string',
          '[Object Number]': 'number',
          '[Object Boolean]': 'boolean',
        }
        if (target === null) {
          return 'null'
        } else if (res === 'Object') {
          let result = Object.prototype.toString.call(target)
          return typeObj[result]
        } else {
          return res
        }
      }

浏览器兼容问题 

解决方案:

1.ie8不兼容透明度

background:#ffffff; /*支持rgba的浏览器*/
/* older safari/Chrome browsers */
-webkit-opacity: 0;
-khtml-opacity:0;
-moz-opacity:0;
filter:alpha(opacity=0);
filter:"alpha(opacity=0)";
opacity:0; 
/*This works in IE 8 & 9 too*/
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0);/*兼容ie8及以下*/ 
filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr='#7f000000',EndColorStr='#7f000000');
filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#7f000000,endColorstr=#7f000000);

1.图片加a标签在IE9-中会有边框

解决方案:img{border:none;}

2. IE浏览器div最小宽度和高度的问题(IE不认得min-

解决方案:

#box{
  width: 80px;
  height: 35px;
  }
html>body #box{
 width: auto;
 height: auto; 
 min-width: 80px; 
 min-height: 35px;
 }

3.不兼容border-radius

推荐用背景图代替

移动端兼容问题:

1.click事件的300ms延迟

解决方案:

  • fastclick.js可以解决在手机上点击事件300ms的延迟

2.touch事件的点击穿透

移动端事件的响应顺序 touchstart -> touchmove -> touchend -> tap -> click

方案一:fastclick.js

方案二:阻止默认行为      e.preventDefault()

3. input 的placeholder属性会使文本位置偏上

4.ios下input在输入的时候英文首字母的默认大写

 <input autocapitalize="off" autocorrect="off" />

5.安卓里line-height不居中

4.软键盘弹出时影响fixed定位,使用iScroll插件解决

小程序兼容问题

1.刘海屏

第一步:判断是否是刘海屏

判断是iPhone刘海屏机型的条件就可以是:model带iPhone字样 && statusBarHeight > 20
我们在app.js里写好全局变量:

isIPhoneXSeries: false, // 当前设备是否为刘海屏系列手机

wx.getSystemInfo({
  success: function (res) {
    console.log(res)
    // 判断设备是否为刘海屏
    if (res.model.indexOf("iPhone") >= 0 && (res.statusBarHeight > 20)) {
       _this.globalData.isIPhoneXSeries = true
    }
  }
})

第二步:控件适配刘海屏

1.在app 的 onLaunch 调用wx.getSystemInfoSync() 获取到statusBarHeight 的值

  b)无刘海 ios高度20 安卓各不相同

 胶囊高度

ios在真机下统一是40px,而安卓下统一是48px,因此我们又可以在wx.getSystemInfoSync() 中获取到screenHeight、statusBarHeight、windowHeight之后计算得到胶囊高度。总的导航栏高度即这两个高度之合

底部横条遮挡 

第一步 判断是否是刘海屏

app.js里写好全局变量:

isIPhoneXSeries: false, // 当前设备是否为刘海屏系列手机

wx.getSystemInfo({
  success: function (res) {
    console.log(res)
    // 判断设备是否为刘海屏
    if (res.model.indexOf("iPhone") >= 0 && (res.statusBarHeight > 20)) {
       _this.globalData.isIPhoneXSeries = true
    }
  }
})

第二步:控件适配刘海屏

控件高度设为变量,在js中计算这个变量的值

js:

let bottomHeight = getApp().globalData.isIPhoneXSeries ? 124 : 90
this.setData({
  bottomHeight: bottomHeight
})

wxss:

<view style="height:{{bottomHeight}}rpx">
  <view class="ok">确定</view>
  <view class="cancel">取消</view>
</view>

border1px在高清屏更粗的问题:

.border { border: 1px solid #999 }
@media screen and (-webkit-min-device-pixel-ratio: 2) {
    .border { border: 0.5px solid #999 }
}
@media screen and (-webkit-min-device-pixel-ratio: 3) {
    .border { border: 0.333333px solid #999 }
}

项目优化

1.第三方资源CDN加载

2.图片懒加载,路由懒加载

3.css里尽量避免表达式

4.documentfragment或innerhtml批量操作dom

5.使用事件代理

6.gzip 压缩

7.异步加载js

装饰器

cookie

document. cookie

会携带在请求头当中,不安全 

最后

以上就是无限太阳为你收集整理的面试题---背题版浏览器兼容问题 移动端兼容问题:的全部内容,希望文章能够帮你解决面试题---背题版浏览器兼容问题 移动端兼容问题:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部