天天看點

移動端JS阻止浏覽器放大(chrome、safari、華為三星安卓原生)問題描述解決方案測試機型潛在問題

問題描述

移動端的浏覽器有預設的事件,如手勢縮放事件、輕按兩下放大事件。但有時候會因為一些特殊原因,頁面放大會有問題。已知viewport的設定對新ios無效(輕按兩下、手勢均無效),viewport設定對部分原生浏覽器的無效(輕按兩下有效,手勢無效)。

解決方案

參考網上的方案,下面兩段代碼配合可以解決iso的safari、chrome和安卓chrome

document.addEventListener("gesturestart", function (event) {
	event.preventDefault();
});


document.addEventListener("dblclick", function (event) {
	event.preventDefault();
});


var lastTouchEnd = 0;
document.addEventListener("touchend",function (event) {
	var now = new Date().getTime();
	if (now - lastTouchEnd <= 300) {
		event.preventDefault();
	}
	lastTouchEnd = now;
},false);
           

但是,還是被測試發現華為原生浏覽器和三星的原生浏覽器不行,還是可以手勢放大。直接給document的各種事件阻止預設也不行。後來參考以前遇到的問題,想到的辦法就是,在body下把所有内容包在div裡,div占滿屏,給div添加touchmove事件,阻止冒泡到document層,完美解決,也不影響div裡面其他元素的touchmove事件。

<body>
	<div id="test"></div>
</body>
           
html,body,#test{
	width:100%;
	height:100%;
}
           
document.getElementById("test").addEventListener("touchmove", function (e) {
	e.stopPropagation();
	// e.preventDefault(); 預設事件可以自行考慮加不加
},false);
           

測試機型

iphone safari

iphone chrome

華為 chrome

華為 原生

三星 chrome

三星 原生

潛在問題

在比較極端的情況下,如頁面的執行還沒到這段代碼的時候,使用者已經在縮放了,那這種是沒有辦法處理的,而且一旦這種情況發生,在頁面加載完後,使用者将沒有辦法縮回頁面,就有點尴尬……

繼續閱讀