国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

zepto源碼分析之form模塊

Muninn / 1243人閱讀

摘要:形如源代碼在的原型上添加了相關(guān)方法。類似源代碼每個(gè)表單的和都通過(guò)編碼最后通過(guò)符號(hào)分割有了的基礎(chǔ),就是將相應(yīng)的和都通過(guò)編碼,然后用符號(hào)進(jìn)行分割,也就達(dá)到了我們要的結(jié)果。

前言

JavaScript最初的一個(gè)應(yīng)用場(chǎng)景就是分擔(dān)服務(wù)器處理表單的責(zé)任,打破處處依賴服務(wù)器的局面,這篇文章主要介紹zepto中form模塊關(guān)于表單處理的幾個(gè)方法,serialize、serializeArraysubmit。

原文鏈接

github項(xiàng)目地址

表單相關(guān)回顧

在開(kāi)始學(xué)些form模塊相關(guān)方法前,我們先來(lái)回顧一下表單提交時(shí),瀏覽器是怎么樣將數(shù)據(jù)發(fā)送給服務(wù)器的(以下內(nèi)容摘自《JavaScript高級(jí)程序設(shè)計(jì)》第14章 14.4節(jié) 表單序列化)

對(duì)表單字段的名稱和值進(jìn)行URL編碼,使用&分隔。

不發(fā)送禁用的表單字段。(也就是屬性disabled為true的)

只發(fā)送勾選的復(fù)選框和單選按鈕

不發(fā)送type為reset和button的按鈕

多選選擇框中每個(gè)選擇的值多帶帶一個(gè)條目

在單擊提交按鈕表單的情況下,也會(huì)發(fā)送提交按鈕的value值,否則不發(fā)送提交按鈕。

select元素的值,就是選中的option元素的value屬性的值,如果option元素沒(méi)有value屬性,則是option元素的文本值。 在表單序列化得過(guò)程中,一般不包含任何按鈕字段,因?yàn)榻Y(jié)果字符串很可能是通過(guò)其他方式提交的,除此之外其他規(guī)則都應(yīng)該遵循。

有了上面的知識(shí)的回顧,接下來(lái)我們開(kāi)始看zepto中serializeserializeArray的實(shí)現(xiàn)

serializeArray

因?yàn)閟erialize依賴serializeArray的實(shí)現(xiàn),所以我們先來(lái)看看它是怎么實(shí)現(xiàn)的。而他的作用是把form表單序列化成一個(gè)由 name 和 value 屬性組成的對(duì)象的數(shù)組。形如:

[
  {name: "qianlongo", value: "haha"},
  {name: "wangmin", value: "heihei"}
]

源代碼

 $.fn.serializeArray = function() {
  var name, type, result = [],
    add = function(value) {
      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
    
    if (name && field.nodeName.toLowerCase() != "fieldset" &&
      !field.disabled && type != "submit" && type != "reset" && type != "button" && type != "file" &&
      ((type != "radio" && type != "checkbox") || field.checked))
        
        add($(field).val())
  })
  return result
}

在$的原型上添加了serializeArray相關(guān)方法。一開(kāi)始聲明了name,type, result三個(gè)變量,分別存儲(chǔ)表單控件的name屬性,type屬性,以及最后函數(shù)執(zhí)行完成后要返回的數(shù)組。

首先通過(guò)this[0]判斷有未選中表單元素,如果沒(méi)有返回的結(jié)果就是一個(gè)空數(shù)組了。如果選中了,則對(duì)該表單的相關(guān)控件(form.elements表示表單中所有控件的集合)進(jìn)行遍歷。

獲取單個(gè)控件的類型(type),name屬性(name),再接著就是判斷符合提交到服務(wù)器端的表單控件條件了。

需要有name屬性(條件為"真")

不能是fieldset元素

不能是已經(jīng)禁止的元素(即disable為true)

不能是submit、reset、button、file等元素

對(duì)于單選和多選控件,只發(fā)送已經(jīng)勾選的。

在上面的條件都滿足的條件下,調(diào)用add函數(shù)并將通過(guò)$(elements).val()獲取到的值傳入。

add函數(shù)的邏輯也非常簡(jiǎn)單。如果value是數(shù)組,則將value數(shù)組遞歸的每一項(xiàng)傳入add。不是數(shù)組就是直接按照{ name: name, value: value }形式推入result了。

不過(guò)什么時(shí)候value會(huì)為數(shù)組呢?我們需要從zepto模塊的val函數(shù)實(shí)現(xiàn)看起

val函數(shù)實(shí)現(xiàn)

function val (value) {
  if (0 in arguments) {
    if (value == null) value = ""
    return this.each(function (idx) {
      this.value = funcArg(this, value, idx, this.value)
    })
  } else {
    // 主要看這里,multiple是用來(lái)設(shè)置下拉列表是否可以多選的。
    // 如果是多選的,則選擇被選中(即selected為true)的元素并通過(guò)pluck方法,讀取該元素的value值,最后返回的是一個(gè)數(shù)組
    return this[0] && (this[0].multiple ?
      $(this[0]).find("option").filter(function () { return this.selected }).pluck("value") :
      this[0].value)
  }
}
serialize

