个人库的第二个版本,将Zepto封装了进去_zepto 封装 extend-程序员宅基地

技术标签:   javascript  

使用:

var obj = myNeedExtend();
obj.zepto就是zepto的方法咯

下面上代码

function myNeedExtend() {
    this.zepto = Zepto();
    /* Zepto v1.2.0 - zepto event ajax form ie - zeptojs.com/license */
    function Zepto() {
        var Zepto = (function () {
            var undefined, key, $, classList, emptyArray = [],
                concat = emptyArray.concat,
                filter = emptyArray.filter,
                slice = emptyArray.slice,
                document = window.document,
                elementDisplay = {},
                classCache = {},
                cssNumber = {
                    'column-count': 1,
                    'columns': 1,
                    'font-weight': 1,
                    'line-height': 1,
                    'opacity': 1,
                    'z-index': 1,
                    'zoom': 1
                },
                fragmentRE = /^\s*<(\w+|!)[^>]*>/,
                singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
                tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
                rootNodeRE = /^(?:body|html)$/i,
                capitalRE = /([A-Z])/g,

                // special attributes that should be get/set via method calls
                methodAttributes = ['val', 'css', 'html', 'text', 'data', 'width', 'height', 'offset'],

                adjacencyOperators = ['after', 'prepend', 'before', 'append'],
                table = document.createElement('table'),
                tableRow = document.createElement('tr'),
                containers = {
                    'tr': document.createElement('tbody'),
                    'tbody': table,
                    'thead': table,
                    'tfoot': table,
                    'td': tableRow,
                    'th': tableRow,
                    '*': document.createElement('div')
                },
                readyRE = /complete|loaded|interactive/,
                simpleSelectorRE = /^[\w-]*$/,
                class2type = {},
                toString = class2type.toString,
                zepto = {},
                camelize, uniq,
                tempParent = document.createElement('div'),
                propMap = {
                    'tabindex': 'tabIndex',
                    'readonly': 'readOnly',
                    'for': 'htmlFor',
                    'class': 'className',
                    'maxlength': 'maxLength',
                    'cellspacing': 'cellSpacing',
                    'cellpadding': 'cellPadding',
                    'rowspan': 'rowSpan',
                    'colspan': 'colSpan',
                    'usemap': 'useMap',
                    'frameborder': 'frameBorder',
                    'contenteditable': 'contentEditable'
                },
                isArray = Array.isArray ||
                function (object) {
                    return object instanceof Array
                }

            zepto.matches = function (element, selector) {
                if (!selector || !element || element.nodeType !== 1) return false
                var matchesSelector = element.matches || element.webkitMatchesSelector ||
                    element.mozMatchesSelector || element.oMatchesSelector ||
                    element.matchesSelector
                if (matchesSelector) return matchesSelector.call(element, selector)
                // fall back to performing a selector:
                var match, parent = element.parentNode,
                    temp = !parent
                if (temp)(parent = tempParent).appendChild(element)
                match = ~zepto.qsa(parent, selector).indexOf(element)
                temp && tempParent.removeChild(element)
                return match
            }

            function type(obj) {
                return obj == null ? String(obj) :
                    class2type[toString.call(obj)] || "object"
            }

            function isFunction(value) {
                return type(value) == "function"
            }

            function isWindow(obj) {
                return obj != null && obj == obj.window
            }

            function isDocument(obj) {
                return obj != null && obj.nodeType == obj.DOCUMENT_NODE
            }

            function isObject(obj) {
                return type(obj) == "object"
            }

            function isPlainObject(obj) {
                return isObject(obj) && !isWindow(obj) && Object.getPrototypeOf(obj) == Object.prototype
            }

            function likeArray(obj) {
                var length = !!obj && 'length' in obj && obj.length,
                    type = $.type(obj)

                return 'function' != type && !isWindow(obj) && (
                    'array' == type || length === 0 ||
                    (typeof length == 'number' && length > 0 && (length - 1) in obj)
                )
            }

            function compact(array) {
                return filter.call(array, function (item) {
                    return item != null
                })
            }

            function flatten(array) {
                return array.length > 0 ? $.fn.concat.apply([], array) : array
            }
            camelize = function (str) {
                return str.replace(/-+(.)?/g, function (match, chr) {
                    return chr ? chr.toUpperCase() : ''
                })
            }

            function dasherize(str) {
                return str.replace(/::/g, '/')
                    .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
                    .replace(/([a-z\d])([A-Z])/g, '$1_$2')
                    .replace(/_/g, '-')
                    .toLowerCase()
            }
            uniq = function (array) {
                return filter.call(array, function (item, idx) {
                    return array.indexOf(item) == idx
                })
            }

            function classRE(name) {
                return name in classCache ?
                    classCache[name] : (classCache[name] = new RegExp('(^|\\s)' + name + '(\\s|$)'))
            }

            function maybeAddPx(name, value) {
                return (typeof value == "number" && !cssNumber[dasherize(name)]) ? value + "px" : value
            }

            function defaultDisplay(nodeName) {
                var element, display
                if (!elementDisplay[nodeName]) {
                    element = document.createElement(nodeName)
                    document.body.appendChild(element)
                    display = getComputedStyle(element, '').getPropertyValue("display")
                    element.parentNode.removeChild(element)
                    display == "none" && (display = "block")
                    elementDisplay[nodeName] = display
                }
                return elementDisplay[nodeName]
            }

            function children(element) {
                return 'children' in element ?
                    slice.call(element.children) :
                    $.map(element.childNodes, function (node) {
                        if (node.nodeType == 1) return node
                    })
            }

            function Z(dom, selector) {
                var i, len = dom ? dom.length : 0
                for (i = 0; i < len; i++) this[i] = dom[i]
                this.length = len
                this.selector = selector || ''
            }

            // `$.zepto.fragment` takes a html string and an optional tag name
            // to generate DOM nodes from the given html string.
            // The generated DOM nodes are returned as an array.
            // This function can be overridden in plugins for example to make
            // it compatible with browsers that don't support the DOM fully.
            zepto.fragment = function (html, name, properties) {
                var dom, nodes, container

                // A special case optimization for a single tag
                if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1))

                if (!dom) {
                    if (html.replace) html = html.replace(tagExpanderRE, "<$1></$2>")
                    if (name === undefined) name = fragmentRE.test(html) && RegExp.$1
                    if (!(name in containers)) name = '*'

                    container = containers[name]
                    container.innerHTML = '' + html
                    dom = $.each(slice.call(container.childNodes), function () {
                        container.removeChild(this)
                    })
                }

                if (isPlainObject(properties)) {
                    nodes = $(dom)
                    $.each(properties, function (key, value) {
                        if (methodAttributes.indexOf(key) > -1) nodes[key](value)
                        else nodes.attr(key, value)
                    })
                }

                return dom
            }

            // `$.zepto.Z` swaps out the prototype of the given `dom` array
            // of nodes with `$.fn` and thus supplying all the Zepto functions
            // to the array. This method can be overridden in plugins.
            zepto.Z = function (dom, selector) {
                return new Z(dom, selector)
            }

            // `$.zepto.isZ` should return `true` if the given object is a Zepto
            // collection. This method can be overridden in plugins.
            zepto.isZ = function (object) {
                return object instanceof zepto.Z
            }

            // `$.zepto.init` is Zepto's counterpart to jQuery's `$.fn.init` and
            // takes a CSS selector and an optional context (and handles various
            // special cases).
            // This method can be overridden in plugins.
            zepto.init = function (selector, context) {
                var dom
                // If nothing given, return an empty Zepto collection
                if (!selector) return zepto.Z()
                // Optimize for string selectors
                else if (typeof selector == 'string') {
                    selector = selector.trim()
                    // If it's a html fragment, create nodes from it
                    // Note: In both Chrome 21 and Firefox 15, DOM error 12
                    // is thrown if the fragment doesn't begin with <
                    if (selector[0] == '<' && fragmentRE.test(selector))
                        dom = zepto.fragment(selector, RegExp.$1, context), selector = null
                    // If there's a context, create a collection on that context first, and select
                    // nodes from there
                    else if (context !== undefined) return $(context).find(selector)
                    // If it's a CSS selector, use it to select nodes.
                    else dom = zepto.qsa(document, selector)
                }
                // If a function is given, call it when the DOM is ready
                else if (isFunction(selector)) return $(document).ready(selector)
                // If a Zepto collection is given, just return it
                else if (zepto.isZ(selector)) return selector
                else {
                    // normalize array if an array of nodes is given
                    if (isArray(selector)) dom = compact(selector)
                    // Wrap DOM nodes.
                    else if (isObject(selector))
                        dom = [selector], selector = null
                    // If it's a html fragment, create nodes from it
                    else if (fragmentRE.test(selector))
                        dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null
                    // If there's a context, create a collection on that context first, and select
                    // nodes from there
                    else if (context !== undefined) return $(context).find(selector)
                    // And last but no least, if it's a CSS selector, use it to select nodes.
                    else dom = zepto.qsa(document, selector)
                }
                // create a new Zepto collection from the nodes found
                return zepto.Z(dom, selector)
            }

            // `$` will be the base `Zepto` object. When calling this
            // function just call `$.zepto.init, which makes the implementation
            // details of selecting nodes and creating Zepto collections
            // patchable in plugins.
            $ = function (selector, context) {
                return zepto.init(selector, context)
            }

            function extend(target, source, deep) {
                for (key in source)
                    if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
                        if (isPlainObject(source[key]) && !isPlainObject(target[key]))
                            target[key] = {}
                        if (isArray(source[key]) && !isArray(target[key]))
                            target[key] = []
                        extend(target[key], source[key], deep)
                    }
                else if (source[key] !== undefined) target[key] = source[key]
            }

            // Copy all but undefined properties from one or more
            // objects to the `target` object.
            $.extend = function (target) {
                var deep, args = slice.call(arguments, 1)
                if (typeof target == 'boolean') {
                    deep = target
                    target = args.shift()
                }
                args.forEach(function (arg) {
                    extend(target, arg, deep)
                })
                return target
            }

            // `$.zepto.qsa` is Zepto's CSS selector implementation which
            // uses `document.querySelectorAll` and optimizes for some special cases, like `#id`.
            // This method can be overridden in plugins.
            zepto.qsa = function (element, selector) {
                var found,
                    maybeID = selector[0] == '#',
                    maybeClass = !maybeID && selector[0] == '.',
                    nameOnly = maybeID || maybeClass ? selector.slice(1) : selector, // Ensure that a 1 char tag name still gets checked
                    isSimple = simpleSelectorRE.test(nameOnly)
                return (element.getElementById && isSimple && maybeID) ? // Safari DocumentFragment doesn't have getElementById
                    ((found = element.getElementById(nameOnly)) ? [found] : []) :
                    (element.nodeType !== 1 && element.nodeType !== 9 && element.nodeType !== 11) ? [] :
                    slice.call(
                        isSimple && !maybeID && element.getElementsByClassName ? // DocumentFragment doesn't have getElementsByClassName/TagName
                        maybeClass ? element.getElementsByClassName(nameOnly) : // If it's simple, it could be a class
                        element.getElementsByTagName(selector) : // Or a tag
                        element.querySelectorAll(selector) // Or it's not simple, and we need to query all
                    )
            }

            function filtered(nodes, selector) {
                return selector == null ? $(nodes) : $(nodes).filter(selector)
            }

            $.contains = document.documentElement.contains ?
                function (parent, node) {
                    return parent !== node && parent.contains(node)
                } :
                function (parent, node) {
                    while (node && (node = node.parentNode))
                        if (node === parent) return true
                    return false
                }

            function funcArg(context, arg, idx, payload) {
                return isFunction(arg) ? arg.call(context, idx, payload) : arg
            }

            function setAttribute(node, name, value) {
                value == null ? node.removeAttribute(name) : node.setAttribute(name, value)
            }

            // access className property while respecting SVGAnimatedString
            function className(node, value) {
                var klass = node.className || '',
                    svg = klass && klass.baseVal !== undefined

                if (value === undefined) return svg ? klass.baseVal : klass
                svg ? (klass.baseVal = value) : (node.className = value)
            }

            // "true"  => true
            // "false" => false
            // "null"  => null
            // "42"    => 42
            // "42.5"  => 42.5
            // "08"    => "08"
            // JSON    => parse if valid
            // String  => self
            function deserializeValue(value) {
                try {
                    return value ?
                        value == "true" ||
                        (value == "false" ? false :
                            value == "null" ? null :
                            +value + "" == value ? +value :
                            /^[\[\{]/.test(value) ? $.parseJSON(value) :
                            value) :
                        value
                } catch (e) {
                    return value
                }
            }

            $.type = type
            $.isFunction = isFunction
            $.isWindow = isWindow
            $.isArray = isArray
            $.isPlainObject = isPlainObject

            $.isEmptyObject = function (obj) {
                var name
                for (name in obj) return false
                return true
            }

            $.isNumeric = function (val) {
                var num = Number(val),
                    type = typeof val
                return val != null && type != 'boolean' &&
                    (type != 'string' || val.length) &&
                    !isNaN(num) && isFinite(num) || false
            }

            $.inArray = function (elem, array, i) {
                return emptyArray.indexOf.call(array, elem, i)
            }

            $.camelCase = camelize
            $.trim = function (str) {
                return str == null ? "" : String.prototype.trim.call(str)
            }

            // plugin compatibility
            $.uuid = 0
            $.support = {}
            $.expr = {}
            $.noop = function () {}

            $.map = function (elements, callback) {
                var value, values = [],
                    i, key
                if (likeArray(elements))
                    for (i = 0; i < elements.length; i++) {
                        value = callback(elements[i], i)
                        if (value != null) values.push(value)
                    }
                else
                    for (key in elements) {
                        value = callback(elements[key], key)
                        if (value != null) values.push(value)
                    }
                return flatten(values)
            }

            $.each = function (elements, callback) {
                var i, key
                if (likeArray(elements)) {
                    for (i = 0; i < elements.length; i++)
                        if (callback.call(elements[i], i, elements[i]) === false) return elements
                } else {
                    for (key in elements)
                        if (callback.call(elements[key], key, elements[key]) === false) return elements
                }

                return elements
            }

            $.grep = function (elements, callback) {
                return filter.call(elements, callback)
            }

            if (window.JSON) $.parseJSON = JSON.parse

            // Populate the class2type map
            $.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (i, name) {
                class2type["[object " + name + "]"] = name.toLowerCase()
            })

            // Define methods that will be available on all
            // Zepto collections
            $.fn = {
                constructor: zepto.Z,
                length: 0,

                // Because a collection acts like an array
                // copy over these useful array functions.
                forEach: emptyArray.forEach,
                reduce: emptyArray.reduce,
                push: emptyArray.push,
                sort: emptyArray.sort,
                splice: emptyArray.splice,
                indexOf: emptyArray.indexOf,
                concat: function () {
                    var i, value, args = []
                    for (i = 0; i < arguments.length; i++) {
                        value = arguments[i]
                        args[i] = zepto.isZ(value) ? value.toArray() : value
                    }
                    return concat.apply(zepto.isZ(this) ? this.toArray() : this, args)
                },

                // `map` and `slice` in the jQuery API work differently
                // from their array counterparts
                map: function (fn) {
                    return $($.map(this, function (el, i) {
                        return fn.call(el, i, el)
                    }))
                },
                slice: function () {
                    return $(slice.apply(this, arguments))
                },

                ready: function (callback) {
                    // need to check if document.body exists for IE as that browser reports
                    // document ready when it hasn't yet created the body element
                    if (readyRE.test(document.readyState) && document.body) callback($)
                    else document.addEventListener('DOMContentLoaded', function () {
                        callback($)
                    }, false)
                    return this
                },
                get: function (idx) {
                    return idx === undefined ? slice.call(this) : this[idx >= 0 ? idx : idx + this.length]
                },
                toArray: function () {
                    return this.get()
                },
                size: function () {
                    return this.length
                },
                remove: function () {
                    return this.each(function () {
                        if (this.parentNode != null)
                            this.parentNode.removeChild(this)
                    })
                },
                each: function (callback) {
                    emptyArray.every.call(this, function (el, idx) {
                        return callback.call(el, idx, el) !== false
                    })
                    return this
                },
                filter: function (selector) {
                    if (isFunction(selector)) return this.not(this.not(selector))
                    return $(filter.call(this, function (element) {
                        return zepto.matches(element, selector)
                    }))
                },
                add: function (selector, context) {
                    return $(uniq(this.concat($(selector, context))))
                },
                is: function (selector) {
                    return this.length > 0 && zepto.matches(this[0], selector)
                },
                not: function (selector) {
                    var nodes = []
                    if (isFunction(selector) && selector.call !== undefined)
                        this.each(function (idx) {
                            if (!selector.call(this, idx)) nodes.push(this)
                        })
                    else {
                        var excludes = typeof selector == 'string' ? this.filter(selector) :
                            (likeArray(selector) && isFunction(selector.item)) ? slice.call(selector) : $(selector)
                        this.forEach(function (el) {
                            if (excludes.indexOf(el) < 0) nodes.push(el)
                        })
                    }
                    return $(nodes)
                },
                has: function (selector) {
                    return this.filter(function () {
                        return isObject(selector) ?
                            $.contains(this, selector) :
                            $(this).find(selector).size()
                    })
                },
                eq: function (idx) {
                    return idx === -1 ? this.slice(idx) : this.slice(idx, +idx + 1)
                },
                first: function () {
                    var el = this[0]
                    return el && !isObject(el) ? el : $(el)
                },
                last: function () {
                    var el = this[this.length - 1]
                    return el && !isObject(el) ? el : $(el)
                },
                find: function (selector) {
                    var result, $this = this
                    if (!selector) result = $()
                    else if (typeof selector == 'object')
                        result = $(selector).filter(function () {
                            var node = this
                            return emptyArray.some.call($this, function (parent) {
                                return $.contains(parent, node)
                            })
                        })
                    else if (this.length == 1) result = $(zepto.qsa(this[0], selector))
                    else result = this.map(function () {
                        return zepto.qsa(this, selector)
                    })
                    return result
                },
                closest: function (selector, context) {
                    var nodes = [],
                        collection = typeof selector == 'object' && $(selector)
                    this.each(function (_, node) {
                        while (node && !(collection ? collection.indexOf(node) >= 0 : zepto.matches(node, selector)))
                            node = node !== context && !isDocument(node) && node.parentNode
                        if (node && nodes.indexOf(node) < 0) nodes.push(node)
                    })
                    return $(nodes)
                },
                parents: function (selector) {
                    var ancestors = [],
                        nodes = this
                    while (nodes.length > 0)
                        nodes = $.map(nodes, function (node) {
                            if ((node = node.parentNode) && !isDocument(node) && ancestors.indexOf(node) < 0) {
                                ancestors.push(node)
                                return node
                            }
                        })
                    return filtered(ancestors, selector)
                },
                parent: function (selector) {
                    return filtered(uniq(this.pluck('parentNode')), selector)
                },
                children: function (selector) {
                    return filtered(this.map(function () {
                        return children(this)
                    }), selector)
                },
                contents: function () {
                    return this.map(function () {
                        return this.contentDocument || slice.call(this.childNodes)
                    })
                },
                siblings: function (selector) {
                    return filtered(this.map(function (i, el) {
                        return filter.call(children(el.parentNode), function (child) {
                            return child !== el
                        })
                    }), selector)
                },
                empty: function () {
                    return this.each(function () {
                        this.innerHTML = ''
                    })
                },
                // `pluck` is borrowed from Prototype.js
                pluck: function (property) {
                    return $.map(this, function (el) {
                        return el[property]
                    })
                },
                show: function () {
                    return this.each(function () {
                        this.style.display == "none" && (this.style.display = '')
                        if (getComputedStyle(this, '').getPropertyValue("display") == "none")
                            this.style.display = defaultDisplay(this.nodeName)
                    })
                },
                replaceWith: function (newContent) {
                    return this.before(newContent).remove()
                },
                wrap: function (structure) {
                    var func = isFunction(structure)
                    if (this[0] && !func)
                        var dom = $(structure).get(0),
                            clone = dom.parentNode || this.length > 1

                    return this.each(function (index) {
                        $(this).wrapAll(
                            func ? structure.call(this, index) :
                            clone ? dom.cloneNode(true) : dom
                        )
                    })
                },
                wrapAll: function (structure) {
                    if (this[0]) {
                        $(this[0]).before(structure = $(structure))
                        var children
                        // drill down to the inmost element
                        while ((children = structure.children()).length) structure = children.first()
                        $(structure).append(this)
                    }
                    return this
                },
                wrapInner: function (structure) {
                    var func = isFunction(structure)
                    return this.each(function (index) {
                        var self = $(this),
                            contents = self.contents(),
                            dom = func ? structure.call(this, index) : structure
                        contents.length ? contents.wrapAll(dom) : self.append(dom)
                    })
                },
                unwrap: function () {
                    this.parent().each(function () {
                        $(this).replaceWith($(this).children())
                    })
                    return this
                },
                clone: function () {
                    return this.map(function () {
                        return this.cloneNode(true)
                    })
                },
                hide: function () {
                    return this.css("display", "none")
                },
                toggle: function (setting) {
                    return this.each(function () {
                        var el = $(this);
                        (setting === undefined ? el.css("display") == "none" : setting) ? el.show(): el.hide()
                    })
                },
                prev: function (selector) {
                    return $(this.pluck('previousElementSibling')).filter(selector || '*')
                },
                next: function (selector) {
                    return $(this.pluck('nextElementSibling')).filter(selector || '*')
                },
                html: function (html) {
                    return 0 in arguments ?
                        this.each(function (idx) {
                            var originHtml = this.innerHTML
                            $(this).empty().append(funcArg(this, html, idx, originHtml))
                        }) :
                        (0 in this ? this[0].innerHTML : null)
                },
                text: function (text) {
                    return 0 in arguments ?
                        this.each(function (idx) {
                            var newText = funcArg(this, text, idx, this.textContent)
                            this.textContent = newText == null ? '' : '' + newText
                        }) :
                        (0 in this ? this.pluck('textContent').join("") : null)
                },
                attr: function (name, value) {
                    var result
                    return (typeof name == 'string' && !(1 in arguments)) ?
                        (0 in this && this[0].nodeType == 1 && (result = this[0].getAttribute(name)) != null ? result : undefined) :
                        this.each(function (idx) {
                            if (this.nodeType !== 1) return
                            if (isObject(name))
                                for (key in name) setAttribute(this, key, name[key])
                            else setAttribute(this, name, funcArg(this, value, idx, this.getAttribute(name)))
                        })
                },
                removeAttr: function (name) {
                    return this.each(function () {
                        this.nodeType === 1 && name.split(' ').forEach(function (attribute) {
                            setAttribute(this, attribute)
                        }, this)
                    })
                },
                prop: function (name, value) {
                    name = propMap[name] || name
                    return (1 in arguments) ?
                        this.each(function (idx) {
                            this[name] = funcArg(this, value, idx, this[name])
                        }) :
                        (this[0] && this[0][name])
                },
                removeProp: function (name) {
                    name = propMap[name] || name
                    return this.each(function () {
                        delete this[name]
                    })
                },
                data: function (name, value) {
                    var attrName = 'data-' + name.replace(capitalRE, '-$1').toLowerCase()

                    var data = (1 in arguments) ?
                        this.attr(attrName, value) :
                        this.attr(attrName)

                    return data !== null ? deserializeValue(data) : undefined
                },
                val: function (value) {
                    if (0 in arguments) {
                        if (value == null) value = ""
                        return this.each(function (idx) {
                            this.value = funcArg(this, value, idx, this.value)
                        })
                    } else {
                        return this[0] && (this[0].multiple ?
                            $(this[0]).find('option').filter(function () {
                                return this.selected
                            }).pluck('value') :
                            this[0].value)
                    }
                },
                offset: function (coordinates) {
                    if (coordinates) return this.each(function (index) {
                        var $this = $(this),
                            coords = funcArg(this, coordinates, index, $this.offset()),
                            parentOffset = $this.offsetParent().offset(),
                            props = {
                                top: coords.top - parentOffset.top,
                                left: coords.left - parentOffset.left
                            }

                        if ($this.css('position') == 'static') props['position'] = 'relative'
                        $this.css(props)
                    })
                    if (!this.length) return null
                    if (document.documentElement !== this[0] && !$.contains(document.documentElement, this[0]))
                        return {
                            top: 0,
                            left: 0
                        }
                    var obj = this[0].getBoundingClientRect()
                    return {
                        left: obj.left + window.pageXOffset,
                        top: obj.top + window.pageYOffset,
                        width: Math.round(obj.width),
                        height: Math.round(obj.height)
                    }
                },
                css: function (property, value) {
                    if (arguments.length < 2) {
                        var element = this[0]
                        if (typeof property == 'string') {
                            if (!element) return
                            return element.style[camelize(property)] || getComputedStyle(element, '').getPropertyValue(property)
                        } else if (isArray(property)) {
                            if (!element) return
                            var props = {}
                            var computedStyle = getComputedStyle(element, '')
                            $.each(property, function (_, prop) {
                                props[prop] = (element.style[camelize(prop)] || computedStyle.getPropertyValue(prop))
                            })
                            return props
                        }
                    }

                    var css = ''
                    if (type(property) == 'string') {
                        if (!value && value !== 0)
                            this.each(function () {
                                this.style.removeProperty(dasherize(property))
                            })
                        else
                            css = dasherize(property) + ":" + maybeAddPx(property, value)
                    } else {
                        for (key in property)
                            if (!property[key] && property[key] !== 0)
                                this.each(function () {
                                    this.style.removeProperty(dasherize(key))
                                })
                        else
                            css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';'
                    }

                    return this.each(function () {
                        this.style.cssText += ';' + css
                    })
                },
                index: function (element) {
                    return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0])
                },
                hasClass: function (name) {
                    if (!name) return false
                    return emptyArray.some.call(this, function (el) {
                        return this.test(className(el))
                    }, classRE(name))
                },
                addClass: function (name) {
                    if (!name) return this
                    return this.each(function (idx) {
                        if (!('className' in this)) return
                        classList = []
                        var cls = className(this),
                            newName = funcArg(this, name, idx, cls)
                        newName.split(/\s+/g).forEach(function (klass) {
                            if (!$(this).hasClass(klass)) classList.push(klass)
                        }, this)
                        classList.length && className(this, cls + (cls ? " " : "") + classList.join(" "))
                    })
                },
                removeClass: function (name) {
                    return this.each(function (idx) {
                        if (!('className' in this)) return
                        if (name === undefined) return className(this, '')
                        classList = className(this)
                        funcArg(this, name, idx, classList).split(/\s+/g).forEach(function (klass) {
                            classList = classList.replace(classRE(klass), " ")
                        })
                        className(this, classList.trim())
                    })
                },
                toggleClass: function (name, when) {
                    if (!name) return this
                    return this.each(function (idx) {
                        var $this = $(this),
                            names = funcArg(this, name, idx, className(this))
                        names.split(/\s+/g).forEach(function (klass) {
                            (when === undefined ? !$this.hasClass(klass) : when) ?
                            $this.addClass(klass): $this.removeClass(klass)
                        })
                    })
                },
                scrollTop: function (value) {
                    if (!this.length) return
                    var hasScrollTop = 'scrollTop' in this[0]
                    if (value === undefined) return hasScrollTop ? this[0].scrollTop : this[0].pageYOffset
                    return this.each(hasScrollTop ?
                        function () {
                            this.scrollTop = value
                        } :
                        function () {
                            this.scrollTo(this.scrollX, value)
                        })
                },
                scrollLeft: function (value) {
                    if (!this.length) return
                    var hasScrollLeft = 'scrollLeft' in this[0]
                    if (value === undefined) return hasScrollLeft ? this[0].scrollLeft : this[0].pageXOffset
                    return this.each(hasScrollLeft ?
                        function () {
                            this.scrollLeft = value
                        } :
                        function () {
                            this.scrollTo(value, this.scrollY)
                        })
                },
                position: function () {
                    if (!this.length) return

                    var elem = this[0],
                        // Get *real* offsetParent
                        offsetParent = this.offsetParent(),
                        // Get correct offsets
                        offset = this.offset(),
                        parentOffset = rootNodeRE.test(offsetParent[0].nodeName) ? {
                            top: 0,
                            left: 0
                        } : offsetParent.offset()

                    // Subtract element margins
                    // note: when an element has margin: auto the offsetLeft and marginLeft
                    // are the same in Safari causing offset.left to incorrectly be 0
                    offset.top -= parseFloat($(elem).css('margin-top')) || 0
                    offset.left -= parseFloat($(elem).css('margin-left')) || 0

                    // Add offsetParent borders
                    parentOffset.top += parseFloat($(offsetParent[0]).css('border-top-width')) || 0
                    parentOffset.left += parseFloat($(offsetParent[0]).css('border-left-width')) || 0

                    // Subtract the two offsets
                    return {
                        top: offset.top - parentOffset.top,
                        left: offset.left - parentOffset.left
                    }
                },
                offsetParent: function () {
                    return this.map(function () {
                        var parent = this.offsetParent || document.body
                        while (parent && !rootNodeRE.test(parent.nodeName) && $(parent).css("position") == "static")
                            parent = parent.offsetParent
                        return parent
                    })
                }
            }

            // for now
            $.fn.detach = $.fn.remove

            // Generate the `width` and `height` functions
            ;
            ['width', 'height'].forEach(function (dimension) {
                var dimensionProperty =
                    dimension.replace(/./, function (m) {
                        return m[0].toUpperCase()
                    })

                $.fn[dimension] = function (value) {
                    var offset, el = this[0]
                    if (value === undefined) return isWindow(el) ? el['inner' + dimensionProperty] :
                        isDocument(el) ? el.documentElement['scroll' + dimensionProperty] :
                        (offset = this.offset()) && offset[dimension]
                    else return this.each(function (idx) {
                        el = $(this)
                        el.css(dimension, funcArg(this, value, idx, el[dimension]()))
                    })
                }
            })

            function traverseNode(node, fun) {
                fun(node)
                for (var i = 0, len = node.childNodes.length; i < len; i++)
                    traverseNode(node.childNodes[i], fun)
            }

            // Generate the `after`, `prepend`, `before`, `append`,
            // `insertAfter`, `insertBefore`, `appendTo`, and `prependTo` methods.
            adjacencyOperators.forEach(function (operator, operatorIndex) {
                var inside = operatorIndex % 2 //=> prepend, append

                $.fn[operator] = function () {
                    // arguments can be nodes, arrays of nodes, Zepto objects and HTML strings
                    var argType, nodes = $.map(arguments, function (arg) {
                            var arr = []
                            argType = type(arg)
                            if (argType == "array") {
                                arg.forEach(function (el) {
                                    if (el.nodeType !== undefined) return arr.push(el)
                                    else if ($.zepto.isZ(el)) return arr = arr.concat(el.get())
                                    arr = arr.concat(zepto.fragment(el))
                                })
                                return arr
                            }
                            return argType == "object" || arg == null ?
                                arg : zepto.fragment(arg)
                        }),
                        parent, copyByClone = this.length > 1
                    if (nodes.length < 1) return this

                    return this.each(function (_, target) {
                        parent = inside ? target : target.parentNode

                        // convert all methods to a "before" operation
                        target = operatorIndex == 0 ? target.nextSibling :
                            operatorIndex == 1 ? target.firstChild :
                            operatorIndex == 2 ? target :
                            null

                        var parentInDocument = $.contains(document.documentElement, parent)

                        nodes.forEach(function (node) {
                            if (copyByClone) node = node.cloneNode(true)
                            else if (!parent) return $(node).remove()

                            parent.insertBefore(node, target)
                            if (parentInDocument) traverseNode(node, function (el) {
                                if (el.nodeName != null && el.nodeName.toUpperCase() === 'SCRIPT' &&
                                    (!el.type || el.type === 'text/javascript') && !el.src) {
                                    var target = el.ownerDocument ? el.ownerDocument.defaultView : window
                                    target['eval'].call(target, el.innerHTML)
                                }
                            })
                        })
                    })
                }

                // after    => insertAfter
                // prepend  => prependTo
                // before   => insertBefore
                // append   => appendTo
                $.fn[inside ? operator + 'To' : 'insert' + (operatorIndex ? 'Before' : 'After')] = function (html) {
                    $(html)[operator](this)
                    return this
                }
            })

            zepto.Z.prototype = Z.prototype = $.fn

            // Export internal API functions in the `$.zepto` namespace
            zepto.uniq = uniq
            zepto.deserializeValue = deserializeValue
            $.zepto = zepto

            return $
        })()

        //window.Zepto = Zepto
        //window.$ === undefined && (window.$ = Zepto)

        ;
        (function ($) {
            var _zid = 1,
                undefined,
                slice = Array.prototype.slice,
                isFunction = $.isFunction,
                isString = function (obj) {
                    return typeof obj == 'string'
                },
                handlers = {},
                specialEvents = {},
                focusinSupported = 'onfocusin' in window,
                focus = {
                    focus: 'focusin',
                    blur: 'focusout'
                },
                hover = {
                    mouseenter: 'mouseover',
                    mouseleave: 'mouseout'
                }

            specialEvents.click = specialEvents.mousedown = specialEvents.mouseup = specialEvents.mousemove = 'MouseEvents'

            function zid(element) {
                return element._zid || (element._zid = _zid++)
            }

            function findHandlers(element, event, fn, selector) {
                event = parse(event)
                if (event.ns) var matcher = matcherFor(event.ns)
                return (handlers[zid(element)] || []).filter(function (handler) {
                    return handler &&
                        (!event.e || handler.e == event.e) &&
                        (!event.ns || matcher.test(handler.ns)) &&
                        (!fn || zid(handler.fn) === zid(fn)) &&
                        (!selector || handler.sel == selector)
                })
            }

            function parse(event) {
                var parts = ('' + event).split('.')
                return {
                    e: parts[0],
                    ns: parts.slice(1).sort().join(' ')
                }
            }

            function matcherFor(ns) {
                return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)')
            }

            function eventCapture(handler, captureSetting) {
                return handler.del &&
                    (!focusinSupported && (handler.e in focus)) ||
                    !!captureSetting
            }

            function realEvent(type) {
                return hover[type] || (focusinSupported && focus[type]) || type
            }

            function add(element, events, fn, data, selector, delegator, capture) {
                var id = zid(element),
                    set = (handlers[id] || (handlers[id] = []))
                events.split(/\s/).forEach(function (event) {
                    if (event == 'ready') return $(document).ready(fn)
                    var handler = parse(event)
                    handler.fn = fn
                    handler.sel = selector
                    // emulate mouseenter, mouseleave
                    if (handler.e in hover) fn = function (e) {
                        var related = e.relatedTarget
                        if (!related || (related !== this && !$.contains(this, related)))
                            return handler.fn.apply(this, arguments)
                    }
                    handler.del = delegator
                    var callback = delegator || fn
                    handler.proxy = function (e) {
                        e = compatible(e)
                        if (e.isImmediatePropagationStopped()) return
                        e.data = data
                        var result = callback.apply(element, e._args == undefined ? [e] : [e].concat(e._args))
                        if (result === false) e.preventDefault(), e.stopPropagation()
                        return result
                    }
                    handler.i = set.length
                    set.push(handler)
                    if ('addEventListener' in element)
                        element.addEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))
                })
            }

            function remove(element, events, fn, selector, capture) {
                var id = zid(element);
                (events || '').split(/\s/).forEach(function (event) {
                    findHandlers(element, event, fn, selector).forEach(function (handler) {
                        delete handlers[id][handler.i]
                        if ('removeEventListener' in element)
                            element.removeEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture))
                    })
                })
            }

            $.event = {
                add: add,
                remove: remove
            }

            $.proxy = function (fn, context) {
                var args = (2 in arguments) && slice.call(arguments, 2)
                if (isFunction(fn)) {
                    var proxyFn = function () {
                        return fn.apply(context, args ? args.concat(slice.call(arguments)) : arguments)
                    }
                    proxyFn._zid = zid(fn)
                    return proxyFn
                } else if (isString(context)) {
                    if (args) {
                        args.unshift(fn[context], fn)
                        return $.proxy.apply(null, args)
                    } else {
                        return $.proxy(fn[context], fn)
                    }
                } else {
                    throw new TypeError("expected function")
                }
            }

            $.fn.bind = function (event, data, callback) {
                return this.on(event, data, callback)
            }
            $.fn.unbind = function (event, callback) {
                return this.off(event, callback)
            }
            $.fn.one = function (event, selector, data, callback) {
                return this.on(event, selector, data, callback, 1)
            }

            var returnTrue = function () {
                    return true
                },
                returnFalse = function () {
                    return false
                },
                ignoreProperties = /^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,
                eventMethods = {
                    preventDefault: 'isDefaultPrevented',
                    stopImmediatePropagation: 'isImmediatePropagationStopped',
                    stopPropagation: 'isPropagationStopped'
                }

            function compatible(event, source) {
                if (source || !event.isDefaultPrevented) {
                    source || (source = event)

                    $.each(eventMethods, function (name, predicate) {
                        var sourceMethod = source[name]
                        event[name] = function () {
                            this[predicate] = returnTrue
                            return sourceMethod && sourceMethod.apply(source, arguments)
                        }
                        event[predicate] = returnFalse
                    })

                    event.timeStamp || (event.timeStamp = Date.now())

                    if (source.defaultPrevented !== undefined ? source.defaultPrevented :
                        'returnValue' in source ? source.returnValue === false :
                        source.getPreventDefault && source.getPreventDefault())
                        event.isDefaultPrevented = returnTrue
                }
                return event
            }

            function createProxy(event) {
                var key, proxy = {
                    originalEvent: event
                }
                for (key in event)
                    if (!ignoreProperties.test(key) && event[key] !== undefined) proxy[key] = event[key]

                return compatible(proxy, event)
            }

            $.fn.delegate = function (selector, event, callback) {
                return this.on(event, selector, callback)
            }
            $.fn.undelegate = function (selector, event, callback) {
                return this.off(event, selector, callback)
            }

            $.fn.live = function (event, callback) {
                $(document.body).delegate(this.selector, event, callback)
                return this
            }
            $.fn.die = function (event, callback) {
                $(document.body).undelegate(this.selector, event, callback)
                return this
            }

            $.fn.on = function (event, selector, data, callback, one) {
                var autoRemove, delegator, $this = this
                if (event && !isString(event)) {
                    $.each(event, function (type, fn) {
                        $this.on(type, selector, data, fn, one)
                    })
                    return $this
                }

                if (!isString(selector) && !isFunction(callback) && callback !== false)
                    callback = data, data = selector, selector = undefined
                if (callback === undefined || data === false)
                    callback = data, data = undefined

                if (callback === false) callback = returnFalse

                return $this.each(function (_, element) {
                    if (one) autoRemove = function (e) {
                        remove(element, e.type, callback)
                        return callback.apply(this, arguments)
                    }

                    if (selector) delegator = function (e) {
                        var evt, match = $(e.target).closest(selector, element).get(0)
                        if (match && match !== element) {
                            evt = $.extend(createProxy(e), {
                                currentTarget: match,
                                liveFired: element
                            })
                            return (autoRemove || callback).apply(match, [evt].concat(slice.call(arguments, 1)))
                        }
                    }

                    add(element, event, callback, data, selector, delegator || autoRemove)
                })
            }
            $.fn.off = function (event, selector, callback) {
                var $this = this
                if (event && !isString(event)) {
                    $.each(event, function (type, fn) {
                        $this.off(type, selector, fn)
                    })
                    return $this
                }

                if (!isString(selector) && !isFunction(callback) && callback !== false)
                    callback = selector, selector = undefined

                if (callback === false) callback = returnFalse

                return $this.each(function () {
                    remove(this, event, callback, selector)
                })
            }

            $.fn.trigger = function (event, args) {
                event = (isString(event) || $.isPlainObject(event)) ? $.Event(event) : compatible(event)
                event._args = args
                return this.each(function () {
                    // handle focus(), blur() by calling them directly
                    if (event.type in focus && typeof this[event.type] == "function") this[event.type]()
                    // items in the collection might not be DOM elements
                    else if ('dispatchEvent' in this) this.dispatchEvent(event)
                    else $(this).triggerHandler(event, args)
                })
            }

            // triggers event handlers on current element just as if an event occurred,
            // doesn't trigger an actual event, doesn't bubble
            $.fn.triggerHandler = function (event, args) {
                var e, result
                this.each(function (i, element) {
                    e = createProxy(isString(event) ? $.Event(event) : event)
                    e._args = args
                    e.target = element
                    $.each(findHandlers(element, event.type || event), function (i, handler) {
                        result = handler.proxy(e)
                        if (e.isImmediatePropagationStopped()) return false
                    })
                })
                return result
            }

            // shortcut methods for `.bind(event, fn)` for each event type
            ;
            ('focusin focusout focus blur load resize scroll unload click dblclick ' +
                'mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave ' +
                'change select keydown keypress keyup error').split(' ').forEach(function (event) {
                $.fn[event] = function (callback) {
                    return (0 in arguments) ?
                        this.bind(event, callback) :
                        this.trigger(event)
                }
            })

            $.Event = function (type, props) {
                if (!isString(type)) props = type, type = props.type
                var event = document.createEvent(specialEvents[type] || 'Events'),
                    bubbles = true
                if (props)
                    for (var name in props)(name == 'bubbles') ? (bubbles = !!props[name]) : (event[name] = props[name])
                event.initEvent(type, bubbles, true)
                return compatible(event)
            }

        })(Zepto)

        ;
        (function ($) {
            var jsonpID = +new Date(),
                document = window.document,
                key,
                name,
                rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
                scriptTypeRE = /^(?:text|application)\/javascript/i,
                xmlTypeRE = /^(?:text|application)\/xml/i,
                jsonType = 'application/json',
                htmlType = 'text/html',
                blankRE = /^\s*$/,
                originAnchor = document.createElement('a')

            originAnchor.href = window.location.href

            // trigger a custom event and return false if it was cancelled
            function triggerAndReturn(context, eventName, data) {
                var event = $.Event(eventName)
                $(context).trigger(event, data)
                return !event.isDefaultPrevented()
            }

            // trigger an Ajax "global" event
            function triggerGlobal(settings, context, eventName, data) {
                if (settings.global) return triggerAndReturn(context || document, eventName, data)
            }

            // Number of active Ajax requests
            $.active = 0

            function ajaxStart(settings) {
                if (settings.global && $.active++ === 0) triggerGlobal(settings, null, 'ajaxStart')
            }

            function ajaxStop(settings) {
                if (settings.global && !(--$.active)) triggerGlobal(settings, null, 'ajaxStop')
            }

            // triggers an extra global event "ajaxBeforeSend" that's like "ajaxSend" but cancelable
            function ajaxBeforeSend(xhr, settings) {
                var context = settings.context
                if (settings.beforeSend.call(context, xhr, settings) === false ||
                    triggerGlobal(settings, context, 'ajaxBeforeSend', [xhr, settings]) === false)
                    return false

                triggerGlobal(settings, context, 'ajaxSend', [xhr, settings])
            }

            function ajaxSuccess(data, xhr, settings, deferred) {
                var context = settings.context,
                    status = 'success'
                settings.success.call(context, data, status, xhr)
                if (deferred) deferred.resolveWith(context, [data, status, xhr])
                triggerGlobal(settings, context, 'ajaxSuccess', [xhr, settings, data])
                ajaxComplete(status, xhr, settings)
            }
            // type: "timeout", "error", "abort", "parsererror"
            function ajaxError(error, type, xhr, settings, deferred) {
                var context = settings.context
                settings.error.call(context, xhr, type, error)
                if (deferred) deferred.rejectWith(context, [xhr, type, error])
                triggerGlobal(settings, context, 'ajaxError', [xhr, settings, error || type])
                ajaxComplete(type, xhr, settings)
            }
            // status: "success", "notmodified", "error", "timeout", "abort", "parsererror"
            function ajaxComplete(status, xhr, settings) {
                var context = settings.context
                settings.complete.call(context, xhr, status)
                triggerGlobal(settings, context, 'ajaxComplete', [xhr, settings])
                ajaxStop(settings)
            }

            function ajaxDataFilter(data, type, settings) {
                if (settings.dataFilter == empty) return data
                var context = settings.context
                return settings.dataFilter.call(context, data, type)
            }

            // Empty function, used as default callback
            function empty() {}

            $.ajaxJSONP = function (options, deferred) {
                if (!('type' in options)) return $.ajax(options)

                var _callbackName = options.jsonpCallback,
                    callbackName = ($.isFunction(_callbackName) ?
                        _callbackName() : _callbackName) || ('Zepto' + (jsonpID++)),
                    script = document.createElement('script'),
                    originalCallback = window[callbackName],
                    responseData,
                    abort = function (errorType) {
                        $(script).triggerHandler('error', errorType || 'abort')
                    },
                    xhr = {
                        abort: abort
                    },
                    abortTimeout

                if (deferred) deferred.promise(xhr)

                $(script).on('load error', function (e, errorType) {
                    clearTimeout(abortTimeout)
                    $(script).off().remove()

                    if (e.type == 'error' || !responseData) {
                        ajaxError(null, errorType || 'error', xhr, options, deferred)
                    } else {
                        ajaxSuccess(responseData[0], xhr, options, deferred)
                    }

                    window[callbackName] = originalCallback
                    if (responseData && $.isFunction(originalCallback))
                        originalCallback(responseData[0])

                    originalCallback = responseData = undefined
                })

                if (ajaxBeforeSend(xhr, options) === false) {
                    abort('abort')
                    return xhr
                }

                window[callbackName] = function () {
                    responseData = arguments
                }

                script.src = options.url.replace(/\?(.+)=\?/, '?$1=' + callbackName)
                document.head.appendChild(script)

                if (options.timeout > 0) abortTimeout = setTimeout(function () {
                    abort('timeout')
                }, options.timeout)

                return xhr
            }

            $.ajaxSettings = {
                // Default type of request
                type: 'GET',
                // Callback that is executed before request
                beforeSend: empty,
                // Callback that is executed if the request succeeds
                success: empty,
                // Callback that is executed the the server drops error
                error: empty,
                // Callback that is executed on request complete (both: error and success)
                complete: empty,
                // The context for the callbacks
                context: null,
                // Whether to trigger "global" Ajax events
                global: true,
                // Transport
                xhr: function () {
                    return new window.XMLHttpRequest()
                },
                // MIME types mapping
                // IIS returns Javascript as "application/x-javascript"
                accepts: {
                    script: 'text/javascript, application/javascript, application/x-javascript',
                    json: jsonType,
                    xml: 'application/xml, text/xml',
                    html: htmlType,
                    text: 'text/plain'
                },
                // Whether the request is to another domain
                crossDomain: false,
                // Default timeout
                timeout: 0,
                // Whether data should be serialized to string
                processData: true,
                // Whether the browser should be allowed to cache GET responses
                cache: true,
                //Used to handle the raw response data of XMLHttpRequest.
                //This is a pre-filtering function to sanitize the response.
                //The sanitized response should be returned
                dataFilter: empty
            }

            function mimeToDataType(mime) {
                if (mime) mime = mime.split(';', 2)[0]
                return mime && (mime == htmlType ? 'html' :
                    mime == jsonType ? 'json' :
                    scriptTypeRE.test(mime) ? 'script' :
                    xmlTypeRE.test(mime) && 'xml') || 'text'
            }

            function appendQuery(url, query) {
                if (query == '') return url
                return (url + '&' + query).replace(/[&?]{1,2}/, '?')
            }

            // serialize payload and append it to the URL for GET requests
            function serializeData(options) {
                if (options.processData && options.data && $.type(options.data) != "string")
                    options.data = $.param(options.data, options.traditional)
                if (options.data && (!options.type || options.type.toUpperCase() == 'GET' || 'jsonp' == options.dataType))
                    options.url = appendQuery(options.url, options.data), options.data = undefined
            }

            $.ajax = function (options) {
                var settings = $.extend({}, options || {}),
                    deferred = $.Deferred && $.Deferred(),
                    urlAnchor, hashIndex
                for (key in $.ajaxSettings)
                    if (settings[key] === undefined) settings[key] = $.ajaxSettings[key]

                ajaxStart(settings)

                if (!settings.crossDomain) {
                    urlAnchor = document.createElement('a')
                    urlAnchor.href = settings.url
                    // cleans up URL for .href (IE only), see https://github.com/madrobby/zepto/pull/1049
                    urlAnchor.href = urlAnchor.href
                    settings.crossDomain = (originAnchor.protocol + '//' + originAnchor.host) !== (urlAnchor.protocol + '//' + urlAnchor.host)
                }

                if (!settings.url) settings.url = window.location.toString()
                if ((hashIndex = settings.url.indexOf('#')) > -1) settings.url = settings.url.slice(0, hashIndex)
                serializeData(settings)

                var dataType = settings.dataType,
                    hasPlaceholder = /\?.+=\?/.test(settings.url)
                if (hasPlaceholder) dataType = 'jsonp'

                if (settings.cache === false || (
                        (!options || options.cache !== true) &&
                        ('script' == dataType || 'jsonp' == dataType)
                    ))
                    settings.url = appendQuery(settings.url, '_=' + Date.now())

                if ('jsonp' == dataType) {
                    if (!hasPlaceholder)
                        settings.url = appendQuery(settings.url,
                            settings.jsonp ? (settings.jsonp + '=?') : settings.jsonp === false ? '' : 'callback=?')
                    return $.ajaxJSONP(settings, deferred)
                }

                var mime = settings.accepts[dataType],
                    headers = {},
                    setHeader = function (name, value) {
                        headers[name.toLowerCase()] = [name, value]
                    },
                    protocol = /^([\w-]+:)\/\//.test(settings.url) ? RegExp.$1 : window.location.protocol,
                    xhr = settings.xhr(),
                    nativeSetHeader = xhr.setRequestHeader,
                    abortTimeout

                if (deferred) deferred.promise(xhr)

                if (!settings.crossDomain) setHeader('X-Requested-With', 'XMLHttpRequest')
                setHeader('Accept', mime || '*/*')
                if (mime = settings.mimeType || mime) {
                    if (mime.indexOf(',') > -1) mime = mime.split(',', 2)[0]
                    xhr.overrideMimeType && xhr.overrideMimeType(mime)
                }
                if (settings.contentType || (settings.contentType !== false && settings.data && settings.type.toUpperCase() != 'GET'))
                    setHeader('Content-Type', settings.contentType || 'application/x-www-form-urlencoded')

                if (settings.headers)
                    for (name in settings.headers) setHeader(name, settings.headers[name])
                xhr.setRequestHeader = setHeader

                xhr.onreadystatechange = function () {
                    if (xhr.readyState == 4) {
                        xhr.onreadystatechange = empty
                        clearTimeout(abortTimeout)
                        var result, error = false
                        if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 || (xhr.status == 0 && protocol == 'file:')) {
                            dataType = dataType || mimeToDataType(settings.mimeType || xhr.getResponseHeader('content-type'))

                            if (xhr.responseType == 'arraybuffer' || xhr.responseType == 'blob')
                                result = xhr.response
                            else {
                                result = xhr.responseText

                                try {
                                    // http://perfectionkills.com/global-eval-what-are-the-options/
                                    // sanitize response accordingly if data filter callback provided
                                    result = ajaxDataFilter(result, dataType, settings)
                                    if (dataType == 'script')(1, eval)(result)
                                    else if (dataType == 'xml') result = xhr.responseXML
                                    else if (dataType == 'json') result = blankRE.test(result) ? null : $.parseJSON(result)
                                } catch (e) {
                                    error = e
                                }

                                if (error) return ajaxError(error, 'parsererror', xhr, settings, deferred)
                            }

                            ajaxSuccess(result, xhr, settings, deferred)
                        } else {
                            ajaxError(xhr.statusText || null, xhr.status ? 'error' : 'abort', xhr, settings, deferred)
                        }
                    }
                }

                if (ajaxBeforeSend(xhr, settings) === false) {
                    xhr.abort()
                    ajaxError(null, 'abort', xhr, settings, deferred)
                    return xhr
                }

                var async = 'async' in settings ? settings.async : true
                xhr.open(settings.type, settings.url, async, settings.username, settings.password)

                if (settings.xhrFields)
                    for (name in settings.xhrFields) xhr[name] = settings.xhrFields[name]

                for (name in headers) nativeSetHeader.apply(xhr, headers[name])

                if (settings.timeout > 0) abortTimeout = setTimeout(function () {
                    xhr.onreadystatechange = empty
                    xhr.abort()
                    ajaxError(null, 'timeout', xhr, settings, deferred)
                }, settings.timeout)

                // avoid sending empty string (#319)
                xhr.send(settings.data ? settings.data : null)
                return xhr
            }

            // handle optional data/success arguments
            function parseArguments(url, data, success, dataType) {
                if ($.isFunction(data)) dataType = success, success = data, data = undefined
                if (!$.isFunction(success)) dataType = success, success = undefined
                return {
                    url: url,
                    data: data,
                    success: success,
                    dataType: dataType
                }
            }

            $.get = function ( /* url, data, success, dataType */ ) {
                return $.ajax(parseArguments.apply(null, arguments))
            }

            $.post = function ( /* url, data, success, dataType */ ) {
                var options = parseArguments.apply(null, arguments)
                options.type = 'POST'
                return $.ajax(options)
            }

            $.getJSON = function ( /* url, data, success */ ) {
                var options = parseArguments.apply(null, arguments)
                options.dataType = 'json'
                return $.ajax(options)
            }

            $.fn.load = function (url, data, success) {
                if (!this.length) return this
                var self = this,
                    parts = url.split(/\s/),
                    selector,
                    options = parseArguments(url, data, success),
                    callback = options.success
                if (parts.length > 1) options.url = parts[0], selector = parts[1]
                options.success = function (response) {
                    self.html(selector ?
                        $('<div>').html(response.replace(rscript, "")).find(selector) :
                        response)
                    callback && callback.apply(self, arguments)
                }
                $.ajax(options)
                return this
            }

            var escape = encodeURIComponent

            function serialize(params, obj, traditional, scope) {
                var type, array = $.isArray(obj),
                    hash = $.isPlainObject(obj)
                $.each(obj, function (key, value) {
                    type = $.type(value)
                    if (scope) key = traditional ? scope :
                        scope + '[' + (hash || type == 'object' || type == 'array' ? key : '') + ']'
                    // handle data in serializeArray() format
                    if (!scope && array) params.add(value.name, value.value)
                    // recurse into nested objects
                    else if (type == "array" || (!traditional && type == "object"))
                        serialize(params, value, traditional, key)
                    else params.add(key, value)
                })
            }

            $.param = function (obj, traditional) {
                var params = []
                params.add = function (key, value) {
                    if ($.isFunction(value)) value = value()
                    if (value == null) value = ""
                    this.push(escape(key) + '=' + escape(value))
                }
                serialize(params, obj, traditional)
                return params.join('&').replace(/%20/g, '+')
            }
        })(Zepto)

        ;
        (function ($) {
            $.fn.serializeArray = function () {
                var name, type, result = [],
                    add = function (value) {
                        if (value.forEach) return value.forEach(add)
                        result.push({
                            name: name,
                            value: value
                        })
                    }
                if (this[0]) $.each(this[0].elements, function (_, field) {
                    type = field.type, name = field.name
                    if (name && field.nodeName.toLowerCase() != 'fieldset' &&
                        !field.disabled && type != 'submit' && type != 'reset' && type != 'button' && type != 'file' &&
                        ((type != 'radio' && type != 'checkbox') || field.checked))
                        add($(field).val())
                })
                return result
            }

            $.fn.serialize = function () {
                var result = []
                this.serializeArray().forEach(function (elm) {
                    result.push(encodeURIComponent(elm.name) + '=' + encodeURIComponent(elm.value))
                })
                return result.join('&')
            }

            $.fn.submit = function (callback) {
                if (0 in arguments) this.bind('submit', callback)
                else if (this.length) {
                    var event = $.Event('submit')
                    this.eq(0).trigger(event)
                    if (!event.isDefaultPrevented()) this.get(0).submit()
                }
                return this
            }

        })(Zepto)

        //     Zepto.js
        //     (c) 2010-2016 Thomas Fuchs
        //     Zepto.js may be freely distributed under the MIT license.

        ;
        (function ($) {
            var touch = {},
                touchTimeout, tapTimeout, swipeTimeout, longTapTimeout,
                longTapDelay = 750,
                gesture

            function swipeDirection(x1, x2, y1, y2) {
                return Math.abs(x1 - x2) >=
                    Math.abs(y1 - y2) ? (x1 - x2 > 0 ? 'Left' : 'Right') : (y1 - y2 > 0 ? 'Up' : 'Down')
            }

            function longTap() {
                longTapTimeout = null
                if (touch.last) {
                    touch.el.trigger('longTap')
                    touch = {}
                }
            }

            function cancelLongTap() {
                if (longTapTimeout) clearTimeout(longTapTimeout)
                longTapTimeout = null
            }

            function cancelAll() {
                if (touchTimeout) clearTimeout(touchTimeout)
                if (tapTimeout) clearTimeout(tapTimeout)
                if (swipeTimeout) clearTimeout(swipeTimeout)
                if (longTapTimeout) clearTimeout(longTapTimeout)
                touchTimeout = tapTimeout = swipeTimeout = longTapTimeout = null
                touch = {}
            }

            function isPrimaryTouch(event) {
                return (event.pointerType == 'touch' ||
                        event.pointerType == event.MSPOINTER_TYPE_TOUCH) &&
                    event.isPrimary
            }

            function isPointerEventType(e, type) {
                return (e.type == 'pointer' + type ||
                    e.type.toLowerCase() == 'mspointer' + type)
            }

            $(document).ready(function () {
                var now, delta, deltaX = 0,
                    deltaY = 0,
                    firstTouch, _isPointerType

                if ('MSGesture' in window) {
                    gesture = new MSGesture()
                    gesture.target = document.body
                }

                $(document)
                    .bind('MSGestureEnd', function (e) {
                        var swipeDirectionFromVelocity =
                            e.velocityX > 1 ? 'Right' : e.velocityX < -1 ? 'Left' : e.velocityY > 1 ? 'Down' : e.velocityY < -1 ? 'Up' : null
                        if (swipeDirectionFromVelocity) {
                            touch.el.trigger('swipe')
                            touch.el.trigger('swipe' + swipeDirectionFromVelocity)
                        }
                    })
                    .on('touchstart MSPointerDown pointerdown', function (e) {
                        if ((_isPointerType = isPointerEventType(e, 'down')) &&
                            !isPrimaryTouch(e)) return
                        firstTouch = _isPointerType ? e : e.touches[0]
                        if (e.touches && e.touches.length === 1 && touch.x2) {
                            // Clear out touch movement data if we have it sticking around
                            // This can occur if touchcancel doesn't fire due to preventDefault, etc.
                            touch.x2 = undefined
                            touch.y2 = undefined
                        }
                        now = Date.now()
                        delta = now - (touch.last || now)
                        touch.el = $('tagName' in firstTouch.target ?
                            firstTouch.target : firstTouch.target.parentNode)
                        touchTimeout && clearTimeout(touchTimeout)
                        touch.x1 = firstTouch.pageX
                        touch.y1 = firstTouch.pageY
                        if (delta > 0 && delta <= 250) touch.isDoubleTap = true
                        touch.last = now
                        longTapTimeout = setTimeout(longTap, longTapDelay)
                        // adds the current touch contact for IE gesture recognition
                        if (gesture && _isPointerType) gesture.addPointer(e.pointerId)
                    })
                    .on('touchmove MSPointerMove pointermove', function (e) {
                        if ((_isPointerType = isPointerEventType(e, 'move')) &&
                            !isPrimaryTouch(e)) return
                        firstTouch = _isPointerType ? e : e.touches[0]
                        cancelLongTap()
                        touch.x2 = firstTouch.pageX
                        touch.y2 = firstTouch.pageY

                        deltaX += Math.abs(touch.x1 - touch.x2)
                        deltaY += Math.abs(touch.y1 - touch.y2)
                    })
                    .on('touchend MSPointerUp pointerup', function (e) {
                        if ((_isPointerType = isPointerEventType(e, 'up')) &&
                            !isPrimaryTouch(e)) return
                        cancelLongTap()

                        // swipe
                        if ((touch.x2 && Math.abs(touch.x1 - touch.x2) > 30) ||
                            (touch.y2 && Math.abs(touch.y1 - touch.y2) > 30))

                            swipeTimeout = setTimeout(function () {
                                if (touch.el) {
                                    touch.el.trigger('swipe')
                                    touch.el.trigger('swipe' + (swipeDirection(touch.x1, touch.x2, touch.y1, touch.y2)))
                                }
                                touch = {}
                            }, 0)

                        // normal tap
                        else if ('last' in touch)
                            // don't fire tap when delta position changed by more than 30 pixels,
                            // for instance when moving to a point and back to origin
                            if (deltaX < 30 && deltaY < 30) {
                                // delay by one tick so we can cancel the 'tap' event if 'scroll' fires
                                // ('tap' fires before 'scroll')
                                tapTimeout = setTimeout(function () {

                                    // trigger universal 'tap' with the option to cancelTouch()
                                    // (cancelTouch cancels processing of single vs double taps for faster 'tap' response)
                                    var event = $.Event('tap')
                                    event.cancelTouch = cancelAll
                                    // [by paper] fix -> "TypeError: 'undefined' is not an object (evaluating 'touch.el.trigger'), when double tap
                                    if (touch.el) touch.el.trigger(event)

                                    // trigger double tap immediately
                                    if (touch.isDoubleTap) {
                                        if (touch.el) touch.el.trigger('doubleTap')
                                        touch = {}
                                    }

                                    // trigger single tap after 250ms of inactivity
                                    else {
                                        touchTimeout = setTimeout(function () {
                                            touchTimeout = null
                                            if (touch.el) touch.el.trigger('singleTap')
                                            touch = {}
                                        }, 250)
                                    }
                                }, 0)
                            } else {
                                touch = {}
                            }
                        deltaX = deltaY = 0

                    })
                    // when the browser window loses focus,
                    // for example when a modal dialog is shown,
                    // cancel all ongoing events
                    .on('touchcancel MSPointerCancel pointercancel', cancelAll)

                // scrolling the window indicates intention of the user
                // to scroll, not tap or swipe, so cancel all ongoing events
                $(window).on('scroll', cancelAll)
            })

            ;
            ['swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown',
    'doubleTap', 'tap', 'singleTap', 'longTap'].forEach(function (eventName) {
                $.fn[eventName] = function (callback) {
                    return this.on(eventName, callback)
                }
            })
        })(Zepto)

        ;
        (function () {
            // getComputedStyle shouldn't freak out when called
            // without a valid element as argument
            try {
                getComputedStyle(undefined)
            } catch (e) {
                var nativeGetComputedStyle = getComputedStyle
                window.getComputedStyle = function (element, pseudoElement) {
                    try {
                        return nativeGetComputedStyle(element, pseudoElement)
                    } catch (e) {
                        return null
                    }
                }
            }
        })()
        return Zepto
    }
}

