關(guān)于Cordova頁(yè)面點(diǎn)擊效果的優(yōu)化

當(dāng)Cordova 的CDVViewController正常加載網(wǎng)頁(yè)后塘慕,我們可能會(huì)面臨更多來(lái)自頁(yè)面點(diǎn)擊事件以及加載的問(wèn)題状您。以下所述是我們項(xiàng)目中所遇到的點(diǎn)擊問(wèn)題及對(duì)應(yīng)的解決方案浑彰。
在項(xiàng)目中我們沒(méi)有用到Cordova所現(xiàn)有的plug-in集乔,而是根據(jù)需求開(kāi)發(fā)了自己的插件储矩。此插件可以完成一般的推出視圖等功能锌云。

注:我并不直接闡述最終解決方案荠医,而是闡述整個(gè)優(yōu)化歷程。如果要直接看最終方案,請(qǐng)直接參閱第三點(diǎn)彬向。

點(diǎn)擊問(wèn)題的產(chǎn)生:
剛開(kāi)始兼贡,我們選擇了使用onclick的方式來(lái)響應(yīng)頁(yè)面上的點(diǎn)擊事件,但是效果與原生相差甚遠(yuǎn)娃胆,延時(shí)太大(300ms)遍希。據(jù)了解是這段延時(shí)是為了判斷用戶是否會(huì)觸發(fā)雙擊,真是醉了里烦。此時(shí)我們考慮到的方法是使用ontouch替代onclick凿蒜,touch事件確實(shí)能夠做到看似與原生一樣的點(diǎn)擊反應(yīng),但如果單純將頁(yè)面中的元素添加了touch事件胁黑,你將會(huì)發(fā)現(xiàn)整個(gè)頁(yè)面似乎不能滾動(dòng)了废封,因?yàn)槭种敢挥|碰就觸發(fā)touchstart方法,不會(huì)觸發(fā)touchmove方法别厘。OK虱饿,填坑開(kāi)始了。

1触趴、我們首先采用了一個(gè)比較污的招式氮发。touchstart方法一觸發(fā)就會(huì)執(zhí)行function,沒(méi)有touchmove觸發(fā)的機(jī)會(huì)冗懦。我們就延時(shí)touchstart爽冕,不管你是要點(diǎn)擊還是要滾動(dòng),touchstart方法始終是延時(shí)100ms后觸發(fā)(比300ms體驗(yàn)好多了)披蕉。如果在這100ms里你觸發(fā)了touchmove方法颈畸,那么,我們將終止touchstart的方法没讲。這樣touchmove就得以生存了眯娱。以下js代碼由于也是現(xiàn)學(xué)現(xiàn)用,所以肯定不怎么優(yōu)雅爬凑。

businessListB[i].num = i;
businessListB[i].addEventListener("touchstart", function ()
 {
            tag = businessListB[this.num].id;
            if (tag == null )
            {
                 return;
            }
            this.touchEventTimer = setTimeout(function()
            {
                 cordova.exec(function success() {},
                                       function failure() { },
                                       "CDVPlugin", "onCellClicked", [tag]);
             },100);    // 延時(shí)100ms
}, false);
businessListB[i].addEventListener("touchmove", function()
{
             clearTimeout(this.touchEventTimer); // 取消延時(shí)
             this.touchEventTimer = false; // 終止touchstart方法
}, false);

剛使用上這套方案時(shí)發(fā)現(xiàn)徙缴,哇塞,完美嘁信!可是把玩時(shí)間一長(zhǎng)于样,就發(fā)現(xiàn)了新的問(wèn)題:有時(shí)圖片的點(diǎn)擊效果出來(lái)了,但是沒(méi)有執(zhí)行點(diǎn)擊后的下一步動(dòng)作潘靖。
這是因?yàn)閹缀鯖](méi)有人穿剖,在用手指點(diǎn)擊屏幕時(shí),每次都保持垂直點(diǎn)擊卦溢!
意思是糊余,有些人明明是想點(diǎn)擊秀又,不是滾動(dòng)。但是在點(diǎn)擊下去的瞬間啄刹,在touchstart方法的100ms中涮坐,手指略微的往前移動(dòng)了一點(diǎn)。這種感覺(jué)自己不會(huì)感受到誓军,但是系統(tǒng)能捕捉到袱讹。說(shuō)白了就是手指按下去時(shí)會(huì)有一點(diǎn)點(diǎn)緩沖。是的昵时,你move了捷雕,那么你touchstart方法將不會(huì)執(zhí)行!想明白這點(diǎn)之后我可以90%以上概率重現(xiàn)這個(gè)bug壹甥!
有些人可能會(huì)說(shuō)救巷,是不是100ms太長(zhǎng)了,減少點(diǎn)時(shí)間試試句柠∑忠耄可是這時(shí)間是受約束的,也就是說(shuō)你還要保證你的滾動(dòng)事件正常觸發(fā)溯职。幾次時(shí)間調(diào)整實(shí)驗(yàn)表明精盅,這兩個(gè)bug,不可能同時(shí)消失谜酒。這不可能是一個(gè)完美的方案叹俏!

