前記
平時在寫bug的時候慢慢的就會有了一些避開bug的經驗,慢慢的記錄下來,避免自己一次次的踩進去。
技術問題
- hybrid開發中,安卓手機上小於
12px
字體的垂直居中不對齊問題,可以通過內邊距padding來折中處理【可能是安卓上的webview實現有關係】 - 無線端1px處理的邊框被隱藏問題,主要是父元素的overflow:hidden引起的【通過僞元素after根據prd放大縮小實現】
- 無線端搜索框使用
form
的onsumbit
監聽search
類型的input
的enter
事件,最後不要通過keycode等方式來監聽enter; - scheme跳轉問題:包括url中文沒有
encodeURIComponent
、沒有寫全https:
而是用//
, - 關於微信分享的問題:分享文字內容敏感、分享了短鏈接,而短鏈接沒有配置服務域名等會有問題;
- 在
jquery
的onclick
的回調事件傳入匿名箭頭函數,並使用this
會導致問題。 - 處理當前頁面
url
參數的時候沒有考慮url
上具有hash的情況,可能會導致參數追加到了hash
上,或者獲取最後一個參數時同時獲取了hash
內容。 -
::-webkit-scrollbar{ display: none;}
隱藏滾動條 和-webkit-overflow-scrolling: touch
啓動彈性滾動 【在app端沒有同時生效】 -
postcss
處理多行截斷文本時會丟去其中一個屬性display: -webkit-box; overflow: hidden; -webkit-box-orient: vertical; text-overflow: ellipsis; -webkit-line-clamp: 2;
也就是其中的-webkit-box-orient: vertical;
需要添加/* autoprefixer: off */
來避免被處理 - 點擊穿透,當原生
click
事件和fastclick
事件混用時,如果fastclick
事件觸及點發生了dom
元素的變更[遮罩層的隱藏等],會導致300ms
後的click
落在了變化後的dom
上,引起詭異的問題。 - 摺疊屏不能僅通過監聽
resize
事件來做重新的展示,因爲在一些瀏覽器微信環境中滾動的頁面會時的環境的導航條隱藏,出發resize,可以同時判斷視口寬度是否變化。 - 全局滾動位置設置的時候
document.body.scrolltop
和document.documentelement.scrolltop
在不同的環境分別起作用,最好的辦法是先設置其中一個,然後讀取設置的值,如果沒有設置成功的話再設置另一個。 -
+ new Date()
和0+ new Date()
的問題 - 關於僞假
0
、[].length
等會被react
渲染 - 滾動穿透問題,當使用全局滾動時,如果有彈窗內容,並且彈窗內容也可以滾動,那麼彈窗內容滾動到邊界時就會穿透到全局,引起全局範圍的對應方向的滾動。處理的話需要在彈窗時將全局滾動失效,並記錄當前滾動位置,在關閉彈窗時,恢復全局滾動以爲文檔滾動位置還原。
- 視頻字段播放的問題注意點:需要注意兼容性和微信設置非全屏播放,以及在app進入後臺時或者新開webview時需要暫停視頻播放
-
在ios系統中,window ,html,document,body綁定click事件,並且代理元素是不可點擊元素(如div span等)的話,事件不會觸發。但是如果是可點擊元素(如button,a)的話,點擊事件正常。
- 將 click 事件直接綁定到目標元素(即 .target ) 上
- 將目標元素換成
<a>
或者<button>
等可點擊的元素 - 給目標元素添加一個空的
onclick=""
(<div class="target" onclick="">點擊我!</div>
) - 把 click 改成 touchend 或 touchstart(注意加上
preventDefault
) - 將 click 元素委託到非
document
和非body
的父級元素上 - 給目標元素加一條樣式規則
cursor: pointer; (cursor: pointer; -webkit-tap-highlight-color: transparent;)
-
關於h5頁面的軟鍵盤和輸入框的問題:
- 在IOS上軟鍵盤的彈起表現:輸入框(input、textarea 或 富文本)獲取焦點,鍵盤彈起,頁面(webview)並沒有被壓縮,或者高度(height)沒有改變,只是頁面(webview)整體往上滾了,且最大滾動高度(scrollTop)爲軟鍵盤高度,如果元素滾動的高度不夠的時候【1. 自動添加空白佔位(軟鍵盤收起後可能還存在,需要滾動一小段來收起) 2. 滾動到底(輸入框可能被遮擋)】。
- 在 Android 上軟鍵盤的彈起表現:,輸入框獲取焦點,鍵盤彈起,但是頁面(webview)高度會發生改變,一般來說,高度爲可視區高度(原高度減去軟鍵盤高度),除了因爲頁面內容被撐開可以產生滾動,webview 本身不能滾動。
- 觸發軟鍵盤上的“收起”按鈕鍵盤或者輸入框以外的頁面區域時,輸入框失去焦點,軟鍵盤收起。
- 觸發輸入框以外的區域時,輸入框失去焦點,軟鍵盤收起。但是,觸發鍵盤上的收起按鈕鍵盤時,輸入框並不會失去焦點,不過軟鍵盤會被收起。
- 第三方的輸入法存在高度不一致或者有導航頭也會存在遮擋問題。
-
選擇合理的佈局,比如flex佈局,以及監聽軟鍵盤的彈起:
- 在 IOS 上,監聽輸入框的 focus 事件來獲知軟鍵盤彈起,監聽輸入框的 blur 事件獲知軟鍵盤收起。
- 在 Android 上,監聽 webview 高度會變化超過軟鍵盤高度(因爲很多瀏覽器在頁面滾動時會隱藏導航欄導致觸發resize事件,所以需要小心使用resize),高度變小獲知軟鍵盤彈起,否則軟鍵盤收起。
-
關於input等表單的disabled和readonly兩個屬性的區別:
- 不是所有具有disabled屬性的表單元素都具有readonly屬性,
<SELECT> , <OPTION> , and <BUTTON>
不具有 - disabled屬性會使得表單在onsubmit的時候被過濾,而readonly會正常提交
- disabled屬性會使得表單在tab切換焦點和點擊獲取焦點時不會觸發onfocus事件回調,而readonly會正常觸發;
- 具有disabled屬性的表單元素在某些運行環境會存在默認樣式,
- 不是所有具有disabled屬性的表單元素都具有readonly屬性,
- 使用
object-fit:fill|contain|cover|scale-down|none
來完成圖片的自適應展示的時候,如果圖片需要存在:hover
時需要變化大小的交互效果時,會導致卡頓,有這種交互的時候需要慎用,可以通過transtion+transform來實現類似功能。 -
在js中,number類型就是double類數值,如果和其他語言進行數據交互存在long類型的語言時候,可能會存在問題:
- 當數值long類型超出範圍時,需要考慮使用字符串來進行處理,而bigint等第三方庫就是使用字符串來模擬實現大的數值計算的;
- 如果將大的數值作爲參數進行接口請求傳遞的時候,存在某些情況下會將數據變成科學計算法表示,是的沒有正確傳遞:
Math.power(10, 99) => 1.000000000000001e99
。
-
addEventListener的使用示例
target.addEventListener(type, listener[, options={}|useCapture=bool]);
,第三個參數options 簡介: An options object that specifies characteristics about the event listener. The available options are:
- capture: A Boolean indicating that events of this type will be dispatched to the registered listener before being dispatched to any EventTarget beneath it in the DOM tree.
- once: A Boolean indicating that the listener should be invoked at most once after being added. If true, the listener would be automatically removed when invoked.
- passive: A Boolean which, if true, indicates that the function specified by listener will never call preventDefault(). If a passive listener does call preventDefault(), the user agent will do nothing other than generate a console warning. See Improving scrolling performance with passive listeners to learn more.
- 其中options的passive設置是默認false;這樣會導致touch events的回調會阻塞瀏覽器主進程,影響滾動性能,從Chrome 56開始, 對於doucment級別的節點(Window, Document, and Document.body)上通過addEventListener添加的touchstart和 touchmove events事件的passive默認設置爲true以提高性能, 如果我們給document綁定touchmove或者touchstart事件的監聽器,而且希望執行preventDefault操作,那麼addEventListener時候的參數options的這個passive需要手動設置爲false,會有性能影響。
- javascript中的Error對象,在使用
JSON.stringfy
處理的時候,存在返回{}
空對象字符串的可能,因爲部分Error對象的屬性都是不可枚舉的,而json.stringfy需要序列化是可枚舉的,可以參考情況和解決方法, - IOS的右滑返回手勢,從左側邊框向右滑動,在當前webview退出動畫執行期間,如果橫滑手勢在向右滑動時,落在了當前正在退出的webview內監聽過touch事件的元素上,touch事件裏面通過event獲取touch位置(
e.touches[0].clientX
)的時候會獲取到觸摸點在下一層webview(返回後的webview)的位置,相當於當前webview的位置減掉了document.documentElement.clientWidth
屏幕/webview的寬度,這樣可能會導致通過獲取touch位置的邏輯出現異常的情況,需要謹慎考慮,遇到問題視情況處理。
非技術問題
-
https
的頁面配置http
的圖片鏈接,導致安卓機無法展示http
圖片 - 關於
chrome
在https
走charls
調試本地頁面時,有時候會不好使,第一次可以考慮重啓charles
,當然無論是模擬器還是真機都應該安裝了charles
的證書。 - 關於微信走本地,最好是有
http
環境,且前端資源的域名使用正常的fesource.com
域名走本地代理。而不是直接使用ip
地址127.0.0.1
。 - 關於IOS的uiwebview的問題,在使用滾動監聽時,只會在滾動結束時觸發監聽事件; 不過WKWebview已經完善了這一問題。
- 關於adblock等廣告攔截插件把本地調試的js代碼攔截等情況,不小心注意的話開始會有點懵逼。。。