myNeedExtend.prototype = {
    constructor: myNeedExtend,
    //判断是什么媒体设备的浏览器
    browserRedirect: function () {
        var sUserAgent = navigator.userAgent.toLowerCase();
        var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
        var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os";
        var bIsMidp = sUserAgent.match(/midp/i) == "midp";
        var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4";
        var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb";
        var bIsAndroid = sUserAgent.match(/android/i) == "android";
        var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";
        var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";
        //调用方法,首先判断是移动端还是PC端,然后根据浏览器的分辨率判断是pad还是phone还是minphone
        if (bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM) {
            if (bIsIpad) {
                return "pad";
            } else if (document.body.clientWidth > 767 && document.body.clientHeight > 767) {
                return "pad";
            } else if (document.body.clientWidth < 400 || document.body.clientHeight < 400) {
                return "minphone";
            } else {
                return "phone";
            }
        } else {
            return "pc";
        }
    },
    //深拷贝和浅拷贝(设置,对象,深/浅)
    cloneObj: function (settings, obj, boolean) {
        var bool = boolean || false;
        if (typeof obj != "object") {
            return;
        }
        //首先判断是深拷贝还是浅拷贝 true 深   false 浅
        if (bool) {
            for (var i in obj) {
                if (typeof obj[i] == "object") {
                    if (obj[i].constructor.prototype == settings[i].constructor.prototype) {
                        this.cloneObj(settings[i], obj[i], true);
                    } else {
                        if (obj[i] instanceof Array) {
                            settings[i] = [];
                        } else {
                            settings[i] = {};
                        }
                        this.cloneObj(settings[i], obj[i], true);
                    }
                } else {
                    settings[i] = obj[i];
                }
            }
        } else {
            for (var i in obj) {
                settings[i] = obj[i];
            }
        }
    }
}



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_30100043/article/details/62231145