2、這次我換了個(gè)方法僻族,著重避免點(diǎn)擊時(shí)的緩沖粘驰!還加上了touchend事件。
在touchstart方法中捕獲點(diǎn)擊時(shí)的坐標(biāo)述么,在touchmove中不斷的捕獲最終坐標(biāo)蝌数,判斷移動(dòng)距離,小于一定數(shù)字我們就判為不是移動(dòng)度秘,最后在touchend方法中執(zhí)行函數(shù)籽前。
這個(gè)“一定數(shù)字”讓我覺(jué)得,這也不會(huì)是一個(gè)完美方案敷钾。實(shí)驗(yàn)結(jié)果確實(shí)如此,每個(gè)人的操作習(xí)慣不一樣肄梨,而我卻在視圖給用戶制定一個(gè)操作規(guī)則阻荒,現(xiàn)在想想,著實(shí)不可取众羡。

3侨赡、最終被我找到了一個(gè)完美解決的方案,F(xiàn)astclick.js!羊壹!
這個(gè)文件神奇之處在于蓖宦,他不需要你用touch,你就用你的 onclick好了油猫,他能夠讓你的onclick有touch一樣的反應(yīng)速度稠茂!方法也非常簡(jiǎn)單,在html頁(yè)面中引入該文件情妖,并添加一句: FastClick.attach(document.body);
完工睬关!
目前,這種方案沒(méi)有遇到什么bug毡证,經(jīng)得住我的各種惡劣測(cè)試电爹。關(guān)于FastClick的原理,還未細(xì)究料睛。網(wǎng)上簡(jiǎn)單看了下丐箩,是因?yàn)樗麜?huì)捕捉頁(yè)面中的所有點(diǎn)擊事件,并且將其替換為自己的方法恤煞。待有機(jī)會(huì)我再好好研究下屎勘。
FastClick鏈接:https://github.com/ftlabs/fastclick

其實(shí)很多優(yōu)化方案,Cordova官網(wǎng)上已經(jīng)告訴我們了阱州,只恨我當(dāng)時(shí)沒(méi)耐心看完挑秉。詳情請(qǐng)戳:
http://cordova.apache.org/docs/en/latest/guide/next/index.html#2-performance-considerations

更直觀的優(yōu)化建議:
http://coenraets.org/keypoint/phonegap-performance/#0
(進(jìn)入網(wǎng)站后往左滑)

期待大家更好的建議,多多交流苔货!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末犀概,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子夜惭,更是在濱河造成了極大的恐慌姻灶,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诈茧,死亡現(xiàn)場(chǎng)離奇詭異产喉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)敢会,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)鸥昏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吏垮,“玉大人罐旗,你說(shuō)我怎么就攤上這事九秀≌澄遥” “怎么了涂滴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵柔纵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我或详,道長(zhǎng)霸琴,這世上最難降的妖魔是什么昭伸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮选调,結(jié)果婚禮上灵份,老公的妹妹穿的比我還像新娘。我一直安慰自己填渠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布莺葫。 她就那樣靜靜地躺著捺檬,像睡著了一般瑰谜。 火紅的嫁衣襯著肌膚如雪萨脑。 梳的紋絲不亂的頭發(fā)上渤早,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天鹊杖,我揣著相機(jī)與錄音骂蓖,去河邊找鬼。 笑死茫孔,一個(gè)胖子當(dāng)著我的面吹牛被芳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畔濒,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼剩晴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼侵状!你這毒婦竟也來(lái)了赞弥?” 一聲冷哼從身側(cè)響起壹将,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嗤攻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后妇菱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡暴区,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年闯团,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仙粱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片房交。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡候味,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出尚胞,到底是詐尸還是另有隱情笼裳,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站允青,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胯甩。R本人自食惡果不足惜昧廷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望偎箫。 院中可真熱鬧木柬,春花似錦、人聲如沸淹办。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)怜森。三九已至速挑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間副硅,已是汗流浹背姥宝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恐疲,地道東北人腊满。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像培己,于是被迫代替她去往敵國(guó)和親碳蛋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容