最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS異步觀察目標(biāo)元素方式完成分頁加載

 更新時(shí)間:2022年07月29日 14:28:01   作者:jsmask  
這篇文章主要為大家介紹了異步觀察目標(biāo)元素方式完成分頁加載示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

介紹

平時(shí)我們處理分頁加載時(shí),往往是通過滾動(dòng)條判斷是否到了容器底部再執(zhí)行的加載任務(wù)的,這樣有一個(gè)問題就是,不管滾動(dòng)條是否劃到底部位置,它都會(huì)運(yùn)行計(jì)算這個(gè)函數(shù)。

那么,如果能判斷底部的加載區(qū)域出現(xiàn)后再去執(zhí)行加載,不用再做滾動(dòng)條計(jì)算了,這樣豈不美哉。本期將以異步觀察目標(biāo)元素的新方式去完成分頁加載業(yè)務(wù)。

代碼

<div id="app" @vue:mounted="mounted" :class="{'active':active}">
  <ul>
    <li v-for="item in num"><span>{{item}}</span>
      <p></p>
    </li>'
    <div class="loading">
      <div ref="loading" v-show="!isLoading"></div>
      loading..
    </div>
  </ul>
</div>
#app{
  display: none;
  &.active{
    display: block;
  }
}
ul{
  width: 100%;
  li{
    width: 100%;
    height: 10vh;
    display: flex;
    align-items: center;
    justify-content: start;
    box-sizing: border-box;
    padding: 0 3%;
    position: relative;
    border-bottom: 1px solid #efefef;
    font-size: 14px;
    font-family: fantasy, Courier, monospace;
    span{
      display: inline-block;
      min-width: 30px;
      text-align: center;
    }
    p{
      flex: 1;
      height: 4vh;
      background-color: #e2e2e2;
      margin-left: 3%;
    }
  }
}
.loading{
  font-family: fantasy, Courier, monospace;
  display: flex;
  height: 15vh;
  align-items: center;
  justify-content: center;
  animation: loading 1s linear infinite;
}
@keyframes loading{
  0%,100%{
    opacity: 1;
  }
  50%{
    opacity:0;
  }
}
import { createApp } from 'https://unpkg.com/petite-vue?module'
createApp({
  num: 0,
  page:1,
  active:false,
  observer:null,
  isLoading:false,
  mounted() {
      this.active = true;
      this.loading = this.$refs.loading;
      this.observer= new IntersectionObserver(()=>{
         this.addNum();
      },{
        root:window.document,
        rootMargin:"0px 0px 0px 0px",
        threshold:0
      })
      this.observer.observe(this.loading)
      // this.observer.unobserve(this.loading)
  },
  addNum(){
    if(this.isLoading) return;
    this.isLoading = true;
    console.log(`loading,page:${this.page}`)
    setTimeout(()=>{ 
      this.num += 20;
      this.page ++;
      this.$nextTick(()=>{
          this.isLoading = false;
      })
    },1000)
  }
}).mount()

演示

正文

監(jiān)聽元素

IntersectionObserver() 對(duì)不少小伙伴來說可能是一個(gè)比較生疏的構(gòu)造器,你可以傳入監(jiān)聽區(qū)域,以及監(jiān)聽后的回調(diào)函數(shù),然后它會(huì)創(chuàng)建并返回一個(gè) IntersectionObserver 對(duì)象,而這個(gè)對(duì)象可以來完成監(jiān)聽某個(gè)目標(biāo)元素是否與該監(jiān)聽區(qū)域發(fā)生交叉,每次達(dá)到檢查閾值后都會(huì)觸發(fā)剛才傳入的回調(diào)函數(shù)。

// 獲取監(jiān)聽目標(biāo)
this.loading = this.$refs.loading;
// 用構(gòu)造器創(chuàng)建監(jiān)聽區(qū)域?qū)ο?
this.observer= new IntersectionObserver(()=>{
    this.addNum();
},{
    root:window.document, // 監(jiān)聽區(qū)域,默認(rèn)為整個(gè)可視窗體
    rootMargin:"0px 0px 0px 0px", // 類似margin,為邊界的偏移量用于判定范圍是否滿足計(jì)算需要,默認(rèn)0px 0px 0px 0px
    threshold:0  // 閾值(0-1),表示交叉區(qū)域的比例值,默認(rèn)為0
})
// 
this.observer.observe(this.loading)

根據(jù)以上代碼就可以在業(yè)務(wù)中,判斷元素是否出現(xiàn)在,只要達(dá)到閾值就會(huì)觸發(fā)回調(diào),在這個(gè)回調(diào)函數(shù)中你可以去完成加載列表等操作,從而代替頻繁用計(jì)算滾動(dòng)條的位置距離的困擾。

反復(fù)交叉

或許你在嘗試使用異步觀察目標(biāo)元素的這個(gè)寫法時(shí),會(huì)發(fā)現(xiàn)一個(gè)嚴(yán)重的問題,就是可能本想加載一次的任務(wù)突然出現(xiàn)兩次請(qǐng)求。這又是為什么呢?