智能推荐

leaflet图标线(leaflet篇.65)_leaflet 飞机航线-程序员宅基地

文章浏览阅读623次。听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客)文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。效果如下所示: 下面献上完整代码,代码重要位置会做相应解释<!DOCTYPE html><html><head> <meta charset=utf-8 /> <title&g_leaflet 飞机航线

初识QT+opengl_qopenglwidget: no such file or directory-程序员宅基地

文章浏览阅读996次。环境:QT Creator1.创建一个桌面QT应用;2.新建一个继承于QGLWidget的类,添加头文件#include &lt;QGLWidget&gt;,尝试编译; ①出错:error: C1083: 无法打开包括文件: “QGLWidget”: No such file or directory;提示没找到QGLWidget文件。 分析:在QT目录下的in..._qopenglwidget: no such file or directory

使用while和do while实现1到100相加的和_用while和do while 分别实现1到100的累加求和-程序员宅基地

文章浏览阅读5.3k次,点赞2次,收藏7次。使用while实现:#include <stdio.h>int main(int argc, const char *argv[]){ int i=1,sum=0; while(i<=100){ sum += i++; } printf("sum = %d\n",sum); return 0;}使用do while实现:#include <stdio.h>..._用while和do while 分别实现1到100的累加求和

debian9上安装qemu+kvm虚拟机教程(Debian 4.9.144-3.1 )_qemu-kvm debian-程序员宅基地

