js实现无限下拉效果+判断当前可视窗口切换url

我这个功能点是:文章页面用户下拉到底部之后,再重新往后面显示一篇文章,并且修改当前可视窗口(也就是当前页面文章的url)让用户看到更多的文章~

let data = []; //存放每次的新数据
var curPage = 0; //当前页数

let newUrl; //存放当前可视窗口的url
let prevY = 0; //判断最后一次下拉的总长度
var request_url = ''; //请求的json地址
let orginal_url = window.location.pathname; //记录初始地址
//存儲json数据
var new_article_content;


//请求第一次数据
$.ajax({
	// url: './js/article_one.json',
	url: request_url + 1 + '.json',
	async: false,
	dataType: 'json',
	success: function(json) {
		new_article_content = json;
	},
	error() {
		new_article_content = [];
	}
});

$(function() {
	addData(curPage);
});

判断是否需要重新拉取数据

var poll = document.getElementById("poll");
	if (window.scrollY > prevY) { // 判断用户是否向下滚动
		prevY = window.scrollY
		if (poll.getBoundingClientRect().top <= window.innerHeight) {
			// 请求新的数据

			curPage++;
			addData(curPage);
			setTimeout(function() {
				createTableBody();
			}, 300)
		}
	}

判断当前可视窗口 切换url

    var scrollTop = $(document).scrollTop()
	var lines = $('.component-infinite-scroll')
	let index = 0;
	for (let i = 0; i < lines.length; i++) {
		var tops = $(lines[i]).offset().top // 循环出每个盒子到顶部的距离 
		var line_height = $('.component-infinite-scroll').eq(i).outerHeight() // 循环出每个盒子的高度
		/*如果当前滚动的距离大于或者等于当前盒子到达顶部的距离 且
		 *小于当前盒子到达顶部距离 与 当前盒子高度的和 
		 *那么当前盒子就处于可视范围内
		 * */
		if (scrollTop >= tops && screenTop < (tops + line_height)) {
			index++;
			// $('.component-infinite-scroll').eq(i).css("background-color", "yellow")
		} else {
			// $('.component-infinite-scroll').eq(i).css("background-color", "transparent")
		}
	}
	if (index - 2 != -1) {
		let newUrl = new_article_content[index - 2].article_mes.art_url;
		history.pushState('', '', newUrl); // 不刷新页面更新url
	} else if (index = 1) { 
		history.pushState('', '', orginal_url); 
	}

增加数据,做个防抖效果

function addData(curPage) {
	const getData = debounce(scrollAndLoading, 500)
	window.addEventListener('scroll', getData, false)
	return () => {
		window.removeEventListener('scroll', getData, false)
	}
}

// 防抖函数(进入函数则清除定时器,重新创建一个定时器,然后把定时器id设置为fn,做缓存,
// 等到用户事件不触发,500毫秒以后执行事件,并通过call修改执行this指向)
function debounce(fn, time) {
	return function(args) {
		let that = this
		clearTimeout(fn.tid)
		fn.tid = setTimeout(() => {
			fn.call(that, args)
		}, time);
	}
}

完整代码:

let data = []; //存放每次的新数据
var curPage = 0; //当前页数
var jsonpage = 0;
let newUrl; //存放当前可视窗口的url
let prevY = 0; //判断最后一次下拉的总长度
var request_url = ''; //请求的json地址
let orginal_url = window.location.pathname; //记录初始地址
var new_article_content; //存儲json数据

$.ajax({
	// url: './js/article_one.json',
	url: request_url + 1 + '.json',
	async: false,
	dataType: 'json',
	success: function(json) {
		new_article_content = json;
	},
	error() {
		new_article_content = [];
	}
});

$(function() {
	addData(curPage);
});


function scrollAndLoading() {

	var scrollTop = $(document).scrollTop()
	var lines = $('.component-infinite-scroll')
	let index = 0;
	for (let i = 0; i < lines.length; i++) {
		var tops = $(lines[i]).offset().top // 循环出每个盒子到顶部的距离 
		var line_height = $('.component-infinite-scroll').eq(i).outerHeight() // 循环出每个盒子的高度
		/*如果当前滚动的距离大于或者等于当前盒子到达顶部的距离 且
		 *小于当前盒子到达顶部距离 与 当前盒子高度的和 
		 *那么当前盒子就处于可视范围内
		 * */
		if (scrollTop >= tops && screenTop < (tops + line_height)) {
			index++;
			// $('.component-infinite-scroll').eq(i).css("background-color", "yellow")
		} else {
			// $('.component-infinite-scroll').eq(i).css("background-color", "transparent")
		}
	}
	if (index - 2 != -1) {
		let newUrl = new_article_content[index - 2].article_mes.art_url;
		history.pushState('', '', newUrl); // 不刷新页面
	} else if (index = 1) {
		history.pushState('', '', orginal_url);
	}

	var poll = document.getElementById("poll");
	if (window.scrollY > prevY) { // 判断用户是否向下滚动
		prevY = window.scrollY
		if (poll.getBoundingClientRect().top <= window.innerHeight) {
			// 请求新的数据

			curPage++;
			addData(curPage);
			setTimeout(function() {
				createTableBody();
			}, 300)
		}
	}
};

function createTableBody() {

	function create_new_article() {
		//创建一个新的article
	}

	//请求新的artical信息
	let request_article_mes = new_article_content[curPage - 1];

	if (request_article_mes != null) {
		$(".component-infinite-container")[0].append(create_new_article());
	}
}

function addData(curPage) {
	const getData = debounce(scrollAndLoading, 500)
	window.addEventListener('scroll', getData, false)
	return () => {
		window.removeEventListener('scroll', getData, false)
	}
}

// 防抖函数(进入函数则清除定时器,重新创建一个定时器,然后把定时器id设置为fn,做缓存,
// 等到用户事件不触发,500毫秒以后执行事件,并通过call修改执行this指向)
function debounce(fn, time) {
	return function(args) {
		let that = this
		clearTimeout(fn.tid)
		fn.tid = setTimeout(() => {
			fn.call(that, args)
		}, time);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值