用於判斷類型的內部函數
class2type = {}
toString = class2type.toString
$.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (i, name) {
class2type["[object " + name + "]"] = name.toLowerCase()
})
function type(obj) {
return obj == null ? String(obj) : class2type[toString.call(obj)] || "object"
}
function isWindow(obj) { return obj != null && obj == obj.window }
function isObject(obj) { return type(obj) == "object" }
function isFunction(value) { return type(value) == "function" }
function isDocument(obj) { return obj != null && obj.nodeType == obj.DOCUMENT_NODE }
function isPlainObject(obj) { return isObject(obj) && !isWindow(obj) && Object.getPrototypeOf(obj) == Object.prototype }
isArray = Array.isArray || function (object) { return object instanceof Array }
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)
)
}
數組方法
emptyArray = []
concat = emptyArray.concat
filter = emptyArray.filter
slice = emptyArray.slice
function compact(array) { return filter.call(array, function (item) { return item != null }) }
function flatten(array) { return array.length > 0 ? $.fn.concat.apply([], array) : array }
uniq = function (array) { return filter.call(array, function (item, idx) { return array.indexOf(item) == idx }) }
字符串方法
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()
}
內部通用方法
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
}
}
function deserializeValue(value) {
try{
if (value){
if(value === 'true') {
return true
} else if(value === 'false') {
return false
} else {
if(value === 'null') {
return null
} else {
if(Number(value) + '' === value){
return parseFloat(value)
} else {
if(/^[\[\{]/.test(value)) {
return $.parseJSON(value)
} else {
return value
}
}
}
}
} else {
return value
}
} catch(e) {
return value
}
}
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)
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
}
zepto.qsa = function(element, selector){
var found,
maybeID = selector[0] == '#',
maybeClass = !maybeID && selector[0] == '.',
nameOnly = maybeID || maybeClass ? selector.slice(1) : selector,
isSimple = simpleSelectorRE.test(nameOnly)
return (element.getElementById && isSimple && maybeID) ?
( (found = element.getElementById(nameOnly)) ? [found] : [] ) :
(element.nodeType !== 1 && element.nodeType !== 9 && element.nodeType !== 11) ? [] :
slice.call(
isSimple && !maybeID && element.getElementsByClassName ?
maybeClass ? element.getElementsByClassName(nameOnly) :
element.getElementsByTagName(selector) :
element.querySelectorAll(selector)
)
if(element.getElementById && isSimple && maybeId) {
found = element.getElementById(nameOnly)
if(found === undefined) {
return []
} else {
return [found]
}
} else {
if(element.nodeType !== 1 && element.nodeType !== 9 && element.nodeType !== 11){
return []
} else {
if(isSimple && !maybeID && element.getElementsByClassName){
if(maybeClass){
found = element.getElementsByClassName(nameOnly)
return slice.call(found)
} else {
found = element.getElementsByTagName(selector)
return slice.call(found)
}
} else {
found = element.querySelectorAll(selector)
return slice.call(found)
}
}
}
}
function filtered(nodes, selector) {
return selector == null ? $(nodes) : $(nodes).filter(selector)
}
zepto.uniq = uniq
zepto.deserializeValue = deserializeValue