在做内网穿透项目时,经常需要通过手机访问本地调试的Web页面。这时候你会发现,同样的ref="/tag/137/" style="color:#E3A3CF;font-weight:bold;">JavaScript代码,在电脑上跑得好好的,一到手机上就出问题:点击不灵敏、布局错乱、甚至某些API直接报错。
视口设置是第一步
很多人忽略了meta viewport标签,结果导致页面在手机上自动缩放,点击区域偏移。加上这行代码基本能解决大部分显示问题:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
用事件代理处理触摸行为
PC端常用的click事件在移动端有大约300毫秒的延迟。虽然现在很多浏览器优化了这个问题,但为了兼容老设备,建议使用touchstart代替:
document.getElementById('btn').addEventListener('touchstart', function(e) {
e.preventDefault();
console.log('按钮被点击了');
});
如果担心误触,可以结合判断是否为移动环境:
const isMobile = /iPhone|Android/i.test(navigator.userAgent);
const eventType = isMobile ? 'touchstart' : 'click';
el.addEventListener(eventType, handler);
屏幕尺寸变化要实时响应
手机横竖屏切换很常见,JS需要及时感知。监听resize事件的同时,也要注意orientationchange:
window.addEventListener('resize', adjustLayout);
window.addEventListener('orientationchange', function() {
setTimeout(adjustLayout, 150);
});
function adjustLayout() {
const width = document.documentElement.clientWidth;
if (width < 768) {
// 移动端布局逻辑
}
}
小心那些不存在的API
某些PC浏览器支持的API在低端安卓机上可能压根没有。比如localStorage在iOS私密浏览模式下会抛错。写入前先检测:
function storageAvailable(type) {
try {
const storage = window[type];
const x = '__storage_test__';
storage.setItem(x, x);
storage.removeItem(x);
return true;
} catch (e) {
return false;
}
}
if (storageAvailable('localStorage')) {
localStorage.setItem('data', 'value');
}
字体和点击区域要够大
手指不是鼠标箭头,太小的点击区域容易点错。按钮高度至少44px,文字不小于14px。用JS动态调整:
if (isMobile) {
document.body.style.fontSize = '16px';
}
实际开发中,内网穿透配合手机访问本地服务时,这些细节决定了体验好坏。别等到用户反馈才去修,一开始就按移动端习惯来写JS,省事又稳定。