ios瀏覽器調試踩坑(1)----mescroll.js和vue-scroller

来源:https://www.cnblogs.com/dnlm/archive/2019/06/20/11060160.html
-Advertisement-
Play Games

主要記錄在ios瀏覽器出現觸摸無限載入的情況 使用vue-scroller和mescroll.js/mescroll.vue先踩ios瀏覽器預設滑動會影響mescroll的方法調用。 首先給公共js加入以下代碼禁用我們的頁面在ios瀏覽器下會滑動上下頁面。 下麵給body設置樣式: html, bo ...


主要記錄在ios瀏覽器出現觸摸無限載入的情況

使用vue-scroller和mescroll.js/mescroll.vue先踩ios瀏覽器預設滑動會影響mescroll的方法調用。

首先給公共js加入以下代碼禁用我們的頁面在ios瀏覽器下會滑動上下頁面。

 

 

<script>
//禁止ios手機雙擊放大以及縮小
window.onload = function () {
// 阻止雙擊放大
var lastTouchEnd = 0;
document.addEventListener('touchstart', function (event) {
if (event.touches.length > 1) {
event.preventDefault();
}
});
document.addEventListener('touchend', function (event) {
var now = (new Date()).getTime();
if (now - lastTouchEnd <= 300) {
event.preventDefault();
}
lastTouchEnd = now;
}, false);

// 阻止雙指放大
document.addEventListener('gesturestart', function (event) {
event.preventDefault();
});



//在ios瀏覽器調試的時候禁止頁面滾動
var ios = navigator.userAgent.indexOf('iPhone');//判斷是否為ios
if (ios != -1) {
//ios下運行
var scroll = document.getElementById("scroll")//你需要滑動的dom元素
touchScroll(scroll);
}

var canScroll = true;
function touchScroll(el) {
canScroll = false;
//el需要滑動的元素
el.addEventListener('touchmove', function (e) {
canScroll = true;
})
document.body.addEventListener('touchmove', function (e) {
//       alert(canScroll);
if (!canScroll) {
e.preventDefault(); //阻止預設事件(上下滑動)
} else {
//需要滑動的區域
var top = el.scrollTop; //對象最頂端和視窗最頂端之間的距離
var scrollH = el.scrollHeight; //含滾動內容的元素大小
var offsetH = el.offsetHeight; //網頁可見區域高
var cScroll = top + offsetH; //當前滾動的距離

//被滑動到最上方和最下方的時候
if (top == 0) {
top = 1; //0~1之間的小數會被當成0
} else if (cScroll === scrollH) {
el.scrollTop = top - 0.1;
}
}
}, { passive: false }) //passive防止阻止預設事件不生效
}
}

</script>

 

      下麵給body設置樣式:  
 
html,
body {
height: 100%;
width: 100%;
position: fixed;
top: 0;
left: 0;
}

 

  接下來就是vue頁面使用vue-scroller或者mescroll.js/mescroll.vue;   mescroll.js    
<template>
<div class="bg-box">
<div id="mescroll" class="mescroll">
<div>
<mescroll-vue ref="mescroll" :down="mescrollDown" :up="mescrollUp" @init="mescrollInit" class="scrollView">
<div class="invoiceList">
<div v-for="(item,index) in invoiceList" class="invoiceList-box" :key="index">
<a :class="item.isShow?'items-selected':'items'" @click="onItemClick(item,index)"></a>
<div class="information">
<p class="numvber">單號:{{item.OrderNo}}</p>
<p><span class="icon1"></span>始發地 ———— 目的地</p>
<p><span class="icon2"></span>件數 : {{item.Pse}}件</p>
<p><span class="icon2"></span>重量 : {{item.Weight}}KG</p>
<p class="invoicedate">{{item.DownOrderTime}}</p>
</div>
<p class="price">¥{{item.TotalMoney}}</p>
</div>
</div>
</mescroll-vue>
</div>
</div>
</div>
</template>

