Zeptoソースコードを読むFormモジュール
5572 ワード
Form
モジュール処理はフォーム提出です.フォームコミットには、フォームデータのフォーマットと、フォームデータのトリガsubmit
イベント、フォームのコミットの2つの部分が含まれます.Zeptoソースシリーズの記事を読んでgithubに載せました.star:reading-zeptoを歓迎します.
ソースバージョン
本稿で読むソースコードはzepto 1である.2.0
GitBook
《reading-zepto》
.serializeArray()
$.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
フォーマット部分のコアメソッドであり、後のserialize
メソッド内部呼び出しもserializeArray
メソッドである.serializeArray
最終的に返される結果は1つの配列であり、各配列項目はname
およびvalue
属性を含むオブジェクトである.このうちname
はフォーム要素のname
属性値です.add関数
add = function(value) {
if (value.forEach) return value.forEach(add)
result.push({ name: name, value: value })
}
フォームの値は
add
関数で処理し、値が配列(サポートforEach
)メソッドの場合はforEach
ループを呼び出し、引き続きadd
関数で処理します.そうでない場合は結果を配列result
に格納します.最後に戻った結果もこれresult
.フォーム要素の遍歴
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())
})
コレクションに複数のフォームがある場合は、最初のフォームのフォーム要素のみが処理されます.
this[0].elements
最初のフォームのすべてのフォーム要素を取得します.type
フォームタイプname
フォーム要素name
属性値.この大きなコードの鍵は
if
の条件判断であり,実際には関係のないフォーム要素を排除し,条件に合致するフォーム要素のみを処理する.次の条件を1つ分析します.
field.nodeName.toLowerCase() != 'fieldset'
排除fieldset
元素;!field.disabled
無効化されたフォームは除外され、無効化されています.値が提出される必要はありません.type != 'submit'
確定ボタンを除外する.type != 'reset'
リセットボタンを除外する.type != 'button'
排除ボタン;type != 'file'
ファイル選択コントロールを除外する.((type != 'radio' && type != 'checkbox') || field.checked))
・radio
またはcheckbox
の場合は、必ず選択しなければならないので、これもよくわかりますが、選択していなければ、処理する価値はありません.次に、
add
メソッドを呼び出し、フォーム要素の値をその処理に渡す..serialize()
$.fn.serialize = function(){
var result = []
this.serializeArray().forEach(function(elm){
result.push(encodeURIComponent(elm.name) + '=' + encodeURIComponent(elm.value))
})
return result.join('&')
}
フォーム要素の処理が完了すると、最終的には
name1=value1&name2=value2&...
のような形になるserialize
方法はこの部分です.ここでは
serizlizeArray
返される配列についてさらに処理を行い、まずencodeURIComponent
シーケンス化name
とvalue
の値を用い、=
番で文字列に綴じ、新しい配列に格納し、最後にjoin
メソッドを呼び出し、&
で各配列を綴じる..submit()
$.fn.submit = function(callback) {
if (0 in arguments) this.bind('submit', callback)
else if (this.length) {
var event = $.Event('submit')
this.eq(0).trigger(event)
if (!event.isDefaultPrevented()) this.get(0).submit()
}
return this
}
データの処理が終わったら、次は提出する時間です.
if (0 in arguments) this.bind('submit', callback)
転送コールバック関数
callback
があれば、フォームにバインドsubmit
イベント、callback
をイベントのコールバックとします.else if (this.length) {
var event = $.Event('submit')
this.eq(0).trigger(event)
if (!event.isDefaultPrevented()) this.get(0).submit()
}
それ以外の場合は手動でバインド
submit
イベント、ブラウザのデフォルトイベントをブロックしていない場合は最初のフォームでトリガーsubmit
、フォームをコミットします.注意
eq
とget
の違い、eq
はZepto
対象、get
はDOM
要素を返します.シリーズ記事
License
署名-非商業的使用-演繹禁止4.0国際(CC BY-NC-ND 4.0)
最後に、すべての文章は同時に微信の公衆番号に送信され、注目を歓迎し、意見を歓迎します.
作者:対角の反対側