JavaScript DOM 学习第七章 表单的扩展


Posted in Javascript onFebruary 19, 2010

想法
假设你有一个在线的CD评级工具。你希望用户查看他们喜欢的所有CD。但是你怎么知道用户平均会查看多少张呢?你在这个页面上需要添加多少字段呢?
在W3CDOM出现之前这确实是一个问题。假设你放置了7张CD。但是用户很可能只想查看一张,太多可能会吓着用户,而有些用户想查看自己的所有CD,这样就不得不反复提交很多次。这确实很烦人。
只有使用W3C DOM才能让用户决定生成多少个字段。这个效果和之前的大不相同。
例子
当你点击发送的时候,表单就会把得到的所有参数以数组的形式发送。这用来检查是否真正的发送到了服务器端。不幸的是,mac版的IE和Safari不能发送。
IE的问题
windows下的IE有两个严重的问题:
第一个问题是所有生成的单选框都同属于一个数组,即使他们的names不同。这样用户就只能在所有的单选框里面选择一个。也就是说你不能在生成的表单里面实用单选框。
有读者说通过innerHTML生成的单选框没有问题。如果你非要实用单选框的话,你可以试试。
第二个问题是生成的表单通过传统的document.forms无法访问:IE没有在数组里面包含他们。这个可以通过给他们设置ID来解决。
解释
表单的HTML代码:

<div id="readroot" style="display: none"> 
    <input type="button" value="Remove review" 
        onclick="this.parentNode.parentNode.removeChild(this.parentNode);" /><br /><br /> 
    <input name="cd" value="title" /> 
    <select name="rankingsel"> 
        <option>Rating</option> 
        <option value="excellent">Excellent</option> 
        <option value="good">Good</option> 
        <option value="ok">OK</option> 
        <option value="poor">Poor</option> 
        <option value="bad">Bad</option> 
    </select><br /><br /> 
    <textarea rows="5" cols="20" name="review">Short review</textarea> 
    <br />Radio buttons included to test them in Explorer:<br /> 
    <input type="radio" name="something" value="test1" />Test 1<br /> 
    <input type="radio" name="something" value="test2" />Test 2 
</div> 
<form method="post" action="/cgi-bin/show_params.cgi"> 
    <span id="writeroot"></span> 
    <input type="button" id="moreFields" value="Give me more fields!" /> 
    <input type="submit" value="Send form" /> 
</form>

真正的表单项目在ID为readroot的DIV并且display值为none。这个DIV是一个模板,用户不能修改。当用户需要更多的表单的时候我们就复制这个模板然后添加在表单之后。我们在一开始的就加载,这样当用户打开页面的时候就能看到。
这个DIV在表单之外,所以当用户提交表单的时候,这个模板的内容不会被提交。
ID为writeroot的SPAN是一个标记。新的生成的表单就插入在他的前面。
添加表单项目
下面的代码可以再需要的时候用来添加表单项目:
var counter = 0; 
function moreFields() { 
    counter++; 
    var newFields = document.getElementById('readroot').cloneNode(true); 
    newFields.id = ''; 
    newFields.style.display = 'block'; 
    var newField = newFields.childNodes; 
    for (var i=0;i<newField.length;i++) { 
        var theName = newField[i].name 
        if (theName) 
            newField[i].name = theName + counter; 
    } 
    var insertHere = document.getElementById('writeroot'); 
    insertHere.parentNode.insertBefore(newFields,insertHere); 
} 
window.onload = moreFields;

首先我们需要一个计数器counter,因为所有的表单项都应该有唯一的一个名字。我们把计数器的值添加在生成name后面。初始化计数器:
var counter = 0;

