From b5139b18ebc0e64b1f83d97d39066f9887d503fd Mon Sep 17 00:00:00 2001 From: neverland Date: Sun, 20 May 2018 00:07:45 +0800 Subject: [PATCH] [Improvement] reduce scroll utils (#1112) --- packages/utils/scroll.js | 49 ++------------------------------- packages/waterfall/directive.js | 8 ++---- 2 files changed, 6 insertions(+), 51 deletions(-) diff --git a/packages/utils/scroll.js b/packages/utils/scroll.js index a017c10be..8296c256b 100644 --- a/packages/utils/scroll.js +++ b/packages/utils/scroll.js @@ -1,33 +1,7 @@ -import { isServer } from './index'; +import { isServer } from './'; export default { - debounce(func, wait, immediate) { - let timeout, args, context, timestamp, result; - return function() { - context = this; - args = arguments; - timestamp = new Date(); - const later = () => { - const last = (new Date()) - timestamp; - if (last < wait) { - timeout = setTimeout(later, wait - last); - } else { - timeout = null; - result = func.apply(context, args); - } - }; - if (!timeout) { - timeout = setTimeout(later, wait); - } - return result; - }; - }, - - /* 找到最近的触发滚动事件的元素 - * @param {Element} element - * @param {Element} rootElement - * @return {Element | window} - */ + // get nearest scroll element getScrollEventTarget(element, rootParent = window) { let currentNode = element; // bugfix, see http://w3help.org/zh-cn/causes/SD9013 and http://stackoverflow.com/questions/17016740/onscroll-function-is-not-working-for-chrome @@ -41,32 +15,15 @@ export default { return rootParent; }, - // 判断元素是否被加入到页面节点内 - isAttached(element) { - let currentNode = element.parentNode; - while (currentNode) { - if (currentNode.tagName === 'HTML') { - return true; - } - if (currentNode.nodeType === 11) { - return false; - } - currentNode = currentNode.parentNode; - } - return false; - }, - - // 获取滚动高度 getScrollTop(element) { return 'scrollTop' in element ? element.scrollTop : element.pageYOffset; }, - // 设置滚动高度 setScrollTop(element, value) { 'scrollTop' in element ? element.scrollTop = value : element.scrollTo(element.scrollX, value); }, - // 获取元素距离顶部高度 + // get distance from element top to page top getElementTop(element) { return (element === window ? 0 : element.getBoundingClientRect().top) + this.getScrollTop(window); }, diff --git a/packages/waterfall/directive.js b/packages/waterfall/directive.js index e2c95eca7..f52341642 100644 --- a/packages/waterfall/directive.js +++ b/packages/waterfall/directive.js @@ -12,7 +12,7 @@ function doBindEvent() { } this.el[CONTEXT].binded = true; - this.scrollEventListener = Utils.debounce(handleScrollEvent.bind(this), 200); + this.scrollEventListener = handleScrollEvent.bind(this); this.scrollEventTarget = Utils.getScrollEventTarget(this.el); const disabledExpr = this.el.getAttribute('waterfall-disabled'); @@ -78,10 +78,8 @@ function handleScrollEvent() { function startBind(el) { const context = el[CONTEXT]; - context.vm.$nextTick(function() { - if (Utils.isAttached(el)) { - doBindEvent.call(el[CONTEXT]); - } + context.vm.$nextTick(() => { + doBindEvent.call(el[CONTEXT]); }); }