作者: 铁锚

日期: 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源码解读系列(二)的更多相关文章

  1. swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?

    date: 2018-8-01 14:22:17title: swoft| 源码解读系列二: 启动阶段, swoft 都干了些啥?description: 阅读 sowft 框架源码, 了解 sowf ...

  2. Alamofire源码解读系列(二)之错误处理(AFError)

    本篇主要讲解Alamofire中错误的处理机制 前言 在开发中,往往最容易被忽略的内容就是对错误的处理.有经验的开发者,能够对自己写的每行代码负责,而且非常清楚自己写的代码在什么时候会出现异常,这样就 ...

  3. Alamofire源码解读系列(十二)之时间轴(Timeline)

    本篇带来Alamofire中关于Timeline的一些思路 前言 Timeline翻译后的意思是时间轴,可以表示一个事件从开始到结束的时间节点.时间轴的概念能够应用在很多地方,比如说微博的主页就是一个 ...

  4. Alamofire源码解读系列(十二)之请求(Request)

    本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...

  5. Alamofire源码解读系列(四)之参数编码(ParameterEncoding)

    本篇讲解参数编码的内容 前言 我们在开发中发的每一个请求都是通过URLRequest来进行封装的,可以通过一个URL生成URLRequest.那么如果我有一个参数字典,这个参数字典又是如何从客户端传递 ...

  6. Alamofire源码解读系列(三)之通知处理(Notification)

    本篇讲解swift中通知的用法 前言 通知作为传递事件和数据的载体,在使用中是不受限制的.由于忘记移除某个通知的监听,会造成很多潜在的问题,这些问题在测试中是很难被发现的.但这不是我们这篇文章探讨的主 ...

  7. Alamofire源码解读系列(五)之结果封装(Result)

    本篇讲解Result的封装 前言 有时候,我们会根据现实中的事物来对程序中的某个业务关系进行抽象,这句话很难理解.在Alamofire中,使用Response来描述请求后的结果.我们都知道Alamof ...

  8. Alamofire源码解读系列(六)之Task代理(TaskDelegate)

    本篇介绍Task代理(TaskDelegate.swift) 前言 我相信可能有80%的同学使用AFNetworking或者Alamofire处理网络事件,并且这两个框架都提供了丰富的功能,我也相信很 ...

  9. Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager)

    Alamofire源码解读系列(七)之网络监控(NetworkReachabilityManager) 本篇主要讲解iOS开发中的网络监控 前言 在开发中,有时候我们需要获取这些信息: 手机是否联网 ...

随机推荐

  1. jQuery – AJAX get() 和 post() 方法

    jQuery get() 和 post() 方法用于通过 HTTP GET 或 POST 请求从服务器请求数据. HTTP 请求:GET vs. POST 两种在客户端和服务器端进行请求-响应的常用方 ...

  2. PHP MySQL Delete

    DELETE 语句用于从数据库表中删除行. 删除数据库中的数据 DELETE FROM 语句用于从数据库表中删除记录. 语法 DELETE FROM table_name WHERE some_col ...

  3. python3+django2 开发易语言网络验证(上)

    创作背景: 在某论坛中下载到一套php开发易语言网络验证的教程,照着看下来,花了两天的时间,结果发现教程里开发的网络验证,以及随着教程一起给学员的源码,都存在着根本用不了的bug!我想要看看能不能在原 ...

  4. 两个activity之间透明过渡效果和经验

    来看下效果图: 大致效果解释: 1. 当用户点击登录时logo下滑一定距离 2. 下滑后旋转90时 变化图标 3. 继续旋转90度 4. 然后移动到左上角 透明度渐变到上个activity 最后销毁当 ...

  5. Scheme r5rs letrec的用法

    说明,这是r5rs的用法. (letrec ((<variable> <init>) ...) <body>) 假设((<variable> <i ...

  6. TCP发送源码学习(2)--tcp_write_xmit

    一.tcp_write_xmit()将发送队列上的SBK发送出去,返回值为0表示发送成功.函数执行过程如下:1.检测拥塞窗口的大小.2.检测当前报文是否完全处在发送窗口内.3.检测报文是否使用nagl ...

  7. 学习TensorFlow,调用预训练好的网络(Alex, VGG, ResNet etc)

    视觉问题引入深度神经网络后,针对端对端的训练和预测网络,可以看是特征的表达和任务的决策问题(分类,回归等).当我们自己的训练数据量过小时,往往借助牛人已经预训练好的网络进行特征的提取,然后在后面加上自 ...

  8. AFNetworking详解和相关文章链接

    写在开头: 作为一个iOS开发,也许你不知道NSUrlRequest.不知道NSUrlConnection.也不知道NSURLSession...(说不下去了...怎么会什么都不知道...)但是你一定 ...

  9. Linux中的高级文本处理命令,cut命令,sed命令,awk命令

    1.2.1 cut命令 cut命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields    ## 用于有特定分隔字符 [r ...

  10. Android开发艺术探索——第二章:IPC机制(中)

    Android开发艺术探索--第二章:IPC机制(中) 好的,我们继续来了解IPC机制,在上篇我们可能就是把理论的知识写完了,然后现在基本上是可以实战了. 一.Android中的IPC方式 本节我们开 ...