來一發(fā),網(wǎng)頁下拉刷新

手機(jī)APP開發(fā)中悉盆,下拉刷新是一個(gè)很常見的功能盯荤,但是在網(wǎng)頁中,這種模式用的很少焕盟。網(wǎng)頁下拉刷新秋秤,看似簡單的功能,但我在網(wǎng)上并沒有找到比較好的解決方法脚翘,遂自己開發(fā)了一個(gè)灼卢。期間遇到了各種小坑,瀏覽器兼容来农,各種瀏覽器下拉默認(rèn)事件鞋真,PC端無觸摸事件~。

簡單的效果圖


下拉刷新效果圖

下拉刷新實(shí)現(xiàn)流程


  • 定義初始數(shù)據(jù)
  • 觸摸開始
  • 觸摸移動(dòng)過程中判斷是否處于下拉狀態(tài)沃于,標(biāo)記開始狀態(tài)
  • 觸摸過程中控制提示內(nèi)容 margin-top與 height 屬性予以呈現(xiàn)
  • 觸摸結(jié)束涩咖,請求數(shù)據(jù)
  • 請求數(shù)據(jù)成功/失敗處理
  • 處理數(shù)據(jù),下拉刷新完成

清晰的流程認(rèn)知很重要繁莹,接下來簡單的說明流程

靜態(tài)樣式


下拉刷新需要下拉元素與下拉提示元素
這里我們選擇的容器是body,下拉提示元素自定義~

<body>
     <div class="refreshing">
             <!-- 刷新提示元素 -->
     </div>
</body>

需要注意的是檩互,下拉容器高度不能設(shè)置為0,否則不能為容器添加觸摸事件

定義初始數(shù)據(jù)


開始之前定義一系列初始數(shù)據(jù),

var isValid = false,    // 是否生效
    isTouching = false, // 觸摸中標(biāo)識(shí)
    isEfec = false, // 觸摸是否生效
    isDestory = false,  // 是否銷毀 
    startX, startY, disY = 0,   // 起始觸摸X蒋困、y坐標(biāo)盾似, 移動(dòng)Y坐標(biāo)
    ...

添加觸摸事件

document.body.addEventListener('touchstart', touchStart, false);
document.body.addEventListener('touchmove', touchMove, false);
document.body.addEventListener('touchend', touchEnd, false);

開始觸摸


var touchStart = function(evt) {
    var scrollTop = parseInt($el.scrollTop());
    
    if(scrollTop > 0) return;  // 滾動(dòng)條高度大于0
    if(isDestory) return;        // 銷毀狀態(tài)
    if(isTouching) return;     // 當(dāng)前處于觸摸狀態(tài)

    isTouching = true;          // 觸摸狀態(tài)標(biāo)標(biāo)識(shí)
    isEfec = true;                  // 觸摸開始生效
    
    var touch = evt.touches[0], //獲取第一個(gè)觸點(diǎn)
        x = parseInt(touch.pageX), //頁面觸點(diǎn)X坐標(biāo)
        y = parseInt(touch.pageY); //頁面觸點(diǎn)Y坐標(biāo)

    //記錄觸點(diǎn)初始位置
    startX = x;
    startY = y;
}

這一步唯一需要做的就是記錄開始觸摸點(diǎn);

觸摸移動(dòng)過程


var touchMove = function(evt) {
    var $loadingEl = $loadingEl,
        touch = evt.touches[0], //獲取第一個(gè)觸點(diǎn)
        x = parseInt(touch.pageX), //頁面觸點(diǎn)X坐標(biāo)
        y = parseInt(touch.pageY), //頁面觸點(diǎn)Y坐標(biāo)
        t = y - startY;         // 觸摸距離

    // 距離必須大于靈敏距離觸摸才生效
    if(!isValid && t > options.startPX) {
        isValid = true;
    }
    
    // 阻止事件冒泡
    evt.preventDefault();   
   
   // 省略幾行代碼
    ...

    disY = t;
}

在這一步中需要阻止事件冒泡事件,WAP端的部分瀏覽器會(huì)重寫下拉事件零院,比如chrome與微信中(見下圖)溉跃。


chrome瀏覽器默認(rèn)下拉刷新

微信中默認(rèn)下拉顯示網(wǎng)頁信息

這里一大坑是:瀏覽器中下拉默認(rèn)事件一旦觸發(fā)后,就不能再通過冒泡阻止此事件告抄。
chrome瀏覽器中大概是15PX左右的下拉后觸發(fā)默認(rèn)刷新撰茎,微信中大概是6像素左右。

觸摸結(jié)束打洼,請求數(shù)據(jù)


// touchend事件
var touchEnd = function(evt) {

    isValid = false;
    isEfec = false;
    disY = 0;

    var $loadingEl = options.$loadingEl,
        touch = evt.touches[0] || evt.changedTouches[0],    //獲取第一個(gè)觸點(diǎn)
        y = parseInt(touch.pageY),  //頁面觸點(diǎn)Y坐標(biāo)
        t = y - startY;
       
   // Do some thing ...
  
   $.post(options.url, sendData, function(response, textStatus, xhr) {
        // Do something 
    }).error(function(){
        // Do something
    });
}

觸摸結(jié)束后需要做的是判斷是否進(jìn)行請求數(shù)據(jù)龄糊,
請求數(shù)據(jù)成功后,處理數(shù)據(jù)募疮,重置有關(guān)刷新的代碼


簡單的說明就到此為止炫惩,如果有興趣,可以從github中下載~

相關(guān)


下載地址: https://github.com/pyrinelaw/p-pull-refresh
演示地址: http://pyrinelaw.github.io/p-pull-refresh
Drag介紹文檔: http://www.w3schools.com/tags/ev_ondrag.asp

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阿浓,一起剝皮案震驚了整個(gè)濱河市他嚷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芭毙,老刑警劉巖筋蓖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異退敦,居然都是意外死亡粘咖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門侈百,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓮下,“玉大人,你說我怎么就攤上這事钝域〕罚” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵网梢,是天一觀的道長。 經(jīng)常有香客問我赂毯,道長战虏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任党涕,我火速辦了婚禮烦感,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘膛堤。我一直安慰自己手趣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绿渣,像睡著了一般朝群。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上中符,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天姜胖,我揣著相機(jī)與錄音,去河邊找鬼淀散。 笑死右莱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的档插。 我是一名探鬼主播慢蜓,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼郭膛!你這毒婦竟也來了晨抡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤饲鄙,失蹤者是張志新(化名)和其女友劉穎凄诞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忍级,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帆谍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轴咱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汛蝙。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖朴肺,靈堂內(nèi)的尸體忽然破棺而出窖剑,到底是詐尸還是另有隱情,我是刑警寧澤戈稿,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布西土,位于F島的核電站,受9級(jí)特大地震影響鞍盗,放射性物質(zhì)發(fā)生泄漏需了。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一般甲、第九天 我趴在偏房一處隱蔽的房頂上張望肋乍。 院中可真熱鬧,春花似錦敷存、人聲如沸墓造。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽觅闽。三九已至帝雇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谱煤,已是汗流浹背摊求。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刘离,地道東北人室叉。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像硫惕,于是被迫代替她去往敵國和親茧痕。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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