表单的处理在前端开发中一样意义非凡,dojo/dom-form模块提供了一系列方法来处理表单元素。比如:

  • fieldToObject: 将一个表单字段转化成JavaScript原生类型,可能是string、array等
  • toObject:将一个表单元素转化成JavaScript对象
  • toQuery: 将一个表单元素转化成编码后的query字符串
  • toJson: 将一个表单元素转化成JSON字符串

  我们知道,表单字段的值可能是一个结果,也可能是多个结果,所以在JavaScript中字段的值可能是字符串也可能是数组,form模块中提供了一个setValue函数,该函数用于便利form中的表单元素时,取出其中的字段值:

function setValue(/*Object*/ obj, /*String*/ name, /*String*/ value){

        // Skip it if there is no value
if(value === null){
return;
}
// 如果name存在,转化成数组,不存在直接赋值给obj
var val = obj[name];
if(typeof val == "string"){ // inline'd type check
obj[name] = [val, value];
}else if(lang.isArray(val)){
val.push(value);
}else{
obj[name] = value;
}
}

  同时并不是所有在表单中的元素都能够转化成为表单字段,比如:"file|submit|image|reset|button"和没有name的元素;在处理的时候也要把他们排除掉。

  fieldToObject将单个元素转化成字段值,这里有三种情况:普通input、radio与checkbox、select(多选、单选),同时没有name的、上文提到的file|submit|image|reset|button、disabled为true的元素都应该排除:

        fieldToObject: function fieldToObject(/*DOMNode|String*/ inputNode){
var ret = null;
inputNode = dom.byId(inputNode);
if(inputNode){
var _in = inputNode.name, type = (inputNode.type || "").toLowerCase();
//没有name的元素、disabled为true的都应该排除
if(_in && type && !inputNode.disabled){
if(type == "radio" || type == "checkbox"){
//radio和checkbox只有选中状态才有意义
if(inputNode.checked){
ret = inputNode.value;
}
}else if(inputNode.multiple){//这部分是深度优先搜索的一种实现,目的在于找到select中的option元素
ret = [];
var nodes = [inputNode.firstChild];
while(nodes.length){
for(var node = nodes.pop(); node; node = node.nextSibling){
if(node.nodeType == 1 && node.tagName.toLowerCase() == "option"){
if(node.selected){
ret.push(node.value);
}
}else{
if(node.nextSibling){
nodes.push(node.nextSibling);
}
if(node.firstChild){
nodes.push(node.firstChild);
}
break;
}
}
}
}else{
ret = inputNode.value;
}
}
}
return ret; // Object
}

  dojo中实现判断type时并没有排除不合适的type,这是一个缺陷。

  toObject,将整个表单转化为Object类型。思路简单:便利所有有效的表单元素,利用fieldToObject取出字段值,将所有的字段放入一个对象中,这里要利用上文提到的setValue方法。

        toObject: function formToObject(/*DOMNode|String*/ formNode){
var ret = {}, elems = dom.byId(formNode).elements;
//依次便利表单元素,取出字段值
for(var i = 0, l = elems.length; i < l; ++i){
var item = elems[i], _in = item.name, type = (item.type || "").toLowerCase();
//没有name的、不合适的元素、disabled状态的元素排除掉
if(_in && type && exclude.indexOf(type) < 0 && !item.disabled){
setValue(ret, _in, form.fieldToObject(item));
//<input type="image" src="....">对于图片按钮的处理
if(type == "image"){
ret[_in + ".x"] = ret[_in + ".y"] = ret[_in].x = ret[_in].y = 0;
}
}
}
return ret; // Object
}

  toQuery与toJSON都是利用toObject转为为对象后,进行进一步操作。其中toQuery方法利用了io-query模块的objectToQuory方法,这个下篇文章在解释。而toJSON只是简单的调用了JSON.stringify方法。

json.stringify(form.toObject(formNode), null, prettyPrint ? 4 : 0);