文章浏览阅读3.1k次。版权声明:转载于 https://blog.csdn.net/weixin_394..._qemu-kvm debian

VOH、VOL、VIH、VIL、VT、LOH、LOL、LIH、LIL等相关概念-程序员宅基地

文章浏览阅读5.9k次,点赞9次,收藏32次。VOH、VOL、VIH、VIL、VT、LOH、LOL、LIH、LIL等相关概念_voh

c语言单元测试及答案,C语言程序设计单元测试答案-程序员宅基地

文章浏览阅读2k次。C语言程序设计 菏泽学院 黄复贤1【单选题】若定义pf为指向float类型变量f的指针,下列语句中__是正确的。A、float f, *pf = f;B、float f, *pf = &f;C、float *pf = &f, f;D、float f, *pf =0.0;正确答案:B2【单选题】若p1、p2都是整型指针,p1已经指向变量x,要使p2也指向x, ( )是正确的。A、p2..._若定义pf为指向float类型变量f的指针,下列语句中__是正确的。 a. float f, *pf =

随便推点

杭电OJ 1019(C++)_杭电oj1019-程序员宅基地

文章浏览阅读342次。a和b的最小公倍数 = a*b/(a和b的最大公约数)__int64的取值范围为[-2^63, 2^63),不能使用int类型,否则可能超出int存储范围。#include <iostream>using namespace std;int main(){ int n, m; cin >> n; while (n--) { __int64 a,..._杭电oj1019

