今天在解決項目里面的頁面簽名的問題,在移動端調試的時候质况,發(fā)現(xiàn)普遍移動端瀏覽器都有下拉回彈這么一個動畫。
雖然這是比較人性化的設計,但是面對需要固定在一個區(qū)域監(jiān)控動作的交互來說纺铭,這簡直就是令人頭大的設計。
查了很多網上的資料刀疙,普遍來說都聚焦在了 document
的 touchmove
事件上來舶赔,并且都在事件里面對進行了 preventDefault
來阻止事件的進行,示例如下:
document.addEventListener('touchmove',function(ev){
ev.preventDefault();
});
不過在實際運行的時候谦秧,控制臺會報錯:Unable to preventDefault inside passive event listener
wtf!?這是什么情況竟纳,為什么會報這個錯誤。
看字面意思大概是: 無法將 preventDefault 放在被動事件的監(jiān)聽中
在網上搜尋了很久疚鲤,一些解析文章都把焦點放在了最后一個參數(shù)上锥累。于是去看了看MDN的文檔,有點豁然開朗的感覺集歇。
target.addEventListener(type, listener[, options]);
target.addEventListener(type, listener[, useCapture]);
target.addEventListener(type, listener[, useCapture, wantsUntrusted ]); // Gecko/Mozilla only
我們一般使用 addEventListener
的時候桶略,大部分使用的第二種方式,第三個參數(shù)為 boolean
來判斷是否采用事件捕獲的事件傳播方式。
那么第一種呢删性?MDN對 options
的參數(shù)解釋如下:
options 可選
一個指定有關 listener 屬性的可選參數(shù)對象亏娜。可用的選項如下:
capture: Boolean蹬挺,表示 listener 會在該類型的事件捕獲階段傳播到該 EventTarget 時觸發(fā)维贺。
once: Boolean,表示 listener 在添加之后最多只調用一次巴帮。如果是 true溯泣, listener 會在其被調用之后自動移除。
passive: Boolean榕茧,設置為 true 時垃沦,表示 listener 永遠不會調用 preventDefault()。如果 listener 仍然調用了這個函數(shù)用押,客戶端將會忽略它并拋出一個控制臺警告肢簿。
mozSystemGroup: 只能在 XBL 或者是 Firefox 、 chrome 使用蜻拨,這是個 Boolean池充,表示 listener 被添加到 system group。
看來我們的控制臺報錯問題可以通過設置 options
中的 passive
參數(shù)來解決 preventDefault
不能被動調用的問題缎讼。
document.addEventListener('touchmove',function(ev){
ev.preventDefault();
},{passive:false});
果然再次調試的時候收夸,就不會再觸發(fā)頁面的滑動事件了。
參考文章: