1. 程式人生 > >關於手機端滾動載入更多多次觸發事件問題

關於手機端滾動載入更多多次觸發事件問題

在做手機端滾動載入更多時,因為滾動是一個持續過程,所以就導致了會一次或很短時間內觸發多次ajax請求,  可以設定一個全域性變數控制.

// bool變數, 用於阻止滾動到底部連續觸發多次

  let isBottom = true

const scrollHeight = element.currentTarget.scrollHeight
const scrollTop = element.currentTarget.scrollTop
// height - top - 容器高度
const scrollLength = scrollHeight - scrollTop
const liBottom = scrollLength - newsContainer
if (liBottom > 100 && liBottom < 180) {
  if (isBottom === true) {
    isBottom = false
    // $(ajax)
  }
}

然後取消false,百度很多都是設定延遲1秒種取消,我是用的滾動條高度

if (liBottom > 1000) {
      isBottom = true
    }
  // 視訊模板
  const vTemple = (url, title, image, visit, catName) => {
    const res = `<li class="articles-list-normal">
    <div class="article-info-img">
    <h3 class="article-title"><a href="${url}">${title}</a></h3>
    </div>
    <div class='article-img-big'>
    <a href="${url}"><img src="${image}" /></a>
    </div>
    <div class="img-bg">
    <a href="${url}"></a>
    </div>
    <div class="video-click">
      <a href="${url}">
        <img src="/client/images/mobile/icons/play1.png" />
      </a>
    </div>
    <div class="time">閱讀量:${visit}    ${catName}</div>
    </li>`
    return res
  }
  // 無內容
  const noTemple = () => {
    const res = '<li class="article-end">再怎麼拉都沒有啦,不如看看其他版塊內容吧!</li>'
    return res
  }
  // 分頁
  let currentPage = 1
  // 分類id
  let categoryId = 0
  // 使用者id
  let userId = 0
  // bool變數, 用於阻止滾動到底部連續觸發多次
  let isBottom = true
  const windowHeight = $(window).height()
  // 列表容器高度
  const newsContainer = windowHeight - 120
  // 設定容器高度
  $('.mobile-main .m-news-list-tit').css('height', `${newsContainer}px`)
  // 滾動監聽
  $('.mobile-main .m-news-list-tit').on('scroll', (element) => {
    const scrollHeight = element.currentTarget.scrollHeight
    const scrollTop = element.currentTarget.scrollTop
    // height - top - 容器高度
    const scrollLength = scrollHeight - scrollTop
    const liBottom = scrollLength - newsContainer
    if (liBottom > 100 && liBottom < 250) {
      if (isBottom === true) {
        // isBottom 為false 防止連續下拉載入多次
        isBottom = false
        categoryId = $(element.currentTarget).find('#categoryId').val()
        userId = $(element.currentTarget).find('#userId').val()
        const nextPage = currentPage + 1
        const ajaxOptions = {
          method: 'POST',
          data: {
            id: categoryId,
            user_id: userId,
            page: nextPage
          }
        }
        let articleList = ''
        $.ajax('xxxxxx', ajaxOptions).done((data) => {
          const articles = data.articles
          articles.forEach((article) => {
            let url = article.url
            if (article.url === '') {
              url = `/articles/${article.id}`
            }
            const title = article.title
            let image = article.image 
            const visit = article.visit
            const catName = article.name
            articleList = vTemple(url, title, image, visit, catName)
            $(element.currentTarget).find('.articles-list-summary').append(articleList)
          })
          if (articles.length > 0 && articles.length < 19) {
            articleList = noTemple()
            $(element.currentTarget).find('.articles-list-summary').append(articleList)
          }
        }).fail(() => {
          // no data
        })
        // 下一頁
        currentPage = nextPage
      }
    }
    // 當滾動條高度變化後讓isBottom為true
    if (liBottom > 1000) {
      isBottom = true
    }
  })

相關推薦

關於手機滾動載入多多觸發事件問題

在做手機端滾動載入更多時,因為滾動是一個持續過程,所以就導致了會一次或很短時間內觸發多次ajax請求,  可以設定一個全域性變數控制.// bool變數, 用於阻止滾動到底部連續觸發多次  let isBottom = trueconst scrollHeight = ele

手機滾動分頁載入資料模型

說明:執行demo的時候請將瀏覽器模式調整到蘋果5 <!DOCTYPE html> <html lang="en"> <head> <meta

手機掃描識別車牌二開發接口

識別 ocr 靜態 過大 描述 規範 角度 發的 靜態庫 支持android、ios等多種主流移動操作系統。Android平臺提供Jar包,IOS平臺提供.a靜態庫,該產品期初僅支持拍照識別車牌,如今技術日新月異,用手機掃描識別車牌已經不是什麽難事兒。從原本的采用手機、平