<script>
import MescrollVue from "mescroll.js/mescroll.vue";
export default {
components: {
MescrollVue
},
data() {
return {
mescroll: null, // mescroll實例對象
mescrollDown: {}, //下拉刷新的配置. (如果下拉刷新和上拉載入處理的邏輯是一樣的,則mescrollDown可不用寫了)
mescrollUp: {
// 上拉載入的配置.
callback: this.upCallback, // 上拉回調,此處簡寫; 相當於 callback: function(page, mescroll) { }
//以下是一些常用的配置,當然不寫也可以的.
page: {
num: 0, //當前頁 預設0,回調之前會加1; 即callback(page)會從1開始
size: 5 //每頁數據條數,預設10
},
noMoreSize: 5, //如果列表已無數據,可設置列表的總數量要大於5才顯示無更多數據;避免列表數據過少(比如只有一條數據),顯示無更多數據會不好看
toTop: {
//回到頂部按鈕
src: "./static/mescroll/mescroll-totop.png", //圖片路徑,預設null,支持網路圖
offset: 1000 //列表滾動1000px才顯示回到頂部按鈕
},
htmlContent:
'<p class="downwarp-progress"></p><p class="downwarp-tip">下拉刷新 </p>', //佈局內容
empty: {
//列表第一頁無任何數據時,顯示的空提示佈局; 需配置warpId才顯示
warpId: "xxid", //父佈局的id (1.3.5版本支持傳入dom元素)
icon: "./static/mescroll/mescroll-empty.png", //圖標,預設null,支持網路圖
tip: "暫無相關數據~" //提示
}
}
};
},
beforeRouteEnter(to, from, next) {
// 如果沒有配置回到頂部按鈕或isBounce,則beforeRouteEnter不用寫
next(vm => {
vm.$refs.mescroll.beforeRouteEnter(); // 進入路由時,滾動到原來的列表位置,恢復回到頂部按鈕和isBounce的配置
});
},
beforeRouteLeave(to, from, next) {
// 如果沒有配置回到頂部按鈕或isBounce,則beforeRouteLeave不用寫
this.$refs.mescroll.beforeRouteLeave(); // 退出路由時,記錄列表滾動的位置,隱藏回到頂部按鈕和isBounce的配置
next();
},
methods: {
mescrollInit(mescroll) {
this.mescroll = mescroll;
},
upCallback(page, mescroll) {
let data = {};
data.uId = 1;
data.type = 10;
data.pageIndex = page.num;
data.pageSize = page.size;
let str = `uId=${data.uId}&type=${data.type}&pageIndex=${
data.pageIndex
}&pageSize=${data.pageSize}`;
this.$http.get(str) //地址換成自己的
.then(res => {
if (res && res.Total > 0) {
if (page.num == 1) {
this.invoiceList = [];
}
this.invoiceList = this.invoiceList.concat(res.DataList);
this.invoiceList.map(item => {
this.$set(item, "isShow", false);
});
this.$nextTick(() => {
mescroll.endSuccess(res.DataList.length);
});
}
})
.catch(e => {
mescroll.endErr();
});
}
}
};
</script>
<style lang="less" scoped>
.mescroll {
position: absolute;
width: 100%;
height: 100%;
top: 0;
bottom: 0;
left: 0;
right: 0;
background: #eee;
overflow: auto;
-webkit-overflow-scrolling: touch;
.mescroll {
position: fixed;
top: 0;
bottom: 0;
height: auto;
}
}
</style>

 

  效果

 