然后是实际的函数。我们给计数器加1:
function moreFields() { 
counter++;

然后复制我们的模板,移除ID,并且把display设置为block。readroot应该是整个文档里面唯一的ID,复制模板后应该显示出来让用户看到。
var newFields = document.getElementById('readroot').cloneNode(true); 
newFields.id = ''; 
newFields.style.display = 'block';

我们遍历这个拷贝的子元素:
var newField = newFields.childNodes; 
for (var i=0;i<newField.length;i++) {

如果子元素有name属性,那么我们就在name值上加上计数器的值,以保证他的唯一性:
var theName = newField[i].name 
if (theName) 
newField[i].name = theName + counter; 
}

现在这个拷贝已经准备好插入了。我们把他插入到writeroot之前:
var insertHere = document.getElementById('writeroot'); 
insertHere.parentNode.insertBefore(newFields,insertHere); 
}

然后我们在页面加载的时候就执行一次,这样用户进入的时候就能看到:
window.onload = moreFields;

移除表单项
每一个模板的拷贝都有一个移除按钮:
<input type="button" value="Remove review" 
onclick="this.parentNode.parentNode.removeChild(this.parentNode);" />

点击这个按钮就会从移除他的父元素(DIV)。整个生成的表单就都会消失,并且不会再出现。
翻译地址:http://www.quirksmode.org/dom/domform.html
转载请保留以下信息
作者:北玉(tw:@rehawk)
Javascript 相关文章推荐
帮助避免错误的Javascript陷阱清单
May 31 Javascript
js 链式延迟执行DOME
Jan 04 Javascript
使用js画图之画切线
Jan 12 Javascript
基于jQuery实现网页进度显示插件
Mar 04 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
Jan 14 Javascript
vue数字类型过滤器的示例代码
Sep 07 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
Jan 08 Javascript
从零开始搭建webpack+react开发环境的详细步骤
May 18 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
Jul 25 Javascript
js实现中文实时时钟
Jan 15 Javascript
使用node.JS中的url模块解析URL信息
Feb 06 Javascript
微信小程序实现电影App导航和轮播
Nov 30 Javascript
JavaScript DOM学习第六章 表单实例
Feb 19 #Javascript
JavaScript DOM 学习第五章 表单简介
Feb 19 #Javascript
JavaScript DOM学习第四章 getElementByTagNames
Feb 19 #Javascript
JavaScript DOM 学习第三章 内容表格
Feb 19 #Javascript
JavaScript DOM 学习第二章 编辑文本
Feb 19 #Javascript
JavaScript DOM学习第一章 W3C DOM简介
Feb 19 #Javascript
JavaScript 题型问答有答案参考
Feb 17 #Javascript
You might like
php读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
javascript 简练的几个函数
2009/08/29 Javascript
真正的JQuery.ajax传递中文参数的解决方法
2011/05/28 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
将文本输入框内容加入表中的js代码
2013/08/18 Javascript
js 立即调用的函数表达式如何写
2014/01/12 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
2016/02/19 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
Angular工具方法学习
2016/12/26 Javascript
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
ng-zorro-antd 入门初体验
2018/12/03 Javascript
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
vue配置nprogress实现页面顶部进度条
2019/09/21 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
vuex存取值和映射函数使用说明
2020/07/24 Javascript
[01:21]DOTA2周边文化主题展 神秘商店火热开售
2017/07/30 DOTA
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
详解Python命令行解析工具Argparse
2016/04/20 Python
浅析Python中MySQLdb的事务处理功能
2016/09/21 Python
python查看文件大小和文件夹内容的方法
2019/07/08 Python
Python异常处理机制结构实例解析
2020/07/23 Python
PyCharm 解决找不到新打开项目的窗口问题
2021/01/15 Python
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
市场部专员岗位职责
2013/11/30 职场文书
自荐信写法介绍
2014/01/25 职场文书
美术指导助理求职信
2014/04/20 职场文书
求职信模板
2014/05/23 职场文书
公益广告标语
2014/06/19 职场文书
销售人员求职信
2014/07/22 职场文书
Django + Taro 前后端分离项目实现企业微信登录功能
2022/04/07 Python
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技