国内源代码安全漏洞检测工具现状浅析_国内外开源安全漏洞扫描测试工具使用现状和风险分析-程序员宅基地

文章浏览阅读7.4k次。在静态源代码检测工具方面,国内很多公司在研发产品,包括北大软件CoBOT、奇虎测腾的代码卫士、360企业代码卫士、清华大学软件学院Tsmart代码分析工具集、腾讯TscanCode开源静态扫描工具,端玛企业级静态源代码扫描分析平台DMSCA、找八哥源代码安全检测系统等。 知名度比较高的可能是360的代码卫士,借助其公司品牌和免费杀毒软件等宣传,行业内知名度较高,但是工..._国内外开源安全漏洞扫描测试工具使用现状和风险分析

欧姆龙CP1H系列码垛程序 上下料码垛机 汇川SV660P系列伺服电机_汇川 码垛机 伺服-程序员宅基地

文章浏览阅读460次,点赞6次,收藏8次。欧姆龙CP1H系列码垛程序欧姆龙CP1H系列程序,CP1H-EX40DT-D+CP1W-40EDT等输入输出模块上下料码垛机汇川SV660P系列伺服电机,雷塞闭环步进电机,脉冲+方向控制方式,绝对定位,多点位摆盘码垛功能 ,真空报警、正负极限位报警、气缸报警、伺服报警。跟上位机通讯控制扫码枪,图四是机台设备俯视图。功能完善的威纶通系列触摸屏模板,量产程序,标准程序架构,多用户管理功能,触摸屏宏指令配方管理功能。梯形图注释齐全,方便理解程序《欧姆龙CP1H系列码垛_汇川 码垛机 伺服

