web學(xué)習(xí)筆記14-移動(dòng)端頁面上拉無限加載

????已經(jīng)有好久沒有更新文章了巴帮,最近做的東西也不算多,只是沒有時(shí)間更新文章垃沦,今天繼續(xù)弄個(gè)給小白看的文章用押,一般的移動(dòng)端搜索結(jié)果頁或者那種分頁加載的頁面需要用的,上拉無限加載數(shù)據(jù)池充,不知道這個(gè)題目對(duì)不對(duì),大家看了就知道是不是自己需要的東西了坑匠。

Mar-26-2018 14-35-30.gif

????下面直接說完成過程吧卧惜,這個(gè)可以說是非常簡(jiǎn)單的一個(gè)小功能了咽瓷,對(duì)于小白來說也能一眼就能看明白的,當(dāng)然茅姜,要是有更好的方法匈睁,希望大家也跟我說下。這個(gè)功能雖然胀蛮,不過也是上傳到github上了糯钙,覺得看完還沒懂得可以去看看,地址是InfiniteLoading

第一步:構(gòu)建頁面框架

????這一步很簡(jiǎn)單再榄,一般自己的項(xiàng)目都會(huì)有自己的設(shè)計(jì)享潜,我就直接寫一個(gè)簡(jiǎn)單粗糙的列表頁。html部分是:

<div class="nav">
  上拉分頁無限加載
</div>
<!--顯示的大概樣子-->
<div class="container">
    <div class="lineItem">1</div>
    <div class="lineItem">2</div>
    <div class="lineItem">3</div>
    <div class="lineItem">4</div>
    <div class="lineItem">5</div>
    <div class="lineItem">6</div>
    <div class="lineItem">7</div>
    <div class="lineItem">8</div>
    <div class="lineItem">9</div>
    <div class="lineItem">10</div>
    <div class="lineItem">11</div>
    <div class="lineItem">12</div>
    <div class="lineItem">13</div>
    <div class="spinner">加載中疾就。猬腰。猜敢。</div>
    <div class="spinner">- 數(shù)據(jù)已經(jīng)加載到底 -</div>
</div>

css部分是這樣的:

<style>
    *{
        margin: 0;
        padding: 0;
    }
    .container{
        width: 100vw;
        height: calc(100vh - 44px);
    }
    .nav{
        width: 100vw;
        height: 44px;
        line-height: 44px;
        text-align: center;
        font-size: 20px;
    }
    .lineItem{
        width: 100%;
        height: 100px;
        margin-top: 10px;
        background-color: lightgray;
        line-height: 100px;
        text-align: left;
        font-size: 12px;
        overflow: hidden;
    }
    .spinner{
        width: 100%;
        height: 50px;
        text-align: center;
        line-height: 50px;
        font-size: 16px;
        background-color: lightcyan;
        margin-top: 10px;
    }

</style>

寫完顯示出來的樣子是下圖:

1
2
第二步:編寫邏輯部分

????我這邊引入了jquery鼠冕,大家用js寫的話,部分地方有點(diǎn)差異懈费,不過都沒啥區(qū)別楞捂。大家注意下,這塊我用的ajax請(qǐng)求的url是公司的寨闹,所以就拿掉了繁堡,大家替換上各自項(xiàng)目的url和請(qǐng)求數(shù)據(jù)就行。

//聲明部分變量
var pageNum = 1;//頁碼
var pageSize = 10;//每頁多少條數(shù)據(jù)
var infinite = true;//防止不停調(diào)接口加載新數(shù)據(jù),false的時(shí)候就不能請(qǐng)求接口
var count = 0;//總數(shù),判斷是否已經(jīng)加載到底了
var dataCache = [];//數(shù)據(jù)緩存闻牡,根據(jù)接口不同情況绳矩,可以考慮不用這個(gè)。
//請(qǐng)求方法
function sendRequest(num){
    var sendData = {
        //其它請(qǐng)求參數(shù)
        pageNum:num,
        pageSize:pageSize
    };
    if(infinite == true){
        //只有infinite是true的時(shí)候才可以請(qǐng)求接口
        infinite = false;
        $.ajax({
            type: "POST",
            url: " 你自己的url ",
            data:sendData,
            dataType: 'json',
            success: function (data) {
                console.log(data);
                if(data.code == 200 && data.data){
                    count = data.data.count ? data.data.count:0;
                    if(data.data.products && data.data.products.length != 0){
                        setPage(data.data.products);//單獨(dú)的拼接html,渲染頁面的方法割以。
                    }else{
                        //這邊處理當(dāng)數(shù)據(jù)為空的時(shí)候,并且頁數(shù)為第一頁的時(shí)候,頁面應(yīng)該有相應(yīng)的顯示
                        // 比如暫無數(shù)據(jù)列表之類的文案,背景之類的严沥。
                        //并且會(huì)有種可能就是在加載到部分頁數(shù)之后,請(qǐng)求回來的數(shù)據(jù)為空,頁面顯示也是有相應(yīng)的變化
                        if(pageNum == 1){

                        }else{

                        }
                    }
                    //在頁面渲染之后,此時(shí)的數(shù)字加1,為了下一次的加載
                    pageNum = data.data.pageNum + 1;
                }else{
                    //接口返回部分code不正確的時(shí)候,頁面應(yīng)有相應(yīng)的顯示
                    console.log(data.content);
                }
                //設(shè)置可以繼續(xù)請(qǐng)求接口中姜。
                infinite = true;
            },
            error: function (err) {
                infinite = true;
                console.log('系統(tǒng)異常');
            }
        });
    }else{
        infinite = true;
    }
}
sendRequest(pageNum);