vue-scroller(在main.js引入就不需要再引入了)   附代碼:    
<template>
<div>
<div class="content">
<div class="content-box">
<scroller :on-refresh="refresh" :on-infinite="infinite" ref="scrollerBottom" refresh-layer-color="#4b8bf4" loading-layer-color="#ec4949">
<!-- 上拉刷新動畫 -->
<svg class="spinner" style="stroke: #4b8bf4;" slot="refresh-spinner" viewBox="0 0 64 64">
<g stroke-width="7" stroke-linecap="round">
<line x1="10" x2="10" y1="27.3836" y2="36.4931">
<animate attributeName="y1" dur="750ms" values="16;18;28;18;16;16" repeatCount="indefinite"></animate>
<animate attributeName="y2" dur="750ms" values="48;46;36;44;48;48" repeatCount="indefinite"></animate>
<animate attributeName="stroke-opacity" dur="750ms" values="1;.4;.5;.8;1;1" repeatCount="indefinite"></animate>
</line>
<line x1="24" x2="24" y1="18.6164" y2="45.3836">
<animate attributeName="y1" dur="750ms" values="16;16;18;28;18;16" repeatCount="indefinite"></animate>
<animate attributeName="y2" dur="750ms" values="48;48;46;36;44;48" repeatCount="indefinite"></animate>
<animate attributeName="stroke-opacity" dur="750ms" values="1;1;.4;.5;.8;1" repeatCount="indefinite"></animate>
</line>
<line x1="38" x2="38" y1="16.1233" y2="47.8767">
<animate attributeName="y1" dur="750ms" values="18;16;16;18;28;18" repeatCount="indefinite"></animate>
<animate attributeName="y2" dur="750ms" values="44;48;48;46;36;44" repeatCount="indefinite"></animate>
<animate attributeName="stroke-opacity" dur="750ms" values=".8;1;1;.4;.5;.8" repeatCount="indefinite"></animate>
</line>
<line x1="52" x2="52" y1="16" y2="48">
<animate attributeName="y1" dur="750ms" values="28;18;16;16;18;28" repeatCount="indefinite"></animate>
<animate attributeName="y2" dur="750ms" values="36;44;48;48;46;36" repeatCount="indefinite"></animate>
<animate attributeName="stroke-opacity" dur="750ms" values=".5;.8;1;1;.4;.5" repeatCount="indefinite"></animate>
</line>
</g>
</svg>
<div class="invoiceList">
<div v-for="(item,index) in invoiceList" class="invoiceList-box" @click="InvoiceDetails(item)" :key="index">
<div class="slecets">
</div>
<div class="information">
<p class="numvber">單號:{{item.OrderNo}}</p>
<p><span class="icon1"></span>始發地 ———— 目的地</p>
<p><span class="icon2"></span>件數 : {{item.Pse}}件</p>
<p><span class="icon2"></span>重量 : {{item.Weight}}KG</p>
<p class="invoicedate">{{item.DownOrderTime}}</p>
</div>
<p class="bitch">已開發票</p>
<p class="price">¥{{item.TotalMoney}}</p>
</div>
</div>
<!-- 下拉載入動畫 -->
<svg class="spinner" style="fill: #ec4949;" slot="infinite-spinner" viewBox="0 0 64 64">
<g>
<circle cx="16" cy="32" stroke-width="0" r="3">
<animate attributeName="fill-opacity" dur="750ms" values=".5;.6;.8;1;.8;.6;.5;.5" repeatCount="indefinite"></animate>
<animate attributeName="r" dur="750ms" values="3;3;4;5;6;5;4;3" repeatCount="indefinite"></animate>
</circle>
<circle cx="32" cy="32" stroke-width="0" r="3.09351">
<animate attributeName="fill-opacity" dur="750ms" values=".5;.5;.6;.8;1;.8;.6;.5" repeatCount="indefinite"></animate>
<animate attributeName="r" dur="750ms" values="4;3;3;4;5;6;5;4" repeatCount="indefinite"></animate>
</circle>
<circle cx="48" cy="32" stroke-width="0" r="4.09351">
<animate attributeName="fill-opacity" dur="750ms" values=".6;.5;.5;.6;.8;1;.8;.6" repeatCount="indefinite"></animate>
<animate attributeName="r" dur="750ms" values="5;4;3;3;4;5;6;5" repeatCount="indefinite"></animate>
</circle>
</g>
</svg>
</scroller>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
invoiceList: [],
pageIndex: 0,
pageSize: 5,
noDate: false
};
},
mounted() {},
methods: {
//獲取開票歷史列表
InvoiceList(offset, fn) {
let data = {};
data.uId = 1;
data.type = 20;
data.pageIndex = offset;
data.pageSize = this.pageSize;
let str = `uId=${data.uId}&type=${data.type}&pageIndex=${
data.pageIndex
}&pageSize=${data.pageSize}`;
this.$http.get(str).then(res => { //一樣換成自己的介面
if (res && res.Total > 0) {
let maxNum = Math.ceil(res.Total / data.pageSize); //判斷總共有多少頁

if (offset > maxNum) {
//如果當前頁大於總頁數判斷顯示沒有更多數據
fn(true);
return;
} else {
if (fn) {
fn();
}
}
if (this.pageIndex == 1) {
this.invoiceList = res.DataList;
} else {
this.invoiceList = this.invoiceList.concat(res.DataList);
}
}
});
},
//下拉刷新
refresh(done) {
this.pageIndex = 1;
setTimeout(() => {
this.InvoiceList(1, done);
}, 1500);
},
//上拉載入數據
infinite(done) {
setTimeout(() => {
this.pageIndex++;
this.InvoiceList(this.pageIndex, done);
}, 1500);
}
}
};
</script>
<style lang="less" scoped>
@import "../../main.less";
.content {
text-align: center;
height: 100%;
overflow: hidden;
.content-box {
position: absolute;
width: 100%;
top: 3.14rem;
bottom: 0;
left: 0;
right: 0;
background: #eee;
}
}
</style>

 

 

 

  安裝教程我就不貼了,自行百度。。。   踩坑之路。莫噴。。。。    
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 效果圖: 代碼: ...
  • 一、項目概況 基於react+react-dom+react-router-dom+redux+react-redux+webpack2.0+react-photoswipe+swiper等技術混合開發的手機端仿微信界面聊天室——reactChatRoom,實現了聊天記錄下拉刷新、發送消息、表情(動 ...
  • // ready 在DOM載入完成時運行的代碼 $(document).ready(function(){ // 在這裡寫代碼... }) // 可以簡寫為 $(function(){ // 在這裡繼續使用$作為別名... }) // load 頁面載入完畢後運行代碼 $(document).loa ...
  • 說到Tab切換,你可能首先想到的就是使用jQuery,短短幾行代碼就可以輕鬆搞定一個Tab切換。 而今天所要分享的,是使用 0 行JS代碼來實現Tab切換! 具體效果如下: Tab切換 方法一:模擬單選框原理 關於模擬單選框,在我之前文章中有講到,詳情請戳→純CSS模擬單選框和覆選框 該方法大致原理 ...
  • css等比例分割父級容器(完美三等分) 父級容器的寬度一定,要實現子元素等比例完美均分父級寬度,實現方式有哪些? html部分代碼: 方法一: 浮動佈局+百分比 (將子元素依次左浮動,根據子元素的個數,設定每個子元素的寬度百分比) 方法二:行內元素(inline-block)+百分比 方法三: 父元 ...
  • 基本打包機制 本質上,webpack 是一個現代 JavaScript 應用程式的靜態模塊打包器(module bundler)。當 webpack 處理應用程式時,它會遞歸地構建一個依賴關係圖(dependency graph),其中包含應用程式需要的每個模塊,然後將所有這些模塊打包成一個或多個 ...
  • 將多個*.ts文件打包成一個*.min.js文件的開發配置 1、初始化 新建以下文件目錄: 2、安裝依賴: 3、tsconfig.json 參數含義參考https://www.tslang.cn/docs/handbook/compiler-options.html 4、babelrc useBui ...
  • 一. 現狀 由於之前採用Lodop列印控制項(商業版付費,可以使用免費版 但是會有水印)去列印小票,是一行一行的列印,但是不滿足UI給到複雜佈局的小票樣式,所以得重新考慮如何來實現。 二. 介紹 art template介紹 art template 是一個簡約、超快的模板引擎。 它採用作用域預聲明的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...