手機滑動載入分頁

html:  <div class="title">     <a href="javascript:history.go(-1);" class="a"><i class="icon-angle-left"><

微信小程式實現滾動載入

微信小程式實現滾動載入更多 1.需要用到的元件和api scroll-view(可滾動檢視區域) wx.showToast(OBJECT)顯示訊息提示窗 2.需要用到的屬性  

移動滾動載入資料實現

模擬場景:移動端上劃到底,載入更多資料。 1、本例子基於jQuery實現。監聽滾動事件。 $(function(){ $(window).scroll(function(){ }) }) 2、獲取滾動條到文件頂部的距離,上圖scrollTop那段。原生JS可用document.documentElement

無限滾動載入(第一請求完成後才發第二請求)

var time1; var srcollOld = 0,srcollNow = 0,scrollFun = false; $(window).scroll(function () { //$(w

手機滾動頁面到一定程度出現特效

手機端不支援監聽滾動的距離(慣性滾動的距離),因此可使用下面的方式來實現:當滑動手機頁面到一定程度時,實現某些特效。 思路: 定義一個變數記錄所要滑動的最大距離 利用setInterval(function(){},1)。 解釋為什麼要使用setInt

jquery weui實現多tab非同步滾動載入

<html class="pixel-ratio-1"> <head> <title>多tab實現ajax滾動載入更多</title> <meta charset="utf-8"> <

vue中實現滾動載入

在以前的前端刀耕火種時代要實現滾動載入更多想要大家都是很快實現了,在vue會有一點麻煩,最近自己研究了一下,做了一個簡單的demo,供大家參考: <template> <div> <ul>

jquery weui ajax滾動載入

手機端使用jquery weui製作ajax滾動載入更多。 程式碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

JQuery滾動載入多資料例項

載入更多資料,這是現在網頁的基本需求,由於本人菜鳥,一直都不會,現在有時間了好好研究了下,以豆瓣API為例: <div class="container"> <div class="top">

touchstart, touchmove, touchend, mousedown, mousemove, mouseup, 手機和pc端點選及觸控事件

touchstart事件:當手指觸控式螢幕幕時候觸發,即使已經有一個手指放在螢幕上也會觸發。 touchmove事件:當手指在螢幕上滑動的時候連續地觸發。在這個事件發生期間,呼叫preventDefault()事件可以阻止滾動。 touchend事件:當手指從螢幕上離開的時候觸發。 to

JS jQuery滾動條下拉到底觸發事件

var edit=true;//可控元素         $(window).scroll(            &n

滾動螢幕至最下方觸發事件原始碼分享

//文件高度 function getDocumentTop() {     var scrollTop = 0,     bodyScrollTop = 0,     documentScrollTop = 0; &n

angularjs之手機輸入法回車變搜尋,並觸發事件,相容pc回車事件

一、效果:回車按鈕變搜尋 之前的輸入法: 之後的輸入法:   二、功能實現 <input type="search" id="search_input" placeholder="請輸入" ng-keypress="search($event)"/>   1

H5手機iOS,安卓長按事件的解決方案

之前做手機端遊戲的開發,遇到了需要點選事件、長按事件來觸發‘上下左右’的場景,由於專案很急(好吧,其實是自己懶),網上直接搜尋外掛,痛快,不過提交測試悲劇了,ios非常正常,安卓就不行了,趕緊看了原始碼,我的天,看不懂,壓縮的什麼鬼(此處不貼圖了)。好吧,還是自己寫吧,仔細回

javascript的奇怪的問題,滑鼠點選偶數觸發事件,單數觸發事件

編寫前臺頁面的javascipt程式碼時遇到的奇怪問題,排查了幾個小時,一開始抓不到頭緒,後來跟蹤javascipt程式碼時,發現該事件被累計觸發了,所以一次靈光、一次不靈光,仔細研究程式碼,發現,每次處理過程中,javascript程式都會在它的父節點註冊一回該事件,雖然

【轉】js在頁面滾動到一定位置時觸發事件

function getTop(e) { var offset=e.offsetTop; if(e.offsetParent!=null) //只要還有父元素,也就是當前元素不是根節點就繼續往上累計元素的高度 offset+=getTop(e

手機和pc端點選及觸控事件

touchstart事件:當手指觸控式螢幕幕時候觸發,即使已經有一個手指放在螢幕上也會觸發。 touchmove事件:當手指在螢幕上滑動的時候連續地觸發。在這個事件發生期間,呼叫preventDefault()事件可以阻止滾動。 touchend事件:當手指從螢幕上離開的時候