移動端H5頁面遇到的問題總結

来源:http://www.cnblogs.com/moonLightcy/archive/2017/01/19/6308714.html
-Advertisement-
Play Games

最近剛做完一個移動端的項目,產品之無敵,過程之艱辛,我就不多說了,記錄下在這個項目中遇到的問題,以防萬一,雖然這些可能都是已經被N多前輩解決掉了的問題,也放在這裡,算是為自己漫漫前端路鋪了一顆小石子兒吧,也在文末留下自己未能解決的疑問,希望看到的朋友能解惑。 都知道做移動端的開發,在電腦上調試好了的 ...


  最近剛做完一個移動端的項目,產品之無敵,過程之艱辛,我就不多說了,記錄下在這個項目中遇到的問題,以防萬一,雖然這些可能都是已經被N多前輩解決掉了的問題,也放在這裡,算是為自己漫漫前端路鋪了一顆小石子兒吧,也在文末留下自己未能解決的疑問,希望看到的朋友能解惑。

  都知道做移動端的開發,在電腦上調試好了的東西,放在手機里可能真的秒秒鐘就炸了,我發誓絕對沒想到炸的這麼快。。。

  1、IOS監聽不到input框輸入中文的keyup事件

  這個小標題好像不太明確,大概就是,APP中有一個列表顯示的頁面,頁面上有個搜索功能,使用keyup監聽input框,每一次keyup都去檢索一下緩存數據有沒有符合的數據,然而、然鵝,IOS上並沒有能在每一次keyup都去檢索,經過各種查發現,IOS的輸入法(不管是第三方還是自帶)能檢測到英文或者數字的keyup,檢測不到中文的keyup,(至於標點那些,就沒有深究了),在輸入中文之後需要點擊回退按鍵,才會開始搜索,我自己能想到的辦法就是定時檢測setInterval,我也只能想到這辦法了,但是總覺得不太好,於是搜索到了這個辦法(http://blog.csdn.net/lytlx/article/details/50845259), 把keyup事件換成“input”和“propertychange”事件。

  oninput 是 HTML5 的標準事件,對於檢測 textarea, input:text, input:password 和 input:search 這幾個元素通過用戶界面發生的內容變化非常有用,在內容修改後立即被觸發,不像 onchange 事件需要失去焦點才觸發。oninput 事件在主流瀏覽器的相容情況如下:

 

  

  oninput 事件在 IE9 以下版本不支持,需要使用 IE 特有的 onpropertychange 事件替代,這個事件在用戶界面改變或者使用腳本直接修改內容兩種情況下都會觸發,有以下幾種情況:

  • 修改了 input:checkbox 或者 input:radio 元素的選擇中狀態, checked 屬性發生變化。
  • 修改了 input:text 或者 textarea 元素的值,value 屬性發生變化。
  • 修改了 select 元素的選中項,selectedIndex 屬性發生變化。

  在監聽到 onpropertychange 事件後,可以使用 event 的 propertyName 屬性來獲取發生變化的屬性名稱,這樣看來,oninput & onpropertychange 似乎是監聽輸入框值變化的最佳方案。

  原來的代碼:

  $(".ui-searchbar-input input").keyup(function () {
    ////
  });

  修改後的代碼:

  $(".ui-searchbar-input input").bind("input", function () {

    ////

  });

  這樣一改之後,IOS也能正常啦~~~~

  2、使用touchstart、touchmove、touchend導致頁面不能滑動

  頁面上有個水滴狀的圖片,要求水平拖動修改餘額顯示,自然而然想到的就是用touchstart、touchmove、touchend來搞定了,由於是初次使用,免不得會偷懶,從網上找了一些使用代碼來縫縫補補,改成自己想要的效果,以下是初始代碼,也就是導致頁面不能滑動的罪魁禍首:

  

  $("#img-balance").on("touchstart", function (e) {
    var touches = e.touches[0];
    oW = touches.clientX - $(this).offset().left;
    oH = touches.clientY - $(this).offset().left;
    $(document).on("touchmove", function (event) {
      event.preventDefault();
    }, false);
  });
  $("#img-balance").on("touchmove",function(e){
    var touches = e.touches[0],
      oLeft = touches.clientX - oW;
    if (oLeft < 20) {
      oLeft = 20;
    } else if (oLeft > document.documentElement.clientWidth - 45) {
      oLeft = document.documentElement.clientWidth - 45;
    }

    $(this).css("left", oLeft + "px");
    mainModule.showBalance(0);
  });
  $("#img-balance").on("touchend",function(){
    $(document).off("touchmove", function (event) {
    event.preventDefault();
    }, false);
  });

  以上代碼能完成我想要的效果,在電腦上玩兒的好好的,結果放在手機上就跪了,原來可以上下滑動的頁面,只要一滑動圖片,頁面就不能上下滑動了,再檢查了一下代碼,表示完全不清楚為什麼要在touchstart和touchend裡面綁touchmove事件,這可能也是拷別人代碼的弊端吧,因為不知道原因,索性就把那兩段代碼給刪了,結果頁面莫名其妙的就滿血複活了,以下是修改後的代碼:

  $("#img-balance").on("touchstart", function (e) {
    var touches = e.touches[0];
    oW = touches.clientX - $(this).offset().left;
  });
  $("#img-balance").on("touchmove",function(e){
    var touches = e.touches[0],
      oLeft = touches.clientX - oW;
    if (oLeft < 2) {
      oLeft = 2;
    } else if (oLeft > document.documentElement.clientWidth - 35) {
      oLeft = document.documentElement.clientWidth - 35;
  }

  $(this).css("left", oLeft + "px");
  mainModule.showBalance(0);
  });

  因為刪掉off代碼之後touchend裡面幾乎沒有東西了,索性就把touchend也刪了,發現並不影響效果,就偷著樂了,後經查證發現,頁面不能滑動,就是因為那個event.preventDefault()阻止了事件的預設行為(頁面滑動???),所以,把它刪掉就好了。

  3、部分手機滑動不流暢

  頁面中的滑動刷新使用的是iscroll,鬱悶的是我周邊的所有人的手機滑起來都是順暢的不要不要的,只有我的,完全劃不動,卡得抓狂,鑒於只有我的手機有這個問題,所以我把它放在了項目的最後來解決,甚至抱著只有我一個覆蓋率或許可以不修複這個問題的小僥幸,現在想想真是慚愧(主要是我旁邊的大牛說,“你要知道有一個你,就有千千萬萬個你”,你贏了)。

  在網上查的時候發現還真是有千千萬萬個我,發現很多人都遇到過這個問題,其中有我覺得可信度較高的知乎(https://www.zhihu.com/question/21938954)、CSDN(http://blog.csdn.net/bbsyi/article/details/50915049 ,http://blog.csdn.net/ml01010736/article/details/50999335)等,還有一些不知名網站,都給出評論說可行的解決方案,無外乎就是以下幾種(多是知乎總結出來的):

    1) iScroll v5.1.3      momentum: true (我用的iscroll的版本沒這麼高,所以就沒有試過這種方法,不知是否可行)

    2) 關閉probeType屬性 (傳說是因為這個啟用監聽滾動狀態的很耗性能,關閉這個屬性滑動就會流暢很多)

    3)給scroll元素增加css樣式:-webkit-transform:translate3d(0,0,0);

  以上3種方式,我試過後兩種,項目中的iscroll初始化為:

      _myScroll = new IScroll('#wrapper', {
        probeType: 3,
        mouseWheel: true,
        click: true
      });

  wrapper中的DOM為: 