//渲染頁面方法
function setPage(data){
    console.log(data);
    $(".spinner").remove();//移除加載條
    for(var i = 0;i < data.length;i++){
        /*這邊也可以做一些緩存數(shù)據(jù)的操作,記住一些數(shù)據(jù),然后進(jìn)行一些別的操作,比如說切換tab的時(shí)候,不刷新頁面渲染頁面
        也可以根據(jù)不同接口返回的數(shù)據(jù)來做判斷是否數(shù)據(jù)加載到底丢胚。我用的接口不支持返回?cái)?shù)量,所以就用這種方式來判斷*/
        dataCache.push(data[i]);//將數(shù)據(jù)添加緩存數(shù)組中,適合數(shù)據(jù)量少的時(shí)候,不過數(shù)據(jù)量大的時(shí)候也可以用
        //拼接html,渲染頁面
        var html = setHtmlModel(data[i]);
        $(".container").append(html);//添加html
    }
    //判斷是否加載到底,如果還有數(shù)據(jù)的話,就直接顯示加載中,如果沒有數(shù)據(jù)的話,就直接顯示加載到底
    //這部分的樣式需要各自項(xiàng)目自己定義,我這邊就只做粗糙的顯示
    var loadHtml = '';
    if(count > dataCache.length){
        loadHtml = '<div class="spinner">加載中。奥溺。骨宠。</div>';

    }else{
        loadHtml = '<div class="spinner">- 數(shù)據(jù)已經(jīng)加載到底 -</div>';
    }
    $(".container").append(loadHtml);
}

//拼接html方法,這邊的html因?yàn)樘?jiǎn)單,所以這塊看起來有點(diǎn)多余,在部分拼接html復(fù)雜的情況下,這樣寫可以看著好看點(diǎn),修改添加的時(shí)候也方便點(diǎn)
function setHtmlModel(data){
    var html = '';
    html += '<div class="lineItem">'+data.name+'</div>';
    return html;
}

????這部分的東西基本上就是請(qǐng)求數(shù)據(jù)层亿,渲染頁面,添加加載框或者加載到底的顯示方灾,不過最重要的部分無限加載這塊還沒有添加上去碌更,所以此時(shí)你翻來覆去只能請(qǐng)求一次。

第三步:添加自動(dòng)加載的方法
//自動(dòng)加載新數(shù)據(jù),當(dāng)滾輪滾到離頁面下面一段距離的時(shí)候,就自動(dòng)更新數(shù)據(jù),請(qǐng)求接口
$(function(){
    $(window).scroll(function () {
        //下面三個(gè)參數(shù)很重要,大家可以自行百度下具體的解釋,一般簡(jiǎn)單的無限滾動(dòng)加載都會(huì)用到這個(gè)
        var scrollTop = $(this).scrollTop();//匹配元素的滾動(dòng)條的垂直位置
        var scrollHeight = $(document).height();//匹配元素document的高度
        var windowHeight = $(this).height();//匹配元素的高度
        if(scrollHeight - scrollTop - windowHeight < 200 ){
            //這邊多做一個(gè)判斷,如果還有剩下沒有加載的數(shù)據(jù)就進(jìn)行加載,如果沒有,就不做請(qǐng)求
            if(count > dataCache.length){
                sendRequest(0,0,pageNum);
                infinite = false;
            }
        }
    });
});

????走完這三步就完成了一個(gè)簡(jiǎn)單的自動(dòng)加載的列表頁了嘿棘。
說實(shí)話旭绒,寫前端也有段時(shí)間了挥吵,按道理來說應(yīng)該寫一點(diǎn)復(fù)雜點(diǎn)的東西,像這樣簡(jiǎn)單的東西隨隨便便都能找到忽匈,可能也是我學(xué)藝不精丹允,還在慢慢學(xué)習(xí)中,希望以后能給大家?guī)砀玫奈恼孪铀伞S惺裁磫栴}大家也可以跟我一起交流交流萎羔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市缘眶,隨后出現(xiàn)的幾起案子髓废,更是在濱河造成了極大的恐慌沮榜,老刑警劉巖株憾,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涌攻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡芝此,警方通過查閱死者的電腦和手機(jī)因痛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門鸵膏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人较性,你說我怎么就攤上這事赞咙。” “怎么了院仿?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵速和,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我排惨,道長(zhǎng)碰凶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任辕宏,我火速辦了婚禮瑞筐,結(jié)果婚禮上腊瑟,老公的妹妹穿的比我還像新娘块蚌。我一直安慰自己魔策,他們只是感情好河胎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布游岳。 她就那樣靜靜地躺著,像睡著了一般喷户。 火紅的嫁衣襯著肌膚如雪访锻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天河哑,我揣著相機(jī)與錄音龟虎,去河邊找鬼。 笑死佳吞,一個(gè)胖子當(dāng)著我的面吹牛棉安,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播花盐,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼算芯,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼凳宙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起届囚,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泥耀,沒想到半個(gè)月后蛔添,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夸溶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年缝裁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了足绅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胎食,死狀恐怖厕怜,靈堂內(nèi)的尸體忽然破棺而出蕾总,到底是詐尸還是另有隱情,我是刑警寧澤生百,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布蚀浆,位于F島的核電站,受9級(jí)特大地震影響杨凑,放射性物質(zhì)發(fā)生泄漏摆昧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一伺帘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧领炫,春花似錦张咳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽频祝。三九已至,卻和暖如春沽一,著一層夾襖步出監(jiān)牢的瞬間漓糙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工蝗蛙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捡硅,地道東北人盗棵。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像喷屋,于是被迫代替她去往敵國(guó)和親瞭恰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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