UNPKG

her-pc-demo

Version:

a fis pc demo run on HER

204 lines (180 loc) 5.33 kB
/** * 工具函数:懒加载 * * 加载的唯一标准是元素的位置有没有出现在视口内。 * by hongwei * 2013.06.04 */ var pageEvents = require("./pageEvents.js"), queue = require("./queue.js"), //保存每一条需要懒加载的信息,每条包括elem,callback,key。 //elem:有src属性的元素,callback,自定义的处理加载的函数,key:每一次add的每一条信息都用唯一的key值标识 _data = [], //标识add方法的每次添加 _key = 0, viewport, disabled = false; var global = window; /** * 添加需要懒加载的元素 * * @param {array|类array|单个dom元素} 可以是单个dom元素,也可以是一个有length的对象 * @param {function} 自定义的回调函数,执行自定义加载图片,默认回调函数会把data-src属性值赋给src属性 * @returns {number} 全局唯一的key,用作删除本次增加的参数 */ function add(elems, callback) { if (!('length' in elems)) { elems = [elems]; } for (var i = 0, item, len = elems.length; i < len; i++) { item = { elem: elems[i], callback: callback || defaultCallback, key: _key, valid: true } _data.push(item); } if (!viewport) viewport = pageEvents.getViewport(); //TODO:调用计算添加元素的offsetTop的方法 queue.call(getElementsOffsetTop); return _key++; } /** * 删除需要懒加载的元素 * * @param {key} 添加时的返回值 */ function remove(key) { var len = _data.length; while (len--) { if (_data[len].key === key) { _data[len].valid = false; } } } /*var STATE_UNINIT = 1, STATE_LOADING = 2, STATE_LOADED = 3, jqueryLoadState = STATE_UNINIT;*/ function getElementsOffsetTop() { var $ = require("jquery"); //if (jqueryLoadState == STATE_UNINIT) { // jqueryLoadState = STATE_LOADING; // requireLazy(["common.js.jquery"], function($) { // jqueryLoadState = STATE_LOADED; getElementsOffsetTop = getElementsOffsetTopViaJquery; queue.call(getElementsOffsetTop); // }); //} } function getElementsOffsetTopViaJquery() { var index, count, item; for (index = 0, count = _data.length; index < count; index++) { item = _data[index]; if (item.offsetTop === undefined && item.valid) { item.offsetTop = findValideTop(item.elem); } if (item.offsetTop !== undefined && checkItem(item)) { _data.splice(index, 1); index--; count--; } } } function checkItem(item) { if (!item.valid) return true; if (viewport.scrollTop + viewport.height + 50 > item.offsetTop) { queue.call(item.callback, global, item.elem); return true; } return false; } function defaultCallback(elem) { elem.setAttribute('src', elem.getAttribute('data-src')); } function findValideTop(elem) { var offsetTop = 0, offset; try { while (offsetTop <= 0) { if (!(elem && (offset = $(elem).offset()))) { return undefined; } offsetTop = offset.top; elem = elem.parentNode; } } catch (e) { return undefined; } return offsetTop; } function excute() { if (disabled) return; viewport = pageEvents.getViewport(); queue.call(getElementsOffsetTop); } function reset() { if (disabled) return; for (var i = 0, len = _data.length; i < len; i++) { _data[i].offsetTop = undefined; } queue.call(getElementsOffsetTop); } pageEvents.on('viewport.change', excute); pageEvents.on('page.endchange', reset); function disable() { disabled = true; } function enable() { disabled = false; } module.exports = { add: add, remove: remove, disable: disable, enable: enable }; /*华丽的分割线------------------------------*/ /*var viewPortChanged = false, excuteing = false; function checkViewPortChange() { if (viewPortChanged && !excuteing) { excuteing = true; viewPortChanged = false; excute(event.getViewport()); setTimeout(function () { excuteing = false; checkViewPortChange(); }, 20); } } function excute(e, data) { if (e) { _viewSize = e; } data = data || _data; var len = data.length, item; if (len <= 0) {return; } requireLazy(['common.js.jquery'], function ($) { var len = data.length, item; while (len--) { item = data[len]; if (item.offsetTop == undefined) { item.offsetTop = findValideTop(item.elem); } if (_viewSize.scrollTop > (item.offsetTop - _viewSize.height - 10)) { //顺序很重要,如果删除在callback之后 ,如果callback有错,导致删除不成功。 data.splice(len, 1); item.callback(item.elem); } //如果是手动执行且未执行显示,需要把元素添加到_data,以便viewport.change发生时再次调用 else if (!e) { _data.push(data[len]); } } }); } */