前端日常开发中,会遇到各种各样的问题,记录下一些当时让我费劲心力的场景的解决过程
一: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发现不能正常切换。
后来定位为一个动画未执行完时就执行了第二个动画,导致的。后来关闭了动画效果解决了
七:字符串所有的方法,都不会修改字符串本身?
今天跟着视频学习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