移動端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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...