1.一個簡單的需求,入下圖,當(dāng)屏幕向下滾動到tab欄(下圖中第二個,正常文檔流存在于頁面中)時,隱藏的fixed的同樣的tab欄會顯現(xiàn)(下圖中第一個),我的思路和很多人一樣判斷tab欄的offsetTop_tab和滑動的scrollTop,當(dāng)scrollTop >= offsetTop_tab時就把隱藏的tab欄顯示出來。但是寫代碼時由于scroll事件觸發(fā)的頻率較多,故我在事件處理程序外就用一個變量接收了第二個offsetTop_tab,以免每次取時都觸發(fā)重繪重排。我在測試環(huán)境下測試沒有問題,但是一丟到正式環(huán)境就發(fā)現(xiàn)出問題了,offsetTop_tab這個值不對(偏小),導(dǎo)致隱藏的會提前顯示出來。
產(chǎn)生原因:經(jīng)過分析在react的componentDidMount生命周期函數(shù)中,頁面的結(jié)構(gòu)并未完全的解析渲染(你可以理解為數(shù)據(jù)沒返回來的空殼這個DOM結(jié)構(gòu)以及樣式并未成型),所以我一進(jìn)這個生命周期就抓取offsetTop_tab的值并不準(zhǔn)確。
ps:之前用vue開發(fā)也遇到過類似的問題,在父組件中通過this.$children[index]來抓取父組件中的各個子組件,通常情況下我們可能認(rèn)為父組件中頁面結(jié)構(gòu)從上到下的子組件的index依次是0,1,2......,但是實(shí)際情況并不一定能夠就是這樣的,index的順序是根據(jù)這個子組件渲染的先后順序決定的,比如father組件里面有三個子組件結(jié)構(gòu)上從上到下依次是ChildOne、ChildTwo、ChildThree,若實(shí)際渲染的先后順序ChildThree--->ChildOne--->ChildTwo,那么他們的index分別為ChildOne:1,ChildTwo:2,ChildThree:0
解決方式:將取tab欄offsetTop的代碼移動到設(shè)定data讓數(shù)據(jù)渲染到頁面上后(setDate的回調(diào)里面),此時的DOM結(jié)構(gòu)已穩(wěn)定。
2. 在某些機(jī)型上尺寸會和你計算的尺寸相差1~2個像素,所以當(dāng)你發(fā)現(xiàn)某個機(jī)型上你計算的尺寸要觸發(fā)的事件沒有觸發(fā),那么嘗試著試試添加或減少2個像素debug試試看。
3.在iOS webview上,當(dāng)你引入的某個腳本頁面沒找到的話,那么這個頁面可能會直接不會顯示,同樣的safari瀏覽器也是一樣。若你取的某個變量沒有值(通常我們會認(rèn)為是undefined,但是在蘋果的瀏覽器上會報錯)也會報錯。
4.在使用vue的時候,Mounted生命周期中只是渲染了頁面結(jié)構(gòu),數(shù)據(jù)并未填充進(jìn)去(除非你設(shè)置了默認(rèn)數(shù)據(jù)),此時你取某個div的高或者scrolltop等并非是你想像的數(shù)據(jù),可能是0。例如我在localstorage中存儲了用戶返回操作需要返回到之前瀏覽這個頁面的高度,可能一開始你在moubted里面直接設(shè)置scrollTop并不合適(不起作用),此時你可以嘗試著加個定時器來延遲執(zhí)行。