/**
* 仅做到底自动刷新功能
* options: {
* page int 当前在第几页
* limit int 每页个数
* onBottom function 到底的回调
* whenEnd function 结束时的回调
* dontWait bool 不等待第一个回调执行完毕就可以执行第二个
* autoFull bool 是否在上一个回调执行完后自动定时再检测一次 这个与dontWait慎用
* delay int 上一个参数的时间(毫秒)
* toTop int 到元素下边框(不含)之前几像素就开始加载
* }
*/
class idkScroll {
constructor(node, { page = 0, limit = 10, onBottom = function () { }, whenEnd = function () { }, dontWait = false, autoFull = true, delay = 100, toTop = 0 } = {}) {
if (node.constructor === String) {
node = $(node).get(0);
}
this.node = node; this.length = page * limit; this.total = null; this.limit = limit; this.onBottom = onBottom; this.whenEnd = whenEnd; this.dontWait = dontWait; this.autoFull = autoFull; this.delay = delay; this.toTop = toTop; // 是否正在等待回复 当this.dontWait为true时忽略
this.waitForReturn = false; let that = this;
this.proxyFunc = function () {
that.checkBottom.apply(that);
}; // 开始检测
this.scroll("on");
}
// 开启或关闭滚动检测(是否停止检测)
scroll(str) {
if (str == "on") {
// 开始检测
// 默认执行一遍
this.checkBottom(); // 开启滚动检测
$(document).scroll(this.proxyFunc);
}
if (str == "off") {
// 停止检测
$(document).off("scroll", this.proxyFunc);
}
}
// 检查是否到底
checkBottom() {
// 合理运用表达式排序和短路来减少时间复杂度(省不了多少)
// 只算实际高度+内边距
if (
// 没有加载完成为true 利用编程语言对或的短路来规避this.total没有值的情况
(this.total == null || this.length < this.total) &&
// 没有正在等待回应或开启了不等待模式为true
(!this.waitForReturn || this.dontWait) &&
// 窗口下边框之后this.toTop像素的高度大于等于元素下边框(不含)的高度为true
$(document).scrollTop() + $(window).height() + this.toTop >= $(this.node).offset().top + $(this.node).innerHeight()
) {
this.waitForReturn = true;
this.onBottom(Math.ceil(this.length / this.limit) + 1, this.limit, this.node, this);
}
}
// 回调的回调 代表加载完成,可以继续检测
end(length, total) {
if (!this.dontWait && !this.waitForReturn) {
return;
} this.total = total; this.length += length; this.waitForReturn = false; if (this.isEnd()) {
// 停止检测
this.scroll("off"); // 运行结束函数
this.whenEnd(this.node, this);
} else {
if (this.autoFull) {
// 小心处理异步this,setTimeout里的this将会被替换为globalThis
let that = this;
setTimeout(function () {
that.checkBottom.apply(that);
}, this.delay);
}
}
}
// 检查结束
isEnd() {
return this.length >= this.total;
}
} // 实例
// 传入两个参数
// 一个是css选择器或者网页元素
// 一个是options选项
let idkscroll = new idkScroll("body", {
// 到元素的底部运行
onBottom: function () {console.log("bottom", arguments); idkscroll.end(1, 1)},
// 结束时运行
whenEnd: function () {console.log("end", arguments);},
// 每页两条数据
limit: 2,
// 窗口下边框之后toTop像素的高度大于等于元素下边框(不含)的高度就触发onBottom的函数
toTop: $(window).height()
});
console.log(idkscroll);

发这篇博客大部分是表达我还没死

哦吼吼,能看到这个链接就说明我的文章被爬虫爬了

请尊重原作者: https://www.cnblogs.com/dffxd/

