前端问题总结

301 阅读6分钟

前端日常开发中,会遇到各种各样的问题,记录下一些当时让我费劲心力的场景的解决过程

一:fixed定位失效

移动网页开发时,在chrome模拟移动设备。使用fixed定位失败,还是跟随网页滚动。

查了网上各种答案,都不适用。什么父级元素设置了相关属性,我明明什么也没设置!

最后偶尔切换一下模拟的手机设备好了。我甚至觉得重启浏览器,或者打开新页签也能解决。

这尼玛是chrome的bug啊啊啊,坑了我一个多小时!

注意浏览器的移动设备模拟,偶尔有问题的,我被坑的不止一次了;

二:浏览器不接受Js文件

客户反馈新上线的网页的电脑上白屏,我们去看了,chrome白屏,其他品牌浏览器没有问题。甚至他同桌同款chrome也没有问题!

F12发现他的chrome压根不接受该页面的js文件,百思不得其解!

再查发现他chrome装了一堆插件,一个个关闭。发现有一款名为uBlock Origin的插件阻止浏览器接收该JS文件。可是为什么别的JS文件都不阻止,只阻止我们新上线的这个?

想不明白,跟客户解释我们回去研究研究。回去路上同事说,会不会是我们的文件名起的犯冲?我说咋可能嘞,market.js多正常的命名!

回去开始查这个没听过的插件,原来它的功能主要是过滤网站广告。market有促销的意思,还真是犯冲了。我们换了命名就好了!

莫名其妙的问题,有时候要往插件上考虑考虑;

三:iframe页面携带不了cookie

我们维护的一个PC端平台,左侧是导航栏,右侧的内容其实是一个个iframe打开的页面。如下图

有个需求,别人的页面需要嵌套在我们的平台里,这个页面域名跟我们不一样。那我就加个iframe,url属性设成该页面的url即可。问题是他们的页面嵌入后,他们要在灰度环境测试。他们区分生产和灰度环境的区别是,加了cookie的访问灰度环境。于是乎需要配合他们测试灰度,于是我在他们页面的域名下添加cookie。

加完刷新再次请求时cookie不跟着请求过去,chrome有的版本可以携带cookie,有的不能。360和firefox也是有的能带有的不能带。

后来查了资料,原来很多浏览器不让第三方页面携带cookie。当时网上说80版本后的chrome可以设置,但我试了两个版本都设置不了。最后灰度环境也没测成,硬着头皮上了生产。

注意遇到关于cookie的诡异问题,可以考虑是不是浏览器可能有规则限制;

四:切换菜单时按钮按不动

也是如上图的导航栏,灰度环境,有个按钮按不动。乍一看一脸懵!

看了js,有人在监听点击的函数里,加了一层判断。判断一个cookie,如果false,不切换高亮,也不出发监听事件。

为避免按钮点不动的尴尬情况,我们还是尽量避免在按钮事件添加判断。

五:iframe里面的字体偏小

客户发现iframe的文字跟外面的字体相比较全部偏小。

后来直接查看该网页的body标签中,使用了zoom: 0.8。通过这事知道,

  • 整体样式问题要有去看body的意识;
  • zoom是整体放大缩小的作用;

六:IPhone13有问题

使用vant组件库中滚动tab标签时,真机测试发现在安卓没问题,IPhone13发现不能正常切换。

后来定位为一个动画未执行完时就执行了第二个动画,导致的。后来关闭了动画效果解决了

github.com/youzan/vant…

七:字符串所有的方法,都不会修改字符串本身?

今天跟着视频学习ES6,一个博主说:字符串所有的(实例)方法都不会改变原字符串

我大吃一惊,还有这事?平时竟然没注意,特意去查证,是真的。

惭愧惭愧

八:JQuery的serializeArray获取不到值

我通过JQuery的val给select动态设置了值,但是from表单获取不到该字段。

用来from的值是通过serializeArray获取的,而且给select动态赋值后,我还设置disabled。

serializeArray是获取不到设置了disabled属性的字段值的。

最终额外设置了一个input,display:none,name取值跟select一样,值也设的跟select一样,才将该值传上去。

但是记得用完该input要及时删掉。

九:内层函数让外层作用域return false

接到一个改造需求,一个弹框组件确认按钮的监听函数中,return true关闭弹框,return false保持弹框不关闭。

需求是加个接口请求,根据返参结果确定关不关闭弹框。这样就得在请求的回调函数中,控制外层作用域的return 。

想不到办法,网上查了方法,如下。但是ajax的回调函数只是入参,没办法让ajax根据回调函数返参。

// 比较单一的场景确实是个好的解决方案
function fun1(){
    function fun2(){
        return false;
    }   
    return fun2();
}

又请教了同事,他提供了一个新的思路。需求场景是页面初始化完后,再点击弹框,最终点击弹框确认按钮才请求接口。为何不把请求放在初始化时执行,结果搞个全局变量。这样在弹框确认监听中,直接使用返参即可。

当到了某个死胡同,很难找到出口时。实在不行,倒出去看看地图,换条路走。

十:数组获取最大项的值

今天给echarts算y轴的最大值,就想用最便捷的方法,第一反应就是Math.max(arr)方法。好久没用了,诈一下死活用不成了。后来查查才想起来

max是Math的方法,Math是用来处理number的对象,直接传数组肯定报错。max接收多个数据类型是number的参数,取参数中的最大值。比如Math.max(10,99,3,55)

网上查了用Math.max.apply(null,arr),我又开始想为啥传null?为啥不能用call?

事后又想想才明白,apply的第一个参数传null,也就是说并没更换max方法的this指向,还是用的Math对象。

apply的第二个入参接收参数数组,把我们的目标数组传进去,还是相当于给max传了多个number类型的参数,只不过参数都是目标数组的各个项而已。

这里只是巧用了apply的方法特性,并不是传统使用apply更改this指向的用法。

其实就算是更改了this指向,让数组也有了max方法,但是max方法还是接收一个个number作为参数,所以如下写也行

let arr = [55,99,33,22];
Math.max.apply(arr,arr);
99