PhotoSwipe源码解读系列(二)
作者: 铁锚
日期: 2013年12月19日
说明: 本系列文章为草稿,等待后期完善。源码是jQuery版本的,code.photoswipe-3.0.5.js
1. 代码开头,就是一些版权申明,没什么好说的,MIT授权。
// Copyright (c) 2012 by Code Computerlove (http://www.codecomputerlove.com) // Licensed under the MIT license // version: 3.0.5
2. 接下来的代码段,是一种闭包形式,匿名空间式的代码段,第一段代码的格式如下:
(function (window) {
// 代码区域
// Function.prototype.bind 函数绑定 部分
// window.Code.Util 部分
}(window));
说明: 如果要在自己的代码环境中将 window 指代为全局window,只有采用函数参数的形式,如果 直接 var window = xxx;将会报语法错误。
3. 对 Function 函数定义类的hack,如果没有bind原型方法则用自定义的方法来实现:
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind
if (!Function.prototype.bind ) {
Function.prototype.bind = function( obj ) {
var slice = [].slice,
args = slice.call(arguments, 1),
self = this,
nop = function () {},
bound = function () {
return self.apply( this instanceof nop ? this : ( obj || {} ),
args.concat( slice.call(arguments) ) );
};
nop.prototype = self.prototype;
bound.prototype = new nop();
return bound;
};
}
4. 接下来是window.Code工具类的封装:
if (typeof window.Code === "undefined") {
window.Code = {};
}
window.Code.Util = {
/*
* Function: registerNamespace
*/
registerNamespace: function () {
var
args = arguments, obj = null, i, j, ns, nsParts, root, argsLen, nsPartsLens;
for (i=0, argsLen=args.length; i<argsLen; i++) {
ns = args[i];
nsParts = ns.split(".");
root = nsParts[0];
if (typeof window[root] === "undefined"){
window[root] = {};
}
obj = window[root];
//eval('if (typeof ' + root + ' == "undefined"){' + root + ' = {};} obj = ' + root + ';');
for (j=1, nsPartsLens=nsParts.length; j<nsPartsLens; ++j) {
obj[nsParts[j]] = obj[nsParts[j]] || {};
obj = obj[nsParts[j]];
}
}
},
/*
* Function: coalesce
* Takes any number of arguments and returns the first non Null / Undefined argument.
*/
coalesce: function () {
var i, j;
for (i=0, j=arguments.length; i<j; i++) {
if (!this.isNothing(arguments[i])) {
return arguments[i];
}
}
return null;
},
/*
* Function: extend
*/
extend: function(destination, source, overwriteProperties){
var prop;
if (this.isNothing(overwriteProperties)){
overwriteProperties = true;
}
if (destination && source && this.isObject(source)){
for(prop in source){
if (this.objectHasProperty(source, prop)) {
if (overwriteProperties){
destination[prop] = source[prop];
}
else{
if(typeof destination[prop] === "undefined"){
destination[prop] = source[prop];
}
}
}
}
}
},
/*
* Function: clone
*/
clone: function(obj) {
var retval = {};
this.extend(retval, obj);
return retval;
},
/*
* Function: isObject
*/
isObject: function(obj){
return obj instanceof Object;
},
/*
* Function: isFunction
*/
isFunction: function(obj){
return ({}).toString.call(obj) === "[object Function]";
},
/*
* Function: isArray
*/
isArray: function(obj){
return obj instanceof Array;
},
/*
* Function: isLikeArray
*/
isLikeArray: function(obj) {
return typeof obj.length === 'number';
},
/*
* Function: isNumber
*/
isNumber: function(obj){
return typeof obj === "number";
},
/*
* Function: isString
*/
isString: function(obj){
return typeof obj === "string";
},
/*
* Function: isNothing
*/
isNothing: function (obj) {
if (typeof obj === "undefined" || obj === null) {
return true;
}
return false;
},
/*
* Function: swapArrayElements
*/
swapArrayElements: function(arr, i, j){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
},
/*
* Function: trim
*/
trim: function(val) {
return val.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
},
/*
* Function: toCamelCase
*/
toCamelCase: function(val){
return val.replace(/(\-[a-z])/g, function($1){return $1.toUpperCase().replace('-','');});
},
/*
* Function: toDashedCase
*/
toDashedCase: function(val){
return val.replace(/([A-Z])/g, function($1){return "-"+$1.toLowerCase();});
},
/*
* Function: indexOf
*/
arrayIndexOf: function(obj, array, prop){
var i, j, retval, arrayItem;
retval = -1;
for (i=0, j=array.length; i<j; i++){
arrayItem = array[i];
if (!this.isNothing(prop)){
if (this.objectHasProperty(arrayItem, prop)) {
if (arrayItem[prop] === obj){
retval = i;
break;
}
}
}
else{
if (arrayItem === obj){
retval = i;
break;
}
}
}
return retval;
},
/*
* Function: objectHasProperty
*/
objectHasProperty: function(obj, propName){
if (obj.hasOwnProperty){
return obj.hasOwnProperty(propName);
}
else{
return ('undefined' !== typeof obj[propName]);
}
}
};
内部是一些需要使用到的工具函数.
PhotoSwipe源码解读系列(二)的更多相关文章
- swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?
date: 2018-8-01 14:22:17title: swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?description: 阅读 sowft 框架源码, 了解 sowf ...
- Alamofire源码解读系列(二)之错误处理(AFError)
本篇主要讲解Alamofire中错误的处理机制 前言 在开发中,往往最容易被忽略的内容就是对错误的处理.有经验的开发者,能够对自己写的每行代码负责,而且非常清楚自己写的代码在什么时候会出现异常,这样就 ...
- Alamofire源码解读系列(十二)之时间轴(Timeline)
本篇带来Alamofire中关于Timeline的一些思路 前言 Timeline翻译后的意思是时间轴,可以表示一个事件从开始到结束的时间节点.时间轴的概念能够应用在很多地方,比如说微博的主页就是一个 ...
- Alamofire源码解读系列(十二)之请求(Request)
本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...
- Alamofire源码解读系列(四)之参数编码(ParameterEncoding)
本篇讲解参数编码的内容 前言 我们在开发中发的每一个请求都是通过URLRequest来进行封装的,可以通过一个URL生成URLRequest.那么如果我有一个参数字典,这个参数字典又是如何从客户端传递 ...
- Alamofire源码解读系列(三)之通知处理(Notification)
本篇讲解swift中通知的用法 前言 通知作为传递事件和数据的载体,在使用中是不受限制的.由于忘记移除某个通知的监听,会造成很多潜在的问题,这些问题在测试中是很难被发现的.但这不是我们这篇文章探讨的主 ...
- Alamofire源码解读系列(五)之结果封装(Result)
本篇讲解Result的封装 前言 有时候,我们会根据现实中的事物来对程序中的某个业务关系进行抽象,这句话很难理解.在Alamofire中,使用Response来描述请求后的结果.我们都知道Alamof ...
- Alamofire源码解读系列(六)之Task代理(TaskDelegate)
本篇介绍Task代理(TaskDelegate.swift) 前言 我相信可能有80%的同学使用AFNetworking或者Alamofire处理网络事件,并且这两个框架都提供了丰富的功能,我也相信很 ...
- Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager)
Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager) 本篇主要讲解iOS开发中的网络监控 前言 在开发中,有时候我们需要获取这些信息: 手机是否联网 ...
随机推荐
- ACM 还是畅通工程
Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直 ...
- Docker 内核名字空间
Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多.当用 docker run 启动一个容器时,在后台 Docker 为容器创建了一个独立的名字空间和控制组集合. 名字空间提供了最基础 ...
- Mysql 统一设置utf8字符
无聊的关于有效配置文件路径的备忘 原来阿里云服务器的mysql 5.5 , 配置/etc/my.cnf是没有任何作用的,需要编辑/etc/mysql/my.cnf 妈的, 就是这一点让我测试了两天, ...
- HTTP状态码总结
HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码.有些 App 端接口与 HTML 接口用的是同一个,所以做移动端开发也有必要了解一下HTTP状态码 ...
- Web Service进阶(三)HTTP-GET, HTTP-POST and SOAP的比较
XML Web Service支持三种协议来与用户交流数据.这三种协议分别是: 1.SOAP:Simple Object Access Protocol 2.HTTP-GET 3.HTTP-POST ...
- React Native之ListView实现九宫格效果
概述 在安卓原生开发中,ListView是很常用的一个列表控件,那么React Native(RN)如何实现该功能呢?我们来看一下ListView的源码 ListView是基于ScrollView扩展 ...
- Unity3D核心技术详解
在这里将多年游戏研发经验的积累写成一本书奉献给读者,目前已经开始预售,网址: http://www.broadview.com.cn/article/70 该书主要是将游戏中经常使用的技术给大家做了一 ...
- Effective C++ ——继承与面向对象设计
条款32:确定你的public继承塑模出is-a关系 以public继承的类,其父类的所有的性质都应该使用与子类,任何需要父类的地方都应该能用子类来代替,任何子类类型的对象也同时是父类的: class ...
- Android状态栏透明(沉浸式效果)
Android状态栏透明(沉浸式效果) 默认效果 沉浸式效果 方式一 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q487880 ...
- CentOs查看文件的几种方式
有许多命令都可以查看文件,不同的命令有不同的优点,可以针对不同的需要分别选择命令以提高效率: cat 由第一行开始显示内容,并将所有内容输出 tac 从最后一行倒序显示内容,并 ...