dojo/dom-form的更多相关文章

  1. dojo/dom源码学习

    dojo/dom模块作为一个基础模块,最常用的就是byId方法.除此之外还有isDescendant和setSelectable方法. dom.byId(myId)方法:   各种前端类库都免不了与D ...

  2. dojo/dom源码

    dojo/dom源码学习   dojo/dom模块作为一个基础模块,最常用的就是byId方法.除此之外还有isDescendant和setSelectable方法. dom.byId(myId)方法: ...

  3. DOJO DOM 功能

    In this tutorial, you'll learn about how to use Dojo to manipulate the DOM in a simple, cross-browse ...

  4. dojo/dom dojo/domConstruct dojo/query

    dom.byId require(["dojo/dom", "dojo/domReady!"], function(dom) { var one = dom.b ...

  5. dojo 七 DOM dojo/dom

    官方教程:Dojo DOM Functions对dom的使用,需要引用包dojo/dom.1.获取节点,dom.byIdbyId中既可以传递一个字符串,也可以传递一个节点对象 require([&qu ...

  6. dojo下的dom按钮与dijit/form/Button

    众所周知,在dojo里存在dom和widget两个类型,dom指的是普通类型的HTML元素,包括各种类型的标签.按钮.输入框等等,而widget指的是dojo自身所带的模板,同时也包括按钮.输入框等等 ...

  7. Dojo - 操作Dom的函数

    DOM Manipulation You might be seeing a trend here if you have gotten this far in the tutorial, in th ...

  8. Dojo初探之3:dojo的DOM操作、query操作和domConstruct元素位置操作(基于dojo1.11.2版本)

    前言: 前面两章讲了dojo的基本规范和配置,当然这个配置不是必须的,当你有这需求的时候就可以用到dojo的config配置. dojo的所有js都是符合AMD规范进行异步加载的:http://blo ...

  9. 【Dojo 1.x】笔记3 等待DOM加载完成

    有的web页面总是得等DOM加载完成才能继续执行功能,例如,待页面DOM加载完成后,才能在DIV上进行渲染图形. Dojo提供了这个功能的模块,叫domReady,但是由于它很特殊,就在结尾加了个叹号 ...

  10. Dojo操作dom元素的样式

    1.使用dom-style的set方法,可以直接设置dom元素的样式属性,这和使用dom元素的style属性效果一样. 2.使用dom-class的replace方法可以替换某个dom元素的样式,ad ...

随机推荐

  1. python课程第二周重点记录

    python课程第二周重点记录 1.元组的元素不可被修改,元组的元素的元素可以被修改(字典在元组中,字典的值可以被修改) 2.个人感觉方便做加密解密 3.一些方法的使用 sb = "name ...

  2. Linux_arm驱动之按键模拟脉冲实现定时器的精确计时

    /***************************************************************** 内核驱动部分button_ker.c ************** ...

  3. 微信小程序0.11.122100版本新功能解析

    微信小程序0.11.122100版本新功能解析   新版本就不再吐槽了,整的自己跟个愤青似的.人老了,喷不动了,把机会留给年轻人吧.下午随着新版本开放,微信居然破天荒的开放了开发者论坛.我很是担心官方 ...

  4. netty学习

    1.不选择java原生nio的原因   (1)nio的类库和api繁杂   (2)需要具备其他的额外的技能做铺垫,例如熟悉java多线程编程.   (3)可靠性能力补齐的工作量和难度都非常大,例如客户 ...

  5. Android studio 分析内存泄漏

    以前用eclipse的时候,我们采用的是DDMS和MAT,不仅使用步骤复杂繁琐,而且要手动排查内存泄漏的位置,操作起来比较麻烦.后来随着Android studio的潮流,我也抛弃了eclipse加入 ...

  6. 易学PHP——PHP基础知识

    PHP 语言标记 因为 PHP 是兼容当时的主流语言,所以 PHP 有四种标记方式: <?php PHP 代码 ?>.这是 PHP 最为正宗的语言标记,称为标准风格标记.XML 风格标记等 ...

  7. Android观察者模式的简单实现demo

    观察者模式就是:当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新. 下面介绍一种简单的使用方法,(下面有demo链接)先看一下project的目录构成: ObserverList ...

  8. 使用jigdo下载debian [windows环境下]

    使用jigdo下载debian  本文地址:http://www.cnblogs.com/yhLinux/p/4104451.html 准备工作: 下载jigdo:http://atterer.org ...

  9. Cocoapods的安装,卸载和使用

    [一]Cocoapods的安装 (1)Cocoapods的官方网站为: https://cocoapods.org/ .如果你的电脑已经安装了Ruby开发环境,那么在终端(Terminal)中使用以下 ...

  10. Android APK 签名 (转发)

    Cordova 3.5 为 Android APK 签名,生成可发布的 APK 程序文件  任侠  2014-06-07 00:04  移动开发  抢沙发  16,288 views  目录 [隐藏] ...