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 相关文章推荐
js左侧多级菜单动态的解决方案
Feb 01 Javascript
解析JSON对象与字符串之间的相互转换
Dec 18 Javascript
angular.js分页代码的实例
Jul 27 Javascript
javascript验证内容为数字以及长度为10的简单实例
Aug 20 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
Jan 21 Javascript
angularjs实现猜大小功能
Oct 23 Javascript
详解javascript中的babel到底是什么
Jun 21 Javascript
浅谈Vue的响应式原理
May 30 Javascript
JavaScript数组及常见操作方法小结
Nov 13 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
Nov 14 Javascript
vue+Element-ui前端实现分页效果
Nov 15 Javascript
javascript实现拼图游戏
Jan 29 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实现获取ip地址的5种方法,以及插入用户登录日志操作示例
2019/02/28 PHP
Jquery Validation插件防止重复提交表单的解决方法
2010/03/05 Javascript
jQuery源码分析之Event事件分析
2010/06/07 Javascript
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
jQuery+HTML5加入购物车代码分享
2020/10/29 Javascript
javascript中this指向详解
2016/04/23 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
javascript中json对象json数组json字符串互转及取值方法
2017/04/19 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
2019/10/25 Javascript
[50:58]2018DOTA2亚洲邀请赛3月29日 小组赛A组OpTic VS Newbee
2018/03/30 DOTA
python实现识别相似图片小结
2016/02/22 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
Python IDE环境之 新版Pycharm安装详细教程
2020/03/05 Python
在主流系统之上安装Pygame的方法
2020/05/20 Python
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
伯克斯奥特莱斯:Burkes Outlet
2019/03/30 全球购物
经贸日语毕业生自荐信
2013/11/03 职场文书
酒吧创业计划书
2014/01/18 职场文书
宿舍违规用电检讨书
2014/02/16 职场文书
委托证明模板
2014/09/16 职场文书
检讨书范文2000字
2015/01/28 职场文书
大学生军训感言
2015/08/01 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书
学习心得体会
2019/06/20 职场文书
致毕业季:你如何做好自己的职业生涯规划书?
2019/07/01 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers