ios浏览器调试踩坑(1)----mescroll.js和vue-scroller
主要记录在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>
html,
body {
height: 100%;
width: 100%;
position: fixed;
top: 0;
left: 0;
}
<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>
<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>
ios浏览器调试踩坑(1)----mescroll.js和vue-scroller的更多相关文章
- React-Native 真机调试踩坑指南
继上一篇基础安装踩坑继续我们的踩坑之旅,备注一下以下仅针对Mac环境-- 安卓 1.adb 找不到命令? Adb的全称为Android Debug Bridge,就是起到调试桥的作用,真机调试安卓必备 ...
- Android NDK中的C++调试踩坑标记
RT, Android NDK中的C++调试, GDB调试比较麻烦,在ADT Eclipse中: 1.配置好NDK给工程加上Native Support 2.编译中加上NDK_DEBUG=1 3.然后 ...
- JS014. toFixed( )调试踩坑 - 浏览器思维 点常量 & 点运算符
Number.prototype.toFixed( ) 在观察toFixed()丢失精度问题,和对toFixed()方法重写的调试过程时,发现toFixed()对Number的识别有它自己的规则,并找 ...
- LoRaWAN调试踩坑心得(一)
先说两句 在调试和移植的过程中 我们经常想用节点去抓上行包 或者去抓下行包 但在抓取的过程中发现,上行包抓取不到到,或是下行包抓取不到,或者是两个都抓取不到,觉得非常的诡异.明明接收频点.BW和SF都 ...
- LoRaWAN调试踩坑心得(二)
先说两句 抱歉,由于工作原因和个人原因,中间停更了这么久.接下来,本人会继续往下更,内容包括但不仅限于LoRa.文章还是会按照个人的习惯,坚持原创,一是作为自己的笔记,二是和广大工程师分享交流. Lo ...
- axios踩坑记录+拦截器使用+vue cli代理跨域proxy+webpack打包部署到服务器
1.小小的提一下vue cli脚手架前端调后端数据接口时候的本地代理跨域问题,如我在本地localhost访问接口http://40.00.100.100:3002/是要跨域的,相当于浏览器设置了一道 ...
- Vue踩坑第一步,安装Vue最新版本
学习vue第一步肯定是安装vue-cli,那么肯定想去搜下如何安装vue-cli呢? 网上搜到的结果大都是: npm i vue-cli -g 输入vue -V发现: 输入node -v发现: 自己明 ...
- html2canvas截屏在H5微信移动端踩坑,ios和安卓均可显示
1.最近在做移动端开发,框架是vue,一产品需求是,后台返回数据,通过qrcode.js(代码比较简单,百度上已经很多了)生成二维码,然后通过html2canvas,将html元素转化为canvas, ...
- C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式
C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...
随机推荐
- [收藏]Dubbo官方资料
首页 || 下载 || 用户指南 || 开发者指南 || 管理员指南 || 培训文档 || 常见问题解答 || 发布记录 || 发展路线 || 社区 English ...
- gyp编译工具
最近用到了 node-gyp 这个工具, 是node 社区对 google gyp 编译工具的一个封装, 使用 node-gyp 工具可以用C++为node 项目编写 addon. 了解了一下 goo ...
- 微软发布Visual Studio Online公共预览版和ML.NET 1.4
在今天的Ignite 2019上,Microsoft启动了 Visual Studio Online 公共预览版.Visual Studio Online将Visual Studio,云托管的开发人员 ...
- 无序数组中用 快速排序的分治思想 寻找第k大元素
#include <stdio.h> int *ga; int galen; void print_a(){ ; i < galen; i++){ printf("%d & ...
- go读取配置模块viper
这个可以常常和cobra配合. 来个demo package main import ( "fmt" "github.com/spf13/viper" ) fu ...
- 1. java 基本规则
一.命名规范 1. 类名规范:首字母大写,后面每个单词首字母大写(大驼峰式),HelloWorld 2. 变量名规范:首字母小写,后面每个单词首字母大写(小驼峰式),helloWorld 3. 方法名 ...
- CF1252J Tiling Terrace
CF1252J Tiling Terrace 洛谷评测传送门 题目描述 Talia has just bought an abandoned house in the outskirt of Jaka ...
- windows/tomcat 修改java虚拟机JVM以utf-8字符集加载class文件的两种方式
1.情景展示 做了这么长时间的java开发,但是,你知道JVM是以怎样的编码加载.解析class文件的吗? 我们知道,通常情况下,我们会将java文件的字符集修改成utf-8,这样,理所当然地就认 ...
- [算法模版]Tarjan爷爷的几种图论算法
[算法模版]Tarjan爷爷的几种图论算法 前言 Tarjan爷爷发明了很多图论算法,这些图论算法有很多相似之处(其中一个就是我都不会).这里会对这三种算法进行简单介绍. 定义 强连通(strongl ...
- Uboot启动流程分析(三)
1.前言 在前面的文章Uboot启动流程分析(二)中,链接如下: https://www.cnblogs.com/Cqlismy/p/12002764.html 已经对_main函数的整个大体调用流程 ...