其實(shí)就是因?yàn)?threshold 這個(gè)閾值,表示著交叉區(qū)域的比例值的,當(dāng)你進(jìn)入這個(gè)觀察區(qū)域的時(shí)候會(huì)觸發(fā),當(dāng)頁面內(nèi)容往下填充,會(huì)把監(jiān)聽目標(biāo)元素往下推,又到達(dá)了這個(gè)閾值從而又觸發(fā)了一次。

解決方案很簡單,就是加一個(gè) isLoading 開關(guān),在請(qǐng)求中的時(shí)候,把根據(jù)這個(gè)開關(guān)把監(jiān)聽目標(biāo)隱藏掉,等加載渲染結(jié)束之后,再顯示出來,就可以解決這個(gè)問題了。具體可以看演示的案例哦~

<div class="loading">
    <div ref="loading" v-show="!isLoading"></div>
    loading..
</div>

結(jié)語

以異步觀察目標(biāo)元素的方式來完成諸如此類的業(yè)務(wù)比如說分頁加載,觸發(fā)動(dòng)畫,阻止操作等等都是不錯(cuò)的選擇,而且從兼容性來看也可以放心在大多數(shù)現(xiàn)代瀏覽器中使用到它。

以上就是異步觀察目標(biāo)元素方式完成分頁加載的詳細(xì)內(nèi)容,更多關(guān)于異步觀察目標(biāo)元素分頁加載的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaScript的八種數(shù)據(jù)類型

    JavaScript的八種數(shù)據(jù)類型

    這篇文章主要分享的是JavaScript的八種數(shù)據(jù)類型,ES5的時(shí)候,我們大家認(rèn)知的數(shù)據(jù)類型是?6種的,但是ES6?中新增了一種?Symbol,谷歌67版本中還出現(xiàn)了一種?bigInt,是指安全存儲(chǔ)、操作大整數(shù),像下面文章我可沒就來看看這八種數(shù)據(jù)類型的詳細(xì)介紹吧
    2022-01-01
  • 跨端開發(fā)框架avm組件封裝經(jīng)驗(yàn)分享

    跨端開發(fā)框架avm組件封裝經(jīng)驗(yàn)分享

    這篇文章主要為大家介紹了跨端開發(fā)框架avm組件封裝的經(jīng)驗(yàn)分享,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Js視頻播放器插件Video.js使用方法詳解

    Js視頻播放器插件Video.js使用方法詳解

    Video.js 是一個(gè)通用的在網(wǎng)頁上嵌入視頻播放器的JS庫,Video.js自動(dòng)檢測(cè)瀏覽器對(duì)HTML5的支持情況,如果不支持HTML5則自動(dòng)使用Flash 播放器,推薦大家好好看看
    2020-02-02
  • 一文詳解webpack中l(wèi)oader與plugin的區(qū)別

    一文詳解webpack中l(wèi)oader與plugin的區(qū)別

    這篇文章主要為大家介紹了一文詳解webpack中l(wèi)oader與plugin的區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 前端Website?sitemap.xml文件搜索引擎優(yōu)化

    前端Website?sitemap.xml文件搜索引擎優(yōu)化

    這篇文章主要為大家介紹了前端Website的sitemap.xml文件和搜索引擎優(yōu)化實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • JS前端實(shí)現(xiàn)fsm有限狀態(tài)機(jī)實(shí)例詳解

    JS前端實(shí)現(xiàn)fsm有限狀態(tài)機(jī)實(shí)例詳解

    這篇文章主要為大家介紹了JS前端實(shí)現(xiàn)fsm有限狀態(tài)機(jī)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Css-In-Js實(shí)現(xiàn)classNames庫源碼解讀

    Css-In-Js實(shí)現(xiàn)classNames庫源碼解讀

    這篇文章主要為大家介紹了Css-In-Js實(shí)現(xiàn)classNames庫源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 微信小程序 生命周期和頁面的生命周期詳細(xì)介紹

    微信小程序 生命周期和頁面的生命周期詳細(xì)介紹

    這篇文章主要介紹了微信小程序 生命周期和頁面的生命周期詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 微信小程序 template模板詳解及實(shí)例代碼

    微信小程序 template模板詳解及實(shí)例代碼

    這篇文章主要介紹了微信小程序 template模板詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 微信小程序 教程之wxapp視圖容器 swiper

    微信小程序 教程之wxapp視圖容器 swiper

    這篇文章主要介紹了微信小程序 教程之wxapp視圖容器 swiper的相關(guān)資料,需要的朋友可以參考下
    2016-10-10

最新評(píng)論

长寿区| 西乌珠穆沁旗| 莆田市| 建瓯市| 东辽县| 都兰县| 和林格尔县| 曲松县| 剑阁县| 墨江| 桂平市| 平湖市| 海门市| 阜阳市| 怀宁县| 侯马市| 南乐县| 金沙县| 红原县| 定结县| 夹江县| 南岸区| 府谷县| 财经| 静海县| 台安县| 宝清县| 盘锦市| 车致| 上思县| 浮梁县| 天津市| 酉阳| 积石山| 略阳县| 栾川县| 肇东市| 酉阳| 广昌县| 天峻县| 凤台县|