Zepto源码分析-form模块

源码注释

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

;(function($){

    /**
     * 序列表单内容为JSON数组
     * 返回类似[{a1:1},{a2:2}]的数组
     * @returns {Array}
     */
  $.fn.serializeArray = function() {
    var name, type, result = [],

      //{name:value}形式加入到结果数组中
      add = function(value) {
        //value是数组,递归添加到数组中
          //注意这里的写法    value.forEach(add)   将value数组递归的每一项传入add
          // 如 {a:[1,2,3]} -->  [{a:1},{a:2},{a:3}]
        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

        //排除fieldset,禁用元素,submit,reset,button,file和未被选中的radio,checkbox
        //原因是这些元素不需要传递给服务器
      if (name && field.nodeName.toLowerCase() != ‘fieldset‘ &&
        !field.disabled && type != ‘submit‘ && type != ‘reset‘ && type != ‘button‘ && type != ‘file‘ &&

        ((type != ‘radio‘ && type != ‘checkbox‘) || field.checked))

          //{name:value}形式加入到结果数组中
          add($(field).val())
    })
    return result
  }

    /**
     * 序列表表单内容为查询字符串
     *  转换成 a=1&b=2
     * @returns {string}
     */
  $.fn.serialize = function(){
    var result = []
    this.serializeArray().forEach(function(elm){
        // 每个key-value,都保守URI编码
      result.push(encodeURIComponent(elm.name) + ‘=‘ + encodeURIComponent(elm.value))
    })
    return result.join(‘&‘)
  }

    /**
     * 提交表单
     * @param callback
     * @returns {*}
     */
  $.fn.submit = function(callback) {
      //0 in arguments 判断是否传了回调函数
//      这里不应用bind,所有事件应该统一用on
      //传了回调,就当成绑定submit事件
    if (0 in arguments) this.bind(‘submit‘, callback)
    //没有传回调,当成直接提交
    else if (this.length) {//有表单元素
      var event = $.Event(‘submit‘)

      //第一个表单直接触发submit事件
        //如果绑定过submit事件,此处会执行submit绑定函数
        //注意,这里只是抛出事件,并不会提交表单
      this.eq(0).trigger(event)

        //如果未阻止浏览器默认事件,调用document.forms[0].submit()执行默认处理
        //document.forms[0].submit()提交表单
      if (!event.isDefaultPrevented()) this.get(0).submit()
    }
    return this
  }

})(Zepto)

方法图

时间: 2024-10-10 16:42:32

Zepto源码分析-form模块的相关文章

Zepto源码分析-deferred模块

源码注释 // Zepto.js // (c) 2010-2015 Thomas Fuchs // Zepto.js may be freely distributed under the MIT license. // // Some code (c) 2005, 2013 jQuery Foundation, Inc. and other contributors ;(function($){ var slice = Array.prototype.slice function Deferr

Zepto源码分析-event模块

源码注释 // Zepto.js // (c) 2010-2015 Thomas Fuchs // Zepto.js may be freely distributed under the MIT license. ;(function($){ var _zid = 1, undefined, slice = Array.prototype.slice, isFunction = $.isFunction, isString = function(obj){ return typeof obj

zepto源码分析系列

如果你也开发移动端web,如果你也用zepto,应该值得你看看.有问题请留言. Zepto源码分析-架构 Zepto源码分析-zepto(DOM)模块 Zepto源码分析-callbacks模块 Zepto源码分析-event模块 Zepto源码分析-ajax模块 Zepto源码分析-form模块 Zepto源码分析-deferred模块 Zepto源码分析-动画(fx fx_method)模块 内容一定要200字一定要200字内容一定要200字一定要200字内容一定要200字一定要200字内容

nginx源码分析--nginx模块解析

nginx的模块非常之多,可以认为所有代码都是以模块的形式组织,这包括核心模块和功能模块,针对不同的应用场合,并非所有的功能模块都要被用到,附录A给出的是默认configure(即简单的http服务器应用)下被连接的模块,这里虽说是模块连接,但nginx不会像apache或lighttpd那样在编译时生成so动态库而在程序执行时再进行动态加载,nginx模块源文件会在生成nginx时就直接被编译到其二进制执行文件中,所以如果要选用不同的功能模块,必须对nginx做重新配置和编译.对于功能模块的选

Zepto源码分析之二~三个API

由于时间关系:本次只对这三个API($.camelCase.$.contains.$.each)方法进行分析 第一个方法变量转驼峰:$.camelCase('hello-world-welcome'); 源码: var camelize; /** * 字符串替换 * 使用replace第二个参数带回调 */ camelize = function(str) { return str.replace(/-+(.)?/g, function(match, chr) { return chr ? ch

nginx源码分析之模块初始化

在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果.在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要通过结合源码来分析模块的初始化过程. 稍微了解nginx的人都知道nginx是高度模块化的,各个功能都封装在模块中,而各个模块的初始化则是根据配置文件来进行的,下面我们会看到nginx边解析配置文件中的指令,边初始化指令所属的模块,指令其实就是指示怎样初始化模块的. 模块初始化框架 模块的初始化主要

兄弟连区块链教程open-ethereum-pool矿池源码分析unlocker模块

兄弟连区块链教程open-ethereum-pool以太坊矿池源码分析unlocker模块open-ethereum-pool以太坊矿池-unlocker模块 unlocker模块配置 json"unlocker": {????"enabled": false,????"poolFee": 1.0,????"poolFeeAddress": "",????"donate": true,?

区块链教程btcpool矿池源码分析StratumServer模块解析

兄弟连区块链教程btcpool矿池源码分析StratumServer模块解析 核心机制总结 接收的job延迟超过60秒将丢弃 如果job中prevHash与本地job中prevHash不同,即为已产生新块,job中isClean状态将置为true????* true即要求矿机立即切换job 三种情况下将向矿机下发新job:???? 收到新高度的job???? 过去一个job为新高度且为空块job,且最新job为非空块job????* 达到预定的时间间隔30秒 最近一次下发job的时间将写入文件(

zepto源码分析-代码结构【转载】

本来想学习一下jQuery的源码,但由于jQuery的源码有10000多行,设计相当复杂,所以决定从zepto开始,分析一个成熟的框架的代码结构及执行步骤. 网上也有很多zepto的源码分析,有的给源码添加注释,有的谈与jQuery的不同,但是都没有系统的讲解zepto框架的代码结构及初始化Zepto对象的过程. 准备 默认你已经对面向对象有一定的了解,本文是边实践边写的,虽有些乱,但好处是为大家提供了分析的思路. 英文文档. 中文文档 注意在文中$变量表示一个函数对象,而$()表示执行函数,他