使用js實現上拉加載下拉刷新效果


在實際的移動端開發中,經常會使用到刷新與加載的功能。使用一些成熟的控件既能節約開發時間,又能增強代碼的穩定性。本文介紹的是常用的關於移動端滾動和刷新與加載的控件。

iScroll的產生完全是因為移動版webkit瀏覽器,例如在iPhone,Android 的移動設備上。

iScroll的原理是外層有一個溢出隱藏(overflow:hidden;)的DOM,然后這個區域內的第一個DOM結構會被實例化,其包裹的內容可以縱向或者橫向的滾動,所以在使用iScroll的時候,滾動元素要盡量的簡單,減少DOM個數,減少嵌套,因為DOM結構越是復雜iScroll運行起來就越是吃力,有可能會造成某些節點顯示不正常的情況。 所以,推薦使用的DOM結構如下:

<div id="wrapper">
  <ul>
    <li>row 11</li>
    <li>row 10</li>
    <li>row 9</li>
    <li>row 8</li>
    <li>row 7</li>
    <li>row 6</li>
    <li>row 5</li>
    <li>row 4</li>
    <li>row 3</li>
    <li>row 2</li>
    <li>row 1</li>
  </ul>
</div>

注意:只有wrapper里的第一個子元素(ul)才可以被實例化滾動,並且要結合外層的DOM(wrapper)才能實現滾動。如果 wrapper中有多個ul,只有wrapper里的第一個子元素(ul)才可以被實例化滾動。

在JS插入頁面DOM結構和數據之前實例化iScroll,也就是在JS的最開始實例化,因為之后可能會使用JS來插入DOM或者數據,這樣以來能確保在插入數據之前iScroll已經實例化了。

關於iScroll詳細用法不過多講,后面會給到常用的api,然后是和pullToRefresh結合使用,達到我們想要的效果。

<!DOCTYPE html>
<html>
<head>
<title>pull to refresh</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="stylesheet" href="pullToRefresh.css"/>
<script src="iscroll.js"></script>
<script src="pullToRefresh.js"></script>
<style type="text/css" media="all">
body, html {
    padding: 0;
    margin: 0;
    height: 100%;
    font-family: Arial, Helvetica, sans-serif;
}
</style>
</head>
<body>
<!--must content ul-->
<div id="wrapper">
  <ul>
    <li>row 11</li>
    <li>row 10</li>
    <li>row 9</li>
    <li>row 8</li>
    <li>row 7</li>
    <li>row 6</li>
    <li>row 5</li>
    <li>row 4</li>
    <li>row 3</li>
    <li>row 2</li>
    <li>row 1</li>
  </ul>
</div>
<script>
refresher.init({
    id:"wrapper",
    pullDownAction:Refresh, /*下拉刷新*/
    pullUpAction:Load /*上拉加載*/
    });
var generatedCount = 0;
function Refresh() {
    setTimeout(function () {    //  模擬網絡阻塞, 移除定時器
        var el, li, i;
        el =document.querySelector("#wrapper ul");
        el.innerHTML='';
        for (i=0; i<11; i++) {
            li = document.createElement('li');
            li.appendChild(document.createTextNode('async row ' + (++generatedCount)));
            el.insertBefore(li, el.childNodes[0]);
        }    
        myScroll.refresh();/******操作成后一定要記得刷新*****/
    }, 1000);
}
function Load() {
    setTimeout(function () {    //   模擬網絡阻塞, 移除定時器
        var el, li, i;
        el =document.querySelector("#wrapper ul");
        for (i=0; i<2; i++) {
            li = document.createElement('li');
            li.appendChild(document.createTextNode('async row ' + (++generatedCount)));
            el.appendChild(li, el.childNodes[0]);
        }
        myScroll.refresh();/******操作成后一定要記得刷新*****/
    }, 1000);
}
</script>
</body>
</html>

以上為上下拉時候的效果,上拉加載后就會依次往下增加ul的長度(因為增加了li),下拉刷新則只會顯示最新的11條信息。

iScroll中的參數:

在實例化iScroll的時候,可以傳入兩個參數,第一個參數是實例化的外層的DOM的ID,第二個參數是iScroll執行方法的對象:

第二個參數內容如下,這個參數會控制iScroll的效果:

hScroll        false 禁止橫向滾動 true橫向滾動 默認為true
vScroll        false 禁止垂直滾動 true垂直滾動 默認為true
hScrollbar     false隱藏水平方向上的滾動條
vScrollbar     false 隱藏垂直方向上的滾動條
fadeScrollbar  false 指定在無漸隱效果時隱藏滾動條
hideScrollbar  在沒有用戶交互時隱藏滾動條 默認為true
bounce         啟用或禁用邊界的反彈,默認為true
momentum       啟用或禁用慣性,默認為true,
               此參數在你想要保存資源的時候非常有用
lockDirection  false取消拖動方向的鎖定,
               true拖動只能在一個方向上(up/down 或者left/right)

當然在第二個參數中,也有一些方法可以執行:

(1)scrollTo(x, y, time, relative)方法:傳入4個參數:X軸滾動距離,Y軸滾動距離,效果時間,是否相對當前位置。
(2)refresh()方法:在DOM結構發生改變之后,需要刷新iScroll,否則滾動插件會實例化的不准確
(3)onPosChange,有沒有一個方法能返回位置的變化?你可以查詢一下自己所用的iScroll中有沒有onPosChange方法
(4)onScrollEnd:滾動結束時執行的事件,如果想在滾動結束時出發摸個事件,這個方法就拍上用處了
(5)onRefresh:在DOM結構發生改變之后,需要刷新iScroll,否則滾動插件會實例化的不准確,onRefresh是刷新完iScroll會執行的方法。
(6)onBeforeScrollStart:開始滾動前的時間回調,默認是阻止瀏覽器默認行為 。
(7)onScrollStart:開始滾動的回調。
(8)onBeforeScrollMove:在內容移動前的回調。
(9)onScrollMove:內容移動的回調。
(10)onBeforeScrollEnd:在滾動結束前的回調。
(11)onTouchEnd:手離開屏幕后的回調。
(12)onDestroy:銷毀實例的回調。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM