mand-mobile
Version:
A Vue.js 2.0 Mobile UI Toolkit
166 lines (149 loc) • 5.05 kB
JavaScript
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define(['exports', 'vue'], factory);
} else if (typeof exports !== "undefined") {
factory(exports, require('vue'));
} else {
var mod = {
exports: {}
};
factory(mod.exports, global.vue);
global.util = mod.exports;
}
})(this, function (exports, _vue) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.queryCurParentNode = exports.getParentTag = exports.directiveInit = undefined;
exports.scrollSmoothTo = scrollSmoothTo;
exports.unique = unique;
var _vue2 = _interopRequireDefault(_vue);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
var _IS_MOBILE = /mobile|table|ip(ad|hone|od)|android/i.test(navigator.userAgent); // Vue插件,Tap事件处理
var plugin = {
bind: function bind(el, binding) {
el.binding_ref = binding;
el.tapEventHandler = function (evt) {
var _el$binding_ref$value = el.binding_ref.value,
_el$binding_ref$value2 = _el$binding_ref$value.disabled,
disabled = _el$binding_ref$value2 === undefined ? false : _el$binding_ref$value2,
methods = _el$binding_ref$value.methods;
// 阻止事件冒泡
evt.stopPropagation();
// 禁止点击,直接返回
if (disabled) {
return;
}
// 执行点击方法,并回传值
methods(el.innerHTML);
};
el.tapEventHandler_nop = function () {};
// 绑定监听事件
if (_IS_MOBILE) {
el.addEventListener('touchstart', el.tapEventHandler, false);
el.addEventListener('touchend', el.tapEventHandler_nop, false);
} else {
el.addEventListener('click', el.tapEventHandler, false);
}
},
unbind: function unbind(el) {
// 移除监听事件
if (_IS_MOBILE) {
el.removeEventListener('touchstart', el.tapEventHandler, false);
el.removeEventListener('touchend', el.tapEventHandler_nop, false);
} else {
el.removeEventListener('click', el.tapEventHandler, false);
}
},
update: function update(el, binding) {
el.binding_ref = binding;
}
};
var directiveInit = exports.directiveInit = function directiveInit() {
_vue2.default.directive('tap', plugin);
};
var getParentTag = exports.getParentTag = function getParentTag(startTag) {
var parentTagList = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
// 传入标签是否是DOM对象
if (!(startTag instanceof HTMLElement)) {
return parentTagList;
}
// 没有父节点
if (!startTag.parentElement) {
return parentTagList;
}
// 父级标签是否是body,是着停止返回集合,反之继续
if (startTag.parentElement.nodeName !== 'BODY') {
// 放入集合
parentTagList.push(startTag.parentElement);
// 再上一层寻找
return getParentTag(startTag.parentElement, parentTagList);
} else {
// 返回集合,结束
return parentTagList;
}
};
var queryCurParentNode = exports.queryCurParentNode = function queryCurParentNode(startTag, idList) {
// 查询所有父节点
var parentTagList = getParentTag(startTag);
// 查询当前父节点是否含有当前查找className
var tParentNode = parentTagList.findIndex(function (item) {
return item.id && idList.includes(item.id) || false;
});
return tParentNode !== -1;
};
/**
* 将元素滚动到顶部
* @param {number} position 滚动位置
* @param {element} elem 要滚动的元素
*/
function scrollToTop(elem, position) {
if (elem && elem.scrollTo) {
elem.scrollTo(0, position);
} else {
elem.scrollTop = position;
}
}
/**
* 将元素平滑滚动到指定位置
* @param position 要滚动的位置
* @param elem 有滑动的元素
*/
function scrollSmoothTo(position, elem) {
// 当前滚动高度
var scrollTop = elem && elem.scrollTop;
// 滚动step方法
var step = function step() {
// 距离目标滚动距离
var distance = position - scrollTop;
// 目标滚动位置
scrollTop = scrollTop + distance / 5;
if (Math.abs(distance) < 1) {
scrollToTop(elem, position);
} else {
scrollToTop(elem, scrollTop);
requestAnimationFrame(step);
}
};
step();
}
// 生成唯一值
function unique() {
var nowTime = Date.now() || new Date().getTime();
var str = 'xxxxxxxx-xxxx-7xxx-yxxx-xxxxxxxxxxxx';
// 高精度计时器
if (window.performance && typeof window.performance.now === 'function') {
nowTime += performance.now();
}
return str.replace(/[xy]/gi, function (c) {
var r = (nowTime + Math.random() * 16) % 16 | 0;
nowTime = Math.floor(nowTime / 16);
return (c === 'x' ? r : r & 0x3 | 0x8).toString(16);
});
}
});