jquery随手做的一个滚动库 我称之为 idkScroll的更多相关文章

  1. 学以致用:手把手教你撸一个工具库并打包发布,顺便解决JS浮点数计算精度问题

    本文讲解的是怎么实现一个工具库并打包发布到npm给大家使用.本文实现的工具是一个分数计算器,大家考虑如下情况: \[ \sqrt{(((\frac{1}{3}+3.5)*\frac{2}{9}-\fr ...

  2. 你不需要 jQuery,但你需要一个 DOM 库

    写这篇文章的目的,一方面是介绍一下自己编写的模块化 DOM 库 domq.js,另一方面是希望大家对 jQuery 有一个正确的认识,即使 jQuery 已经逐渐退出历史舞台,但是它的 API 将会以 ...

  3. jQuery 是javascript的一个库(常用插件、处理器)

    jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation jQuery就是javascript的一个库,把我 ...

  4. 利用jquery+iframe做一个ajax上传效果

    以下是自学it网--中级班上课笔记 网址:www.zixue.it html页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict ...

  5. 自定义Jquery插件——由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件

    由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件下面是代码: // 掉用方式支持 $('select').textBeauty(1 ...

  6. 从开发属于你自己的第一个 Python 库,做一名真正的程序员「双语版」

    你好,我是悦创.之前我在 CSDN 编写了一篇开发 Python 库的教程,有人加我提问到的一些问题,我来更新一下这篇文章:https://blog.csdn.net/qq_33254766/arti ...

  7. FullPage.js-基于 jQuery 的插件全屏滚动插件

    fullPage.js 是一个基于 jQuery 的插件,它能够很方便.很轻松的制作出全屏网站.如今我们经常能见到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容, ...

  8. 【转载】写一个js库需要怎样的知识储备和技术程度?

    作者:小爝链接:https://www.zhihu.com/question/30274750/answer/118846177来源:知乎著作权归作者所有,转载请联系作者获得授权. 1,如何编写健壮的 ...

  9. 创建你的第一个JavaScript库

    是否曾对Mootools的魔力感到惊奇?是否有想知道Dojo如何做到那样的?是否对jQuery感到好奇?在这个教程中,我们将了解它们背后的东西并且动手创建一个超级简单的你最喜欢的库. 我们其乎每天都在 ...

  10. 十二步创建你的第一个JavaScript库

    是否曾对Mootools的魔力感到惊奇?是否有想知道Dojo如何做到那样的?是否对jQuery感到好奇?在这个教程中,我们将了解它们背后的东西并且动手创建一个超级简单的你最喜欢的库. 我们其乎每天都在 ...

随机推荐

  1. SQLSERVER 快照隔离级别 到底怎么理解?

    一:背景 1. 讲故事 上一篇写完 SQLSERVER 的四个事务隔离级别到底怎么理解? 之后,有朋友留言问什么时候可以把 snapshot 隔离级别给补上,这篇就来安排,快照隔离级别看起来很魔法,不 ...

  2. Servlet HTTP Request Response笔记

    # 今日内容:    1. Servlet    2. HTTP协议    3. Request## Servlet:    1. 概念    2. 步骤    3. 执行原理    4. 生命周期  ...

  3. Vue过滤案例、按键修饰符、数据双向绑定

    目录 Vue过滤案例.按键修饰符.数据双向绑定 一.v-for能循环的类型 二.js的几种循环方式 三.key值的解释 四.数组.对象的检测与更新 五.input的几个事件 六.事件修饰符 七.按键修 ...

  4. 学习Java Day24

    今天明白了 一.面向对象(面向过程) 1. 面向对象 找对象(封装了过程)来干. 例如:洗衣服(洗衣机就是对象). 2. 面向对象思想特点 是一种更符合我们思想习惯的思想. 可以将复杂的事情简单化.  ...

  5. MFC中的RTTI(Runtime Type Identification, 运行时类型识别)详解(参考《深入浅出MFC》)

    在MFC中的RTTI的实现,主要是利用一个名为CRuntimeClass的结构来链接各个"有关系的类"的信息来实现的.简单来说,就是在需要用到RTTI技术的类内建立CRuntime ...

  6. 最大K段和

    题目大意 有一个长度为 \(N\) 的序列 \(A\) .他希望从中选出不超过 \(K\) 个连续子段,满足它们两两不相交,求总和的最大值(可以一段也不选,答案为 \(0\)). 分析 很容易想到 \ ...

  7. 如何基于IM即时通讯SDK从零开发仿微信聊天交友功能

    IM即时通讯技术的发展 IM即时通讯(Instant Messaging)是一种基于互联网的即时交流消息的业务. 实时聊天交互功能是市面上主流APP的重要功能之一,人们所熟悉的就是微信,QQ的聊天消息 ...

  8. 代码随想录算法训练营day13

    基础知识 二叉树基础知识 二叉树多考察完全二叉树.满二叉树,可以分为链式存储和数组存储,父子兄弟访问方式也有所不同,遍历也分为了前中后序遍历和层次遍历 Java定义 public class Tree ...

  9. Liunx(CentOS)安装Nacos(单机启动,绑定Mysql)

    Liunx安装Nacos(单机启动,绑定Mysql) 一,准备安装包 github下载点 二,在/usr/local/目录下创建一个文件夹用于上传和解压Nacos cd /usr/local/ #这里 ...

  10. Postgresql清理WAL日志

    WAL是Write Ahead Log的简写,和oracle的redo日志类似,存放在$PGDATA/pg_xlog中,10版本以后在$PGDATA/pg_wal目录. 1.如果开启了归档,在目录ar ...