jQuery入门,jq第一天学习_jquery是写好的代码吗-程序员宅基地

文章浏览阅读347次。一.jQuery介绍其本质就是第三方的框架:别人写好的js代码文件,好处就是效率高,坏处就是处理bug比较麻烦。、官网:jQueryjQuery文件下载:https://code.jquery.com/jquery-1.12.4.min.js官方文档传送门:jQuery API 中文文档 | jQuery API 中文在线手册 | jquery api 下载 | jquery api chm二.不同版本的区别1.jQuery版本有很多,分为1.x 2.x 3 1.x版..._jquery是写好的代码吗

C++11中default关键字_c++ default关键字-程序员宅基地

文章浏览阅读1.1k次。C++11添加了很多新特性,使C++看上去更加的灵活和面向对象,其中新关键字default值得我们关注一下。  我们知道有时候当我们仅创建了有参构造函数后,如果你想调用无参构造函数编译是会报错的。因为一旦你自己定义了构造函数,系统的默认构造函数是被屏蔽的,也就是说此时是没有无参构造函数的,所以我们需要自己定义一个无参构造函数。但是现在在C++11中,如果我们仅定义了有参构造函数,可以通过default关键字让默认构造函数恢复。具体实现如下:<span style="color:#000000"_c++ default关键字

python复制excel到另一个excel_使用Python编写Excel文件,并从另一个Excel文件复制列[closed]...-程序员宅基地

文章浏览阅读1k次。以下是一些选择:> xlwt(编写xls文件)> xlrd(阅读xls / xlsx文件)> openpyxl(读/写xlsx文件)> xlsxwriter(编写xlsx文件)如果您只需复制数据(不含格式化信息),则可以使用这些工具的任意组合进行读取/写入。如果你有一个xls文件,你应该使用xlrd xlwt选项。以下是将现有Excel文件中的第一行复制到新的Excel文件..._python复制一个书局到另一个excellent