將表單內(nèi)容序列化為查詢字符串。類似name=qianlongo&sex=boy

源代碼

$.fn.serialize = function(){
  var result = []
  this.serializeArray().forEach(function(elm){
    // 每個(gè)表單的name和value都通過(guò)encodeURIComponent編碼
    result.push(encodeURIComponent(elm.name) + "=" + encodeURIComponent(elm.value))
  })
  // 最后通過(guò)&符號(hào)分割
  return result.join("&")
}

有了serializeArray的基礎(chǔ),serialize就是將相應(yīng)的name和value都通過(guò)encodeURIComponent編碼,然后用&符號(hào)進(jìn)行分割,也就達(dá)到了我們要的結(jié)果。

submit

有兩種用法,當(dāng)傳入了一個(gè)回調(diào)函數(shù)的時(shí)候,是給指定的表單的submit事件添加一個(gè)回調(diào)處理函數(shù)。

如果沒(méi)有傳入回調(diào)函數(shù)則觸發(fā)當(dāng)前表單submit事件,并且執(zhí)行默認(rèn)的提交表單行為(前提是沒(méi)有阻止瀏覽器默認(rèn)行為)

源代碼

$.fn.submit = function(callback) {
  // 如果傳了回調(diào)函數(shù),則在選中的元素上添加submit事件
  if (0 in arguments) this.bind("submit", callback)
  // 否則在沒(méi)有傳遞回調(diào)函數(shù)的情況下,并且選中有表單元素  
  else if (this.length) {
    var event = $.Event("submit")
    // 觸發(fā)選中的第一個(gè)表單的是submit事件,注意這里只是手動(dòng)觸發(fā)綁定的submit事件,并不會(huì)提交表單
    this.eq(0).trigger(event)
    // 如果沒(méi)有阻止默認(rèn)事件,便調(diào)用form.submit()提交表單
    if (!event.isDefaultPrevented()) this.get(0).submit()
  }
  return this
}

結(jié)尾

以上是zepto form模塊的相關(guān)源碼分析,歡迎大家指正。

文章記錄

form模塊

zepto源碼分析之form模塊

zepto模塊

這些Zepto中實(shí)用的方法集

Zepto核心模塊之工具方法拾遺

event模塊

mouseenter與mouseover為何這般糾纏不清?

向zepto.js學(xué)習(xí)如何手動(dòng)觸發(fā)DOM事件

誰(shuí)說(shuō)你只是"會(huì)用"jQuery?

ajax模塊

原來(lái)你是這樣的jsonp(原理與具體實(shí)現(xiàn)細(xì)節(jié))

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/88819.html

相關(guān)文章

  • Zepto源碼Form模塊

    摘要:模塊處理的是表單提交。表單提交包含兩部分,一部分是格式化表單數(shù)據(jù),另一部分是觸發(fā)事件,提交表單。最終返回的結(jié)果是一個(gè)數(shù)組,每個(gè)數(shù)組項(xiàng)為包含和屬性的對(duì)象。否則手動(dòng)綁定事件,如果沒(méi)有阻止瀏覽器的默認(rèn)事件,則在第一個(gè)表單上觸發(fā),提交表單。 Form 模塊處理的是表單提交。表單提交包含兩部分,一部分是格式化表單數(shù)據(jù),另一部分是觸發(fā) submit 事件,提交表單。 讀 Zepto 源碼系列文章已...

    陳江龍 評(píng)論0 收藏0
  • Zepto源碼Data模塊

    摘要:的模塊用來(lái)獲取節(jié)點(diǎn)中的屬性的數(shù)據(jù),和儲(chǔ)存跟相關(guān)的數(shù)據(jù)。獲取節(jié)點(diǎn)指定的緩存值。如果存在,則刪除指定的數(shù)據(jù),否則將緩存的數(shù)據(jù)全部刪除。為所有下級(jí)節(jié)點(diǎn),如果為方法,則節(jié)點(diǎn)自身也是要被移除的,所以需要將自身也加入到節(jié)點(diǎn)中。 Zepto 的 Data 模塊用來(lái)獲取 DOM 節(jié)點(diǎn)中的 data-* 屬性的數(shù)據(jù),和儲(chǔ)存跟 DOM 相關(guān)的數(shù)據(jù)。 讀 Zepto 源碼系列文章已經(jīng)放到了github上,歡...

    wua_wua2012 評(píng)論0 收藏0
  • Zepto這樣操作元素屬性

    摘要:還有一點(diǎn)需要注意的是方法設(shè)置或者獲取都是在操作元素的屬性,那它和,的區(qū)別在哪呢可以查看設(shè)置設(shè)置與的設(shè)置部分比較類似,既支持直接傳入普通的字符串也支持傳入回調(diào)函數(shù)。 前言 使用Zepto的時(shí)候,我們經(jīng)常會(huì)要去操作一些DOM的屬性,或元素本身的固有屬性或自定義屬性等。比如常見(jiàn)的有attr(),removeAttr(),prop(),removeProp(),data()等。接下來(lái)我們挨個(gè)整...

    付倫 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<