哪位大佬帮忙解释一下首页模板上滑自动加载数据的JavaScript代码? 财富值3

2022-01-17 08:45发布

/*!
	 * http://bbs.design 信息瀑布流内容自动加载js代码
*/

var IASCallbacks = function() {
	return this.list = [],
	this.fireStack = [],
	this.isFiring = !1,
	this.isDisabled = !1,
	this.fire = function(a) {
		var b = a[0],
		c = a[1],
		d = a[2];
		this.isFiring = !0;
		for (var e = 0,
		f = this.list.length; f > e; e++) if (void 0 != this.list[e] && !1 === this.list[e].fn.apply(b, d)) {
			c.reject();
			break
		}
		this.isFiring = !1,
		c.resolve(),
		this.fireStack.length && this.fire(this.fireStack.shift())
	},
	this.inList = function(a, b) {
		b = b || 0;
		for (var c = b,
		d = this.list.length; d > c; c++) if (this.list[c].fn === a || a.guid && this.list[c].fn.guid && a.guid === this.list[c].fn.guid) return c;
		return - 1
	},
	this
};
IASCallbacks.prototype = {
	add: function(a, b) {
		var c = {
			fn: a,
			priority: b
		};
		b = b || 0;
		for (var d = 0,
		e = this.list.length; e > d; d++) if (b > this.list[d].priority) return this.list.splice(d, 0, c),
		this;
		return this.list.push(c),
		this
	},
	remove: function(a) {
		for (var b = 0; (b = this.inList(a, b)) > -1;) this.list.splice(b, 1);
		return this
	},
	has: function(a) {
		return this.inList(a) > -1
	},
	fireWith: function(a, b) {
		var c = jQuery.Deferred();
		return this.isDisabled ? c.reject() : (b = b || [], b = [a, c, b.slice ? b.slice() : b], this.isFiring ? this.fireStack.push(b) : this.fire(b), c)
	},
	disable: function() {
		this.isDisabled = !0
	},
	enable: function() {
		this.isDisabled = !1
	}
},
function(a) {
	"use strict";
	var b = -1,
	c = function(c, d) {
		return this.itemsContainerSelector = d.container,
		this.itemSelector = d.item,
		this.nextSelector = d.next,
		this.paginationSelector = d.pagination,
		this.$scrollContainer = c,
		this.$container = window === c.get(0) ? a(document) : c,
		this.defaultDelay = d.delay,
		this.negativeMargin = d.negativeMargin,
		this.nextUrl = null,
		this.isBound = !1,
		this.isPaused = !1,
		this.isInitialized = !1,
		this.listeners = {
			next: new IASCallbacks,
			load: new IASCallbacks,
			loaded: new IASCallbacks,
			render: new IASCallbacks,
			rendered: new IASCallbacks,
			scroll: new IASCallbacks,
			noneLeft: new IASCallbacks,
			ready: new IASCallbacks
		},
		this.extensions = [],
		this.scrollHandler = function() {
			if (this.isBound && !this.isPaused) {
				var a = this.getCurrentScrollOffset(this.$scrollContainer),
				c = this.getScrollThreshold();
				b != c && (this.fire("scroll", [a, c]), a >= c && this.next())
			}
		},
		this.getItemsContainer = function() {
			return a(this.itemsContainerSelector)
		},
		this.getLastItem = function() {
			return a(this.itemSelector, this.getItemsContainer().get(0)).last()
		},
		this.getFirstItem = function() {
			return a(this.itemSelector, this.getItemsContainer().get(0)).first()
		},
		this.getScrollThreshold = function(a) {
			var c;
			return a = a || this.negativeMargin,
			a = a >= 0 ? -1 * a: a,
			c = this.getLastItem(),
			0 === c.length ? b: c.offset().top + c.height() + a
		},
		this.getCurrentScrollOffset = function(a) {
			var b = 0,
			c = a.height();
			return b = window === a.get(0) ? a.scrollTop() : a.offset().top,
			( - 1 != navigator.platform.indexOf("iPhone") || -1 != navigator.platform.indexOf("iPod")) && (c += 80),
			b + c
		},
		this.getNextUrl = function(b) {
			return b = b || this.$container,
			a(this.nextSelector, b).last().attr("href")
		},
		this.load = function(b, c, d) {
			var e, f, g = this,
			h = [],
			i = +new Date;
			d = d || this.defaultDelay;
			var j = {
				url: b
			};
			return g.fire("load", [j]),
			a.get(j.url, null, a.proxy(function(b) {
				e = a(this.itemsContainerSelector, b).eq(0),
				0 === e.length && (e = a(b).filter(this.itemsContainerSelector).eq(0)),
				e && e.find(this.itemSelector).each(function() {
					h.push(this)
				}),
				g.fire("loaded", [b, h]),
				c && (f = +new Date - i, d > f ? setTimeout(function() {
					c.call(g, b, h)
				},
				d - f) : c.call(g, b, h))
			},
			g), "html")
		},
		this.render = function(b, c) {
			var d = this,
			e = this.getLastItem(),
			f = 0,
			g = this.fire("render", [b]);
			g.done(function() {
				a(b).hide(),
				e.after(b),
				a(b).fadeIn(400,
				function() {++f < b.length || (d.fire("rendered", [b]), c && c())
				})
			})
		},
		this.hidePagination = function() {
			this.paginationSelector && a(this.paginationSelector, this.$container).hide()
		},
		this.restorePagination = function() {
			this.paginationSelector && a(this.paginationSelector, this.$container).show()
		},
		this.throttle = function(b, c) {
			var d, e, f = 0;
			return d = function() {
				function a() {
					f = +new Date,
					b.apply(d, g)
				}
				var d = this,
				g = arguments,
				h = +new Date - f;
				e ? clearTimeout(e) : a(),
				h > c ? a() : e = setTimeout(a, c)
			},
			a.guid && (d.guid = b.guid = b.guid || a.guid++),
			d
		},
		this.fire = function(a, b) {
			return this.listeners[a].fireWith(this, b)
		},
		this.pause = function() {
			this.isPaused = !0
		},
		this.resume = function() {
			this.isPaused = !1
		},
		this
	};
	c.prototype.initialize = function() {
		if (this.isInitialized) return ! 1;
		var a = !!("onscroll" in this.$scrollContainer.get(0)),
		b = this.getCurrentScrollOffset(this.$scrollContainer),
		c = this.getScrollThreshold();
		return a ? (this.hidePagination(), this.bind(), this.fire("ready"), this.nextUrl = this.getNextUrl(), b >= c ? (this.next(), this.one("rendered",
		function() {
			this.isInitialized = !0
		})) : this.isInitialized = !0, this) : !1
	},
	c.prototype.reinitialize = function() {
		this.isInitialized = !1,
		this.unbind(),
		this.initialize()
	},
	c.prototype.bind = function() {
		if (!this.isBound) {
			this.$scrollContainer.on("scroll", a.proxy(this.throttle(this.scrollHandler, 150), this));
			for (var b = 0,
			c = this.extensions.length; c > b; b++) this.extensions[b].bind(this);
			this.isBound = !0,
			this.resume()
		}
	},
	c.prototype.unbind = function() {
		if (this.isBound) {
			this.$scrollContainer.off("scroll", this.scrollHandler);
			for (var a = 0,
			b = this.extensions.length; b > a; a++)"undefined" != typeof this.extensions[a].unbind && this.extensions[a].unbind(this);
			this.isBound = !1
		}
	},
	c.prototype.destroy = function() {
		this.unbind(),
		this.$scrollContainer.data("ias", null)
	},
	c.prototype.on = function(b, c, d) {
		if ("undefined" == typeof this.listeners[b]) throw new Error('There is no event called "' + b + '"');
		return d = d || 0,
		this.listeners[b].add(a.proxy(c, this), d),
		this
	},
	c.prototype.one = function(a, b) {
		var c = this,
		d = function() {
			c.off(a, b),
			c.off(a, d)
		};
		return this.on(a, b),
		this.on(a, d),
		this
	},
	c.prototype.off = function(a, b) {
		if ("undefined" == typeof this.listeners[a]) throw new Error('There is no event called "' + a + '"');
		return this.listeners[a].remove(b),
		this
	},
	c.prototype.next = function() {
		var a = this.nextUrl,
		b = this;
		if (this.pause(), !a) return this.fire("noneLeft", [this.getLastItem()]),
		this.listeners.noneLeft.disable(),
		b.resume(),
		!1;
		var c = this.fire("next", [a]);
		return c.done(function() {
			b.load(a,
			function(a, c) {
				b.render(c,
				function() {
					b.nextUrl = b.getNextUrl(a),
					b.resume()
				})
			})
		}),
		c.fail(function() {
			b.resume()
		}),
		!0
	},
	c.prototype.extension = function(a) {
		if ("undefined" == typeof a.bind) throw new Error('Extension doesn\'t have required method "bind"');
		return "undefined" != typeof a.initialize && a.initialize(this),
		this.extensions.push(a),
		this.isInitialized && this.reinitialize(),
		this
	},
	a.ias = function(b) {
		var c = a(window);
		return c.ias.apply(c, arguments)
	},
	a.fn.ias = function(b) {
		var d = Array.prototype.slice.call(arguments),
		e = this;
		return this.each(function() {
			var f = a(this),
			g = f.data("ias"),
			h = a.extend({},
			a.fn.ias.defaults, f.data(), "object" == typeof b && b);
			if (g || (f.data("ias", g = new c(f, h)), a(document).ready(a.proxy(g.initialize, g))), "string" == typeof b) {
				if ("function" != typeof g[b]) throw new Error('There is no method called "' + b + '"');
				d.shift(),
				g[b].apply(g, d)
			}
			e = g
		}),
		e
	},
	a.fn.ias.defaults = {
		item: ".item",
		container: ".listing",
		next: ".next",
		pagination: !1,
		delay: 600,
		negativeMargin: 10
	}
} (jQuery);
var IASHistoryExtension = function(a) {
	return a = jQuery.extend({},
	this.defaults, a),
	this.ias = null,
	this.prevSelector = a.prev,
	this.prevUrl = null,
	this.listeners = {
		prev: new IASCallbacks
	},
	this.onPageChange = function(a, b, c) {
		if (window.history && window.history.replaceState) {
			var d = history.state;
			history.replaceState(d, document.title, c)
		}
	},
	this.onScroll = function(a, b) {
		var c = this.getScrollThresholdFirstItem();
		this.prevUrl && (a -= this.ias.$scrollContainer.height(), c >= a && this.prev())
	},
	this.onReady = function() {
		var a = this.ias.getCurrentScrollOffset(this.ias.$scrollContainer),
		b = this.getScrollThresholdFirstItem();
		a -= this.ias.$scrollContainer.height(),
		b >= a && this.prev()
	},
	this.getPrevUrl = function(a) {
		return a || (a = this.ias.$container),
		jQuery(this.prevSelector, a).last().attr("href")
	},
	this.getScrollThresholdFirstItem = function() {
		var a;
		return a = this.ias.getFirstItem(),
		0 === a.length ? -1 : a.offset().top
	},
	this.renderBefore = function(a, b) {
		var c = this.ias,
		d = c.getFirstItem(),
		e = 0;
		c.fire("render", [a]),
		jQuery(a).hide(),
		d.before(a),
		jQuery(a).fadeIn(400,
		function() {++e < a.length || (c.fire("rendered", [a]), b && b())
		})
	},
	this
};
IASHistoryExtension.prototype.initialize = function(a) {
	var b = this;
	this.ias = a,
	jQuery.extend(a.listeners, this.listeners),
	a.prev = function() {
		return b.prev()
	},
	this.prevUrl = this.getPrevUrl()
},
IASHistoryExtension.prototype.bind = function(a) {
	a.on("pageChange", jQuery.proxy(this.onPageChange, this)),
	a.on("scroll", jQuery.proxy(this.onScroll, this)),
	a.on("ready", jQuery.proxy(this.onReady, this))
},
IASHistoryExtension.prototype.unbind = function(a) {
	a.off("pageChange", this.onPageChange),
	a.off("scroll", this.onScroll),
	a.off("ready", this.onReady)
},
IASHistoryExtension.prototype.prev = function() {
	var a = this.prevUrl,
	b = this,
	c = this.ias;
	if (!a) return ! 1;
	c.pause();
	var d = c.fire("prev", [a]);
	return d.done(function() {
		c.load(a,
		function(a, d) {
			b.renderBefore(d,
			function() {
				b.prevUrl = b.getPrevUrl(a),
				c.resume(),
				b.prevUrl && b.prev()
			})
		})
	}),
	d.fail(function() {
		c.resume()
	}),
	!0
},
IASHistoryExtension.prototype.defaults = {
	prev: ".prev"
};
var IASNoneLeftExtension = function(a) {
	return a = jQuery.extend({},
	this.defaults, a),
	this.ias = null,
	this.uid = (new Date).getTime(),
	this.html = a.html.replace("{text}", a.text),
	this.showNoneLeft = function() {
		var a = jQuery(this.html).attr("id", "ias_noneleft_" + this.uid),
		b = this.ias.getLastItem();
		b.after(a),
		a.fadeIn()
	},
	this
};
IASNoneLeftExtension.prototype.bind = function(a) {
	this.ias = a,
	a.on("noneLeft", jQuery.proxy(this.showNoneLeft, this))
},
IASNoneLeftExtension.prototype.unbind = function(a) {
	a.off("noneLeft", this.showNoneLeft)
},
IASNoneLeftExtension.prototype.defaults = {
	text: "You reached the end.",
	html: '<div  class="zhanzhuai-loading"><span>已经加载到天涯海角,无内容了!</span></div>'
};
var IASPagingExtension = function() {
	return this.ias = null,
	this.pagebreaks = [[0, document.location.toString()]],
	this.lastPageNum = 1,
	this.enabled = !0,
	this.listeners = {
		pageChange: new IASCallbacks
	},
	this.onScroll = function(a, b) {
		if (this.enabled) {
			var c, d = this.ias,
			e = this.getCurrentPageNum(a),
			f = this.getCurrentPagebreak(a);
			this.lastPageNum !== e && (c = f[1], d.fire("pageChange", [e, a, c])),
			this.lastPageNum = e
		}
	},
	this.onNext = function(a) {
		var b = this.ias.getCurrentScrollOffset(this.ias.$scrollContainer);
		this.pagebreaks.push([b, a]);
		var c = this.getCurrentPageNum(b) + 1;
		this.ias.fire("pageChange", [c, b, a]),
		this.lastPageNum = c
	},
	this.onPrev = function(a) {
		var b = this,
		c = b.ias,
		d = c.getCurrentScrollOffset(c.$scrollContainer),
		e = d - c.$scrollContainer.height(),
		f = c.getFirstItem();
		this.enabled = !1,
		this.pagebreaks.unshift([0, a]),
		c.one("rendered",
		function() {
			for (var d = 1,
			g = b.pagebreaks.length; g > d; d++) b.pagebreaks[d][0] = b.pagebreaks[d][0] + f.offset().top;
			var h = b.getCurrentPageNum(e) + 1;
			c.fire("pageChange", [h, e, a]),
			b.lastPageNum = h,
			b.enabled = !0
		})
	},
	this
};
IASPagingExtension.prototype.initialize = function(a) {
	this.ias = a,
	jQuery.extend(a.listeners, this.listeners)
},
IASPagingExtension.prototype.bind = function(a) {
	try {
		a.on("prev", jQuery.proxy(this.onPrev, this), this.priority)
	} catch(b) {}
	a.on("next", jQuery.proxy(this.onNext, this), this.priority),
	a.on("scroll", jQuery.proxy(this.onScroll, this), this.priority)
},
IASPagingExtension.prototype.unbind = function(a) {
	try {
		a.off("prev", this.onPrev)
	} catch(b) {}
	a.off("next", this.onNext),
	a.off("scroll", this.onScroll)
},
IASPagingExtension.prototype.getCurrentPageNum = function(a) {
	for (var b = this.pagebreaks.length - 1; b > 0; b--) if (a > this.pagebreaks[b][0]) return b + 1;
	return 1
},
IASPagingExtension.prototype.getCurrentPagebreak = function(a) {
	for (var b = this.pagebreaks.length - 1; b >= 0; b--) if (a > this.pagebreaks[b][0]) return this.pagebreaks[b];
	return null
},
IASPagingExtension.prototype.priority = 500;
var IASSpinnerExtension = function(a) {
	return a = jQuery.extend({},
	this.defaults, a),
	this.ias = null,
	this.uid = (new Date).getTime(),
	this.src = a.src,
	this.html = a.html.replace("{src}", this.src),
	this.showSpinner = function() {
		var a = this.getSpinner() || this.createSpinner(),
		b = this.ias.getLastItem();
		b.after(a),
		a.fadeIn()
	},
	this.showSpinnerBefore = function() {
		var a = this.getSpinner() || this.createSpinner(),
		b = this.ias.getFirstItem();
		b.before(a),
		a.fadeIn()
	},
	this.removeSpinner = function() {
		this.hasSpinner() && this.getSpinner().remove()
	},
	this.getSpinner = function() {
		var a = jQuery("#ias_spinner_" + this.uid);
		return a.length > 0 ? a: !1
	},
	this.hasSpinner = function() {
		var a = jQuery("#ias_spinner_" + this.uid);
		return a.length > 0
	},
	this.createSpinner = function() {
		var a = jQuery(this.html).attr("id", "ias_spinner_" + this.uid);
		return a.hide(),
		a
	},
	this
};
IASSpinnerExtension.prototype.bind = function(a) {
	this.ias = a,
	a.on("next", jQuery.proxy(this.showSpinner, this)),
	a.on("render", jQuery.proxy(this.removeSpinner, this));
	try {
		a.on("prev", jQuery.proxy(this.showSpinnerBefore, this))
	} catch(b) {}
},
IASSpinnerExtension.prototype.unbind = function(a) {
	a.off("next", this.showSpinner),
	a.off("render", this.removeSpinner);
	try {
		a.off("prev", this.showSpinnerBefore)
	} catch(b) {}
},
IASSpinnerExtension.prototype.defaults = {
	html: '<div class="zhanzhuai-loading"><div class="load-icon load-icon-1"></div> <div class="load-icon load-icon-2"></div> <div class="load-icon load-icon-3"></div> <span>玩命加载中...</span></div>'
};
var IASTriggerExtension = function(a) {
	return a = jQuery.extend({},
	this.defaults, a),
	this.ias = null,
	this.html = a.html.replace("{text}", a.text),
	this.htmlPrev = a.htmlPrev.replace("{text}", a.textPrev),
	this.enabled = !0,
	this.count = 0,
	this.offset = a.offset,
	this.$triggerNext = null,
	this.$triggerPrev = null,
	this.showTriggerNext = function() {
		if (!this.enabled) return ! 0;
		if (!1 === this.offset || ++this.count < this.offset) return ! 0;
		var a = this.$triggerNext || (this.$triggerNext = this.createTrigger(this.next, this.html)),
		b = this.ias.getLastItem();
		return b.after(a),
		a.fadeIn(),
		!1
	},
	this.showTriggerPrev = function() {
		if (!this.enabled) return ! 0;
		var a = this.$triggerPrev || (this.$triggerPrev = this.createTrigger(this.prev, this.htmlPrev)),
		b = this.ias.getFirstItem();
		return b.before(a),
		a.fadeIn(),
		!1
	},
	this.onRendered = function() {
		this.enabled = !0
	},
	this.createTrigger = function(a, b) {
		var c, d = (new Date).getTime();
		return b = b || this.html,
		c = jQuery(b).attr("id", "ias_trigger_" + d),
		c.hide(),
		c.on("click", jQuery.proxy(a, this)),
		c
	},
	this
};
IASTriggerExtension.prototype.bind = function(a) {
	this.ias = a,
	a.on("next", jQuery.proxy(this.showTriggerNext, this), this.priority),
	a.on("rendered", jQuery.proxy(this.onRendered, this), this.priority);
	try {
		a.on("prev", jQuery.proxy(this.showTriggerPrev, this), this.priority)
	} catch(b) {}
},
IASTriggerExtension.prototype.unbind = function(a) {
	a.off("next", this.showTriggerNext),
	a.off("rendered", this.onRendered);
	try {
		a.off("prev", this.showTriggerPrev)
	} catch(b) {}
},
IASTriggerExtension.prototype.next = function() {
	this.enabled = !1,
	this.ias.pause(),
	this.$triggerNext && (this.$triggerNext.remove(), this.$triggerNext = null),
	this.ias.next()
},
IASTriggerExtension.prototype.prev = function() {
	this.enabled = !1,
	this.ias.pause(),
	this.$triggerPrev && (this.$triggerPrev.remove(), this.$triggerPrev = null),
	this.ias.prev()
},
IASTriggerExtension.prototype.defaults = {
	text: "加载更多",
	html: '<div class="zhanzhuai-ajax-more" style="text-align: center; cursor: pointer;"><a>{text}</a></div>',
	textPrev: "Load previous items",
	htmlPrev: '<div class="ias-trigger ias-trigger-prev" style="text-align: center; cursor: pointer;"><a>{text}</a></div>',
	offset: 0
},
IASTriggerExtension.prototype.priority = 1e3;

上面代码是自别的网站上扒下来的,研究用的。功能仿知乎首页信息瀑布流功能。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
mishen - whatsns产品经理
1楼-- · 2022-01-18 20:19

这种jquery插件都有现成得,自己集成调用数据即可,没必要研究别人内部怎么实现

一周热门 更多>