源碼註釋node
// 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)
方法圖數組