红宝书 第14章整理——表单
来源:互联网 发布:建筑工程招投标软件 编辑:程序博客网 时间:2024/06/05 15:40
1、基础知识
①关于name 与id 区别
ID就像是一个人的身份证号码,而Name就像是他的名字,ID显然是唯一的,而Name是可以重复的。
ID和html页面内部元素相关,不和页面元素的内容相关。name则更多地和页面元素的内容相关
所以ID更多是在DOM中使用,name更多在后台服务器端调用。
关于name的使用:
用途1: 作为可与服务器交互数据的HTML元素的服务器端的标示,比如input、select、textarea、和button等。我们可以在服务器端根据其Name通过Request.Params取得元素提交的值。
用途2: HTML元素Input type='radio'分组,我们知道radio button控件在同一个分组类,check操作是mutex的,同一时间只能选中一个radio,这个分组就是根据相同的Name属性来实现的。
用途3: 建立页面中的锚点,我们知道<a href="URL">link</a>是获得一个页面超级链接,如果不用href属性,而改用Name,如:<a name="PageBottom"></a>,我们就获得了一个页面锚点。
用途4: 作为对象的Identity,如Applet、Object、Embed等元素。比如在Applet对象实例中,我们将使用其Name来引用该对象。
用途5: 在IMG元素和MAP元素之间关联的时候,如果要定义IMG的热点区域,需要使用其属性usemap,使usemap="#name"(被关联的MAP元素的Name)。
用途6: 某些特定元素的属性,如attribute,meta和param。例如为Object定义参数<PARAM NAME = "appletParameter" VALUE = "value">或Meta中<META NAME = "Author" CONTENT = "Dave Raggett">。
显然这些用途都不是能简单的使用ID来代替掉的,所以HTML元素的ID和Name的却别并不是身份证号码和姓名这样的区别,它们更本就是不同作用的东西。
当然HTML元素的Name属性在页面中也可以起那么一点ID的作用,因为在DHTML对象树中,我们可以使用document.getElementsByName来获取一个包含页面中所有指定Name元素的对象数组。Name属性还有一个问题,当我们动态创建可包含Name属性的元素时,不能简单的使用赋值element.name = "..."来添加其Name,而必须在创建Element时,使用document.createElement('<element name = "myName"></element>')为元素添加Name属性。
② 提交表单
一般用户点击提交按钮或者图像时,就会提交表单内容
定义方式2种:
用input定义:<input type = "submit" value="Submit button"> / <input type = "submit" src = "a.gif">
直接用button定义:<button type = "submit" >Submit button</button>
若不想触发submit事件,用户自定义提交,可用form.submit() ;
注意:
1、提交表单最大的问题,就是重复提交表单。比如用户重复按多次按钮。解决办法:在第一次提交表单后就禁用提交按钮,或,用onsubmit事件忽略后续的提交
2、若要给submit按键添加事件处理程序,注意事件不要用onclick,要用onsubmit! 因为不同浏览器对于onclick与onsubmit处理方法不一样,可能存在先后顺序的时差
③ 重置表单
type=reset
这样一按就全部清空
或者form.reset()
④表单字段
可以用DOM方法访问表单字段。每一个表单都有elements属性,该属性是表单所有表单字段的集合,是一个有序列表。
例如是按照顺序的<input> <textarea> <button>等等,
var form = document.getElementById("form");var field1 = form.elements[0]; //取得表单第一个字段内容var field2 = form.elements["textbox1"] //取得名为textbox1的字段
如果很多表单控件都使用相同的name,比如一组单选按钮,name就会返回一个nodelist
表单字段的属性:
当取得表单字段后,可以利用其以下属性:
disabled: 布尔值,表示是否被禁用
name:当前字段名称
value:当前字段最终要交给服务器的值
type:当前字段类型,例如CheckBox,radio //表单中特有的属性,不是innerHTML,而是控件自身的value
表单字段的属性:
focus() //获得焦点
blur() //失去焦点
form.elements[0].focus(); //自动将焦点放到第一个字段上
对应的事件: onfocus,onblur,change
2、文本框
input type = "text"
单行输入文本框。size可以设置文本框的宽高。value可以设置文本框的初始值。maxlength可以设置最大输入长度
<textarea>
多行输入,初始值不能用value写,要放在<></>之间,不能指定最大长度
方法:
select:用于选择文本框中的所有文本 —— textbox.select(); //不接受参数
事件:
select
可以用selectStart与selectEnd来取得选择的文本,二者都是偏移量
①校验输入内容
1、屏蔽字符:
一般会禁止用户输入违规字符,就可以利用keypress写事件监听,然后用正则来检测
用getCharCode(event) 来获取用户输入的字符编码
再用String.fromCharCode(charcode)来转回string,利用正则表达式来检测
如果检测失败,可用preventDefault来屏蔽
2、剪切板
还有cut,copy,paste等等事件
3、选择框(下拉)
<select> + <option>
<select name="locaton" id = "location"> <option value="q">aaaa</option> <option value="qq">bbbb</option> <option value="qqq">cccc</option> <option value="qqqq">dddd</option> </select>
对于每一个option都有一个option对象,有以下属性可以调用:
index:当前选项在所有option集合的索引
selected:布尔值,表示是否被选中
text:文本
value:值
option:所有选项的合集
var text= selectbox.options[0].text; //第一个选项的文本var value = selectbox.option[0].value; //第一个选项的值
选中的选项:
若为单选,则可以用selectedIndex来调取
举例:
var selectedoption = selectbox.options[selectbox.selectedIndex]; alert(selectedoption.value);alert(selectedoption.text);
若为多选,用selected+循环,看所有option谁的状态为selected,是的话push一个数组,这样调取。selectedIndex默认只能看一个,后面的选项无效
for(var i=0, len=selectbox.options.length; i<len; i++){ option = selectbox.options[i]; if(option.selected){ if(option.selected){ result.push(option); //push到result数组中 } }}
4、序列化(提交表单)
是为了配和ajax技术,将name与value上传服务器时,将表单内容进行整合
name与value进行URL编码,然后用和号(&)分隔
然后有一些规定,比如禁用的不发送,只发送用户选择的选项,没选的不发送等等
书上有一段成熟的代码
5、富文本
富文本编辑(所见即所得):
在页面中嵌入一个包含空HTML页面的iframe。通过设置designMode属性,这个空白的HTML页面可以被编辑,编辑对象就是该页面的<body>元素的HTML代码。
当designMode设置为on时,怎个文档都可以被编辑,然后就可以编辑文本,例如加粗斜体等等
实现:
方法一:
先自己写好一个HTML文档的格式,例如
<!DOCTYPE html><html><head> <title>aaaa</title></head><body> //此处可为空白,留着编写</body></html>
将这个文档命名为blank.html
然后,在程序中插入<iframe>
<iframe name="richedit" style="height:100px;width:100px;" src="blank.html"></iframe><script> window.onload=function(){ frames["richedit"].document.designMode = "on"; }</script>
这样在打开window之后,就会出现一个类似于文本编辑框的可编辑区,但是具有跟网页一样的样式
方法二:
直接给元素标签设置contenteditable
<div class="a" id = "b" contenteditable></div>
好处是不限于HTML文档iframe了,任何元素设置了这个属性都可以被编辑,该值可以改为true,false,inherit(继承父辈)
6、两个表单之间的互联(百度课程中涉及)
情景: 两个下拉菜单,一个为城市,一个为大学。当选择城市时,大学的option会随之改变
直接上代码,具体在GitHub中有
//html中,先只写全所有的城市option,与第一个城市对应的所有大学//第一个select<select name="select1" id="select1"> <option value="beijing">北京</option> <option value = "shanghai">上海</option> <option value="guangzhou">广州</option></select>//第二个select,只写北京对应的就可以<select name="select2" id="select2"> <option value="qinghua">清华大学</option> <option value="beida">北京大学</option></select>
接下来两个select的交互,实际上就是如何读取第一个select的选项内容,以及如何动态的改写第二个select的option内容
function select(){//先写好一组对象,名值对,分别是城市与大学的全部 var data={ beijing:["清华大学","北京大学"], shanghai:["上海交大","复旦大学"], guangzhou:["A大学","B大学"] }//接下来开始读取+更改var source = document.getElementById("select1");var target = document.getElementById("select2");var select = source.options[source.options.selectedIndex.value]; //注意这句,就是利用selectedIndex.value来读取用户选中项的内容target.innerHTML=""; //先清空原有的所有optionfor(var i=0 ; i<data[selected].length; i++){ var opt = document.creatElement("option"); opt.innerHTML = data[selected][i]; //将之前的目录内容写进去 document.getELementById("select2").appendChild(opt); //把心的option写进去}}
- 红宝书 第14章整理——表单
- 红宝书 第3章 整理——数据类型+函数入门
- 红宝书 第4章整理——变量+内存管理
- 红宝书 第6章整理——创建对象
- 红宝书 第6章整理——继承部分
- 红宝书 第7章整理——函数+闭包
- 红宝书 第8章整理——BOM
- 红宝书 第9章整理——客户端检测
- 红宝书 第10章整理——DOM
- 红宝书 第11章整理——DOM扩展
- 红宝书 第13章整理——事件
- 红宝书 第15章整理——canvas
- 红宝书 第17章整理——错误处理
- 红宝书 第18章整理——XML入门
- 红宝书 第18章整理——XML与JS
- 红宝书 第18章整理——XPath
- 红宝书 第10章整理——E4X
- 红宝书 第20章整理——JSON
- 腾讯云ubuntu配置ssl
- 剑指offer-二维数据的查找
- 【SPOJ3267】D-query-莫队算法
- svn 系统调用失败解决
- Spring事务的一些细节问题
- 红宝书 第14章整理——表单
- 私活,是对技术达人最好的点赞
- JAVA中日期 yyyy-MM-dd HH:mm:ss和yyyy-MM-dd hh:mm:ss的区别
- 关闭Eclipse的控制台console自动跳出
- MVC和四大组件的理解
- C++与JAVA中的某些语言风格以及需要注意的地方
- 关于类的声明和定义分离的问题
- ThinkPHP的使用(一)
- 挑战密室