<div id="wrapper">
  <div id="scroller">
    <div id="scroller-pullDown">
      <span id="down-icon" class="icon-double-angle-down pull-down-icon"></span>
      <span id="pullDown-msg" class="pull-down-msg">下拉刷新</span>
    </div>
    <div id="scroller-content">
      <div class="div-list">

      </div>
    </div>
    <div id="scroller-pullUp">
      <span id="up-icon" class="icon-double-angle-up pull-up-icon"></span>
      <span id="pullUp-msg" class="pull-up-msg">上拉刷新</span>
    </div>
  </div>
</div>

  先是第三種,給scroll元素增加css樣式,scroll元素是#scroller,上午做測試的時候用的是#scroller-content(啊啊啊啊啊!!!)現在才發現元素選錯了,不知道是不是這個原因導致的第三種方法沒有生效(存疑)。

  第二種方法,註釋掉實例化時的probeType屬性,然而發現,並沒有什麼用。。。於是又開啟了茫茫網路上的撈針行動。

  最終,在CSDN(http://blog.csdn.net/ml01010736/article/details/50999335)上找到了可行辦法:

    document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false);

  偶,這中間還有個小插曲,為瞭解決這個滑動問題,一度傻逼得懷疑是不是沒有寫fastclick的原因,後來加上了並沒有解決問題,也忘記了刪掉,還導致後面的a標簽需要點擊多次才能跳轉鏈接的問題,鬱悶。。。

  加上了這句代碼之後,我的手機頁面終於也是順順暢暢的了,哈~舒心~就喜歡遇到這種花時間就能解決的問題

  以下是問題:

  1、在解決touchstart、touchmove、touchend引發的問題的時候順帶解決了一個不知名bug,這個頁面上有個輸入框,每當輸入框開始輸入數據後頁面就會白屏,只留下孤獨的游標在那裡閃爍,輸入點擊完成後頁面又顯示出來了,這個只是IOS上的問題,奇怪的是,還沒有開始找原因,解決了頁面卡死事件後這個問題也莫名其妙的不見了,簡直靈異。。。

  2、解決最後一個問題的時候因為傻逼加上了fastclick,又引發了我的頭腦風暴,fastclick能夠解決移動端的300ms延遲問題,那按理說我加上了之後點擊應該比之前反應快一點才對,為什麼反而需要多次點擊才能跳轉鏈接呢????

  做這個總結的時候已經是項目發版本的晚上8點,加班狗已哭暈在廁所,這一次的項目我學到不少好東西,雖然連加了兩周的班,畢竟無欲無求,也就無所謂了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • protractor內代碼的語法是基於ES6的,比如:裡面用到了展開運算符“...”,node.js 6.0以下是不支持該語法特性。 所以,安裝protractor是不會報錯,但運行webdriver-manager的升級就會報那三個點無法識別。 需要將node.js升級到6.0+就能解決該問題。 ...
  • 以管理員身份運行windows PowerShell並安裝Chocolatey 我的機器是windows10,可以在開始菜單->所有應用->W欄中找到Window PowerShell並運行。 在命令行中運行命令: 等待安裝完成,預設會安裝最新版。 安裝後運行命令確認: 我這裡得到的版本回覆: 確認 ...
  • 前面的話   當我們通過某些行為(點擊、移動或滾動)觸發頁面進行大面積繪製的時候,瀏覽器往往是沒有準備的,只能被動使用CPU去計算與重繪,由於沒有事先準備,應付渲染夠嗆,於是掉幀卡頓。而CSS屬性will change為web開發者提供了一種告知瀏覽器該元素會有哪些變化的方法,這 ...
  • 最近的計劃,就是每天來幾個特效,當然這裡有限制,在什麼候選區只能放一個,還每天有限制發佈的,哎, 啊 終於寫完了,看到一個挺好玩的東西,想到能不能用網頁的特效做出來,試試唄!不過,一想肯東有很多的 相類似的了,不過,反正就是挺有成就感的。高興即來淫詩一首,兩眼黑黑,燈下黑黑,嘿嘿嘿嘿嘿嘿嘿嘿。。。 ...
  • 一、set 1.基本用法 2.Set實例的屬性 3.Set實例的方法 4.遍歷操作 二、WeakSet 三、Map結構的目的和基本用法 實例的屬性和操作方法 遍歷方法 Map結構轉為數組結構,比較快速的方法是結合使用擴展運算符(...)。 四、WeakMap WeakMap與Map在API上的區別主 ...
  • 在一年前初學js的時候,看過很多關於非同步編程的講解。但是由於實踐經驗少,沒有辦法理解的太多,太理論的東西也往往是看完就忘。 經過公司的三兩個項目的鍛煉,終於對js非同步編程有了比較具體的理解。但始終入門較淺,在這裡就當是給自己一個階段性的總結。 在非同步編程中,一條語句的執行不能依賴上一條語句執行完畢的... ...
  • /** * 第一種Ajax提交方式 * 這種方式需要直接使用ext Ajax方法進行提交 * 使用這種方式,需要將待傳遞的參數進行封裝 * @return entitySearch.firstname:document.all.firstname.value, */function saveUser ...
  • moment非常強大,提供了很多時間方法的封裝,項目需要一個小倒計時的功能,網上找了很多不合適,決定自己寫一個,直接上代碼 用法: html頁面首先要引入moment才能使用我上面的方法 假設HTML里要放入倒計時的地方在這裡 頁面上可以寫js: 看官們外觀可以修改上述代碼去做出你自己的風格,以上內 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...