引發的思考" type="hidden"/>

引發的思考


  前陣子在一個移動項目中,通過 <a href = "#" >  的方式 綁定click 事件來提交一個表單,由於表單信息比較敏感,於是采用的post 同步提交的方式,原本到也沒有什么。后來萬惡的PM說 “你這個按鈕呀,要固定在底部比較好” ,於是乎就通過 position:fixed 固定到底部了。那么,問題來了 , 在ios 下,虛擬鍵盤是浮在頁面上層的,導致的結果是當鍵盤收起后,浮在最底部的按鈕不在最底下,而跑到中間來了,(極端條件下還可能擋住輸入框導致無法輸入),並且隨着屏幕的滾動而滾動,,(表現類似於absolute) ,,高大上的蘋果也是真心坑了一回。

  怎么辦呢? 兩種方案,一滾動時動態計算位置,實時監控位置必定是要消耗性能的,二是由於無法監控到虛擬鍵盤打開或者關閉,所以只能通過對表單元素綁定focus和blur事件來改變按鈕position來達到想要的效果。於是balabala又搞完了。

  搞完后就開始測試,然后有發現當有input元素處於focus狀態時,點擊提交按鈕,無效!!!我再點,好了。。。

  原因是因為blur事件會阻止click事件的執行。。。

    好,我繼續改。

  blur事件會阻止click事件的執行,但是不會阻止touch事件,於是想起把click改成tap吧。還真行。不用再點擊兩次了。

  大功告成,我得意的笑,我真聰明。

  balabala 就上線了。

  一上線發現提交不了了。。。有一定概率出現請求被canceled 。。。

             

各種google沒找出原因,,問題出在哪里?click是沒有問題,換成tap便有問題了,於是乎查了一下 touch event 的執行順序,大致是這樣

  

於是我測試 mouseup 是好的,touchend也是有問題的,,tap也是有問題的,,而當我用tap事件,handler處理的時候延遲100ms再$('*Form').submit() 又可以正常提交了。原來是submit執行的時機問題。

繼續各種debug 抓蟲子,,歷史遺留的坑啊,,

最終到 <a href = "#" > 了,,當按鈕點擊事件執行,在請求hash前執行submit , 請求還沒返回,由於改變了hash,同步的submit被cancel了,,,而由於各種原因submit執行前,hash已經改變的話就可以順利提交了,,

 

於是乎,把 <a href = "#" >  改成 <a href = "javascript:void(0)" > 終於萬事大吉了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM