123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456 |
- /**
- * MUI核心JS
- * @type _L4.$|Function
- */
- var mui = (function(document, undefined) {
- var readyRE = /complete|loaded|interactive/;
- var idSelectorRE = /^#([\w-]+)$/;
- var classSelectorRE = /^\.([\w-]+)$/;
- var tagSelectorRE = /^[\w-]+$/;
- var translateRE = /translate(?:3d)?\((.+?)\)/;
- var translateMatrixRE = /matrix(3d)?\((.+?)\)/;
- var $ = function(selector, context) {
- context = context || document;
- if (!selector)
- return wrap();
- if (typeof selector === 'object')
- if ($.isArrayLike(selector)) {
- return wrap($.slice.call(selector), null);
- } else {
- return wrap([selector], null);
- }
- if (typeof selector === 'function')
- return $.ready(selector);
- if (typeof selector === 'string') {
- try {
- selector = selector.trim();
- if (idSelectorRE.test(selector)) {
- var found = document.getElementById(RegExp.$1);
- return wrap(found ? [found] : []);
- }
- return wrap($.qsa(selector, context), selector);
- } catch (e) {}
- }
- return wrap();
- };
- var wrap = function(dom, selector) {
- dom = dom || [];
- Object.setPrototypeOf(dom, $.fn);
- dom.selector = selector || '';
- return dom;
- };
- $.uuid = 0;
- $.data = {};
- /**
- * extend(simple)
- * @param {type} target
- * @param {type} source
- * @param {type} deep
- * @returns {unresolved}
- */
- $.extend = function() { //from jquery2
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[0] || {},
- i = 1,
- length = arguments.length,
- deep = false;
- if (typeof target === "boolean") {
- deep = target;
- target = arguments[i] || {};
- i++;
- }
- if (typeof target !== "object" && !$.isFunction(target)) {
- target = {};
- }
- if (i === length) {
- target = this;
- i--;
- }
- for (; i < length; i++) {
- if ((options = arguments[i]) != null) {
- for (name in options) {
- src = target[name];
- copy = options[name];
- if (target === copy) {
- continue;
- }
- if (deep && copy && ($.isPlainObject(copy) || (copyIsArray = $.isArray(copy)))) {
- if (copyIsArray) {
- copyIsArray = false;
- clone = src && $.isArray(src) ? src : [];
- } else {
- clone = src && $.isPlainObject(src) ? src : {};
- }
- target[name] = $.extend(deep, clone, copy);
- } else if (copy !== undefined) {
- target[name] = copy;
- }
- }
- }
- }
- return target;
- };
- /**
- * mui noop(function)
- */
- $.noop = function() {};
- /**
- * mui slice(array)
- */
- $.slice = [].slice;
- /**
- * mui filter(array)
- */
- $.filter = [].filter;
- $.type = function(obj) {
- return obj == null ? String(obj) : class2type[{}.toString.call(obj)] || "object";
- };
- /**
- * mui isArray
- */
- $.isArray = Array.isArray ||
- function(object) {
- return object instanceof Array;
- };
- /**
- * mui isArrayLike
- * @param {Object} obj
- */
- $.isArrayLike = function(obj) {
- var length = !!obj && "length" in obj && obj.length;
- var type = $.type(obj);
- if (type === "function" || $.isWindow(obj)) {
- return false;
- }
- return type === "array" || length === 0 ||
- typeof length === "number" && length > 0 && (length - 1) in obj;
- };
- /**
- * mui isWindow(需考虑obj为undefined的情况)
- */
- $.isWindow = function(obj) {
- return obj != null && obj === obj.window;
- };
- /**
- * mui isObject
- */
- $.isObject = function(obj) {
- return $.type(obj) === "object";
- };
- /**
- * mui isPlainObject
- */
- $.isPlainObject = function(obj) {
- return $.isObject(obj) && !$.isWindow(obj) && Object.getPrototypeOf(obj) === Object.prototype;
- };
- /**
- * mui isEmptyObject
- * @param {Object} o
- */
- $.isEmptyObject = function(o) {
- for (var p in o) {
- if (p !== undefined) {
- return false;
- }
- }
- return true;
- };
- /**
- * mui isFunction
- */
- $.isFunction = function(value) {
- return $.type(value) === "function";
- };
- /**
- * mui querySelectorAll
- * @param {type} selector
- * @param {type} context
- * @returns {Array}
- */
- $.qsa = function(selector, context) {
- context = context || document;
- return $.slice.call(classSelectorRE.test(selector) ? context.getElementsByClassName(RegExp.$1) : tagSelectorRE.test(selector) ? context.getElementsByTagName(selector) : context.querySelectorAll(selector));
- };
- /**
- * ready(DOMContentLoaded)
- * @param {type} callback
- * @returns {_L6.$}
- */
- $.ready = function(callback) {
- if (readyRE.test(document.readyState)) {
- callback($);
- } else {
- document.addEventListener('DOMContentLoaded', function() {
- callback($);
- }, false);
- }
- return this;
- };
- /**
- * 将 fn 缓存一段时间后, 再被调用执行
- * 此方法为了避免在 ms 段时间内, 执行 fn 多次. 常用于 resize , scroll , mousemove 等连续性事件中;
- * 当 ms 设置为 -1, 表示立即执行 fn, 即和直接调用 fn 一样;
- * 调用返回函数的 stop 停止最后一次的 buffer 效果
- * @param {Object} fn
- * @param {Object} ms
- * @param {Object} context
- */
- $.buffer = function(fn, ms, context) {
- var timer;
- var lastStart = 0;
- var lastEnd = 0;
- var ms = ms || 150;
- function run() {
- if (timer) {
- timer.cancel();
- timer = 0;
- }
- lastStart = $.now();
- fn.apply(context || this, arguments);
- lastEnd = $.now();
- }
- return $.extend(function() {
- if (
- (!lastStart) || // 从未运行过
- (lastEnd >= lastStart && $.now() - lastEnd > ms) || // 上次运行成功后已经超过ms毫秒
- (lastEnd < lastStart && $.now() - lastStart > ms * 8) // 上次运行或未完成,后8*ms毫秒
- ) {
- run.apply(this, arguments);
- } else {
- if (timer) {
- timer.cancel();
- }
- timer = $.later(run, ms, null, $.slice.call(arguments));
- }
- }, {
- stop: function() {
- if (timer) {
- timer.cancel();
- timer = 0;
- }
- }
- });
- };
- /**
- * each
- * @param {type} elements
- * @param {type} callback
- * @returns {_L8.$}
- */
- $.each = function(elements, callback, hasOwnProperty) {
- if (!elements) {
- return this;
- }
- if (typeof elements.length === 'number') {
- [].every.call(elements, function(el, idx) {
- return callback.call(el, idx, el) !== false;
- });
- } else {
- for (var key in elements) {
- if (hasOwnProperty) {
- if (elements.hasOwnProperty(key)) {
- if (callback.call(elements[key], key, elements[key]) === false) return elements;
- }
- } else {
- if (callback.call(elements[key], key, elements[key]) === false) return elements;
- }
- }
- }
- return this;
- };
- $.focus = function(element) {
- if ($.os.ios) {
- setTimeout(function() {
- element.focus();
- }, 10);
- } else {
- element.focus();
- }
- };
- /**
- * trigger event
- * @param {type} element
- * @param {type} eventType
- * @param {type} eventData
- * @returns {_L8.$}
- */
- $.trigger = function(element, eventType, eventData) {
- element.dispatchEvent(new CustomEvent(eventType, {
- detail: eventData,
- bubbles: true,
- cancelable: true
- }));
- return this;
- };
- /**
- * getStyles
- * @param {type} element
- * @param {type} property
- * @returns {styles}
- */
- $.getStyles = function(element, property) {
- var styles = element.ownerDocument.defaultView.getComputedStyle(element, null);
- if (property) {
- return styles.getPropertyValue(property) || styles[property];
- }
- return styles;
- };
- /**
- * parseTranslate
- * @param {type} translateString
- * @param {type} position
- * @returns {Object}
- */
- $.parseTranslate = function(translateString, position) {
- var result = translateString.match(translateRE || '');
- if (!result || !result[1]) {
- result = ['', '0,0,0'];
- }
- result = result[1].split(",");
- result = {
- x: parseFloat(result[0]),
- y: parseFloat(result[1]),
- z: parseFloat(result[2])
- };
- if (position && result.hasOwnProperty(position)) {
- return result[position];
- }
- return result;
- };
- /**
- * parseTranslateMatrix
- * @param {type} translateString
- * @param {type} position
- * @returns {Object}
- */
- $.parseTranslateMatrix = function(translateString, position) {
- var matrix = translateString.match(translateMatrixRE);
- var is3D = matrix && matrix[1];
- if (matrix) {
- matrix = matrix[2].split(",");
- if (is3D === "3d")
- matrix = matrix.slice(12, 15);
- else {
- matrix.push(0);
- matrix = matrix.slice(4, 7);
- }
- } else {
- matrix = [0, 0, 0];
- }
- var result = {
- x: parseFloat(matrix[0]),
- y: parseFloat(matrix[1]),
- z: parseFloat(matrix[2])
- };
- if (position && result.hasOwnProperty(position)) {
- return result[position];
- }
- return result;
- };
- $.hooks = {};
- $.addAction = function(type, hook) {
- var hooks = $.hooks[type];
- if (!hooks) {
- hooks = [];
- }
- hook.index = hook.index || 1000;
- hooks.push(hook);
- hooks.sort(function(a, b) {
- return a.index - b.index;
- });
- $.hooks[type] = hooks;
- return $.hooks[type];
- };
- $.doAction = function(type, callback) {
- if ($.isFunction(callback)) { //指定了callback
- $.each($.hooks[type], callback);
- } else { //未指定callback,直接执行
- $.each($.hooks[type], function(index, hook) {
- return !hook.handle();
- });
- }
- };
- /**
- * setTimeout封装
- * @param {Object} fn
- * @param {Object} when
- * @param {Object} context
- * @param {Object} data
- */
- $.later = function(fn, when, context, data) {
- when = when || 0;
- var m = fn;
- var d = data;
- var f;
- var r;
- if (typeof fn === 'string') {
- m = context[fn];
- }
- f = function() {
- m.apply(context, $.isArray(d) ? d : [d]);
- };
- r = setTimeout(f, when);
- return {
- id: r,
- cancel: function() {
- clearTimeout(r);
- }
- };
- };
- $.now = Date.now || function() {
- return +new Date();
- };
- var class2type = {};
- $.each(['Boolean', 'Number', 'String', 'Function', 'Array', 'Date', 'RegExp', 'Object', 'Error'], function(i, name) {
- class2type["[object " + name + "]"] = name.toLowerCase();
- });
- if (window.JSON) {
- $.parseJSON = JSON.parse;
- }
- /**
- * $.fn
- */
- $.fn = {
- each: function(callback) {
- [].every.call(this, function(el, idx) {
- return callback.call(el, idx, el) !== false;
- });
- return this;
- }
- };
- /**
- * 兼容 AMD 模块
- **/
- if (typeof define === 'function' && define.amd) {
- define('mui', [], function() {
- return $;
- });
- }
- return $;
- })(document);
- //window.mui = mui;
- //'$' in window || (window.$ = mui);
|