前端开发时遇到过什么坑?尤其是webapp开发时

2025-02-25 14:03:52
推荐回答(1个)
回答1:

这个问题前几天刚刚总结了一下,之前已在知乎上回答过类似问题,
1、tap事件穿透(解决方案:click事件代替, 或者尝试fastclick这个框架);
或者尝试下面的办法重写一下zepto绑定的事件
/*************** 重写zepto on方法避免事件穿透 ******************/
(function() {
var INTERVAL_MIN = 500;
var lastCalledTime = (new Date()).getTime();
function throttle(handler) {
return function() {
var curTime = (new Date()).getTime();
//两次tap事件的间隔如果不大于500
if(curTime - lastCalledTime > INTERVAL_MIN) {
lastCalledTime = curTime;
handler.apply(this, arguments);
}
}
}
var oldOn = $.fn.on;
$.fn.on = function( evt ){
if(evt === 'tap'){
var args = Array.prototype.slice.call(arguments);
var handlerIndex;
for(var i = 0; i < args.length; i++) {
if(typeof args[i] === 'function') {
handlerIndex = i;
break;
}
}
args[handlerIndex] = throttle(args[handlerIndex]);
this.on('click', function(e) {
e.preventDefault();
});
return oldOn.apply( this, args );
}
return oldOn.apply( this, arguments );
};
})();

解决原理:正常有意义的用户操作不会在500毫秒内连续触发两次tap事件,如果发现两次tap事件的时间间隔不大于500毫秒则阻止第二次tap事件
有两个副作用和一个不能修复的问题
(1). 可能会穿透点到a链接上,需要额外给a绑定tap事件,在js中进行跳转
(2). trigger主动触发得时候可能有问题
(3).无法解决跨页面的穿透问题
2、fixed的元素有input框时在ios上的bug(可以考虑头和底部定高,中间加上一个iScroll的内容区域实现头尾固定,中间内容滑动的UI交互布局);
3、离线缓存更新成功后必须刷新页面才能显示新的修改(写个全局的方法,监听updateready后,主动帮用户刷新一次页面);
4、UC浏览器不支持alert(建议用自己通用的弹窗方法);
5、同样的zepto写的选择器,有时候层级过深在某些浏览器中失效(在节点class和id上命名上合理分配,用常规选择器串);
6、QQ浏览器SVG失效;
7、chrome和小米自带的手机浏览器,开发调试时不走代理(可以下载chrome的beta版)