只要表单中存在上面列出的任何一种按钮,那么在相应表单控件拥有焦点的情况下,按回车键就可 以提交该表单。(textarea 是一个例外,在文本区中回车会换行。)如果表单里没有提交按钮,按回车 键不会提交表单。
以这种方式提交表单时,浏览器会在将请求发送给服务器之前触发 submit 事件。这样,我们就有 机会验证表单数据,并据以决定是否允许表单提交。阻止这个事件的默认行为就可以取消表单提交。
这两个按钮都可以用来重置表单。在重置表单时,所有表单字段都会恢复到页面刚加载完毕时的初 始值。如果某个字段的初始值为空,就会恢复为空;而带有默认值的字段,也会恢复为默认值。
可以像访问页面中的其他元素一样,使用原生 DOM 方法访问表单元素。此外,每个表单都有elements 属性,该属性是表单中所有表单元素(字段)的集合。这个 elements 集合是一个有序列表, 其中包含着表单中的所有字段,例如 、
元素之外,所有表单字段都拥有相同的一组属性。由于 类型可以表示多 种表单字段,因此有些属性只适用于某些字段,但还有一些属性是所有字段所共有的。表单字段共有的 属性如下。
disabled:布尔值,表示当前字段是否被禁用。
form:指向当前字段所属表单的指针;只读。
name:当前字段的名称。
readOnly:布尔值,表示当前字段是否只读。
tabIndex:表示当前字段的切换(tab)序号。
type:当前字段的类型,如"checkbox"、"radio",等等。
value:当前字段将被提交给服务器的值。对文件字段来说,这个属性是只读的,包含着文件 在计算机中的路径。
能够动态修改表单字段属性,意味着我们可以在任何时候,以任何方式来动态操作表单。例如,很 多用户可能会重复单击表单的提交按钮。在涉及信用卡消费时,这就是个问题:因为会导致费用翻番。 为此,常见的解决方案,就是在第一次单击后就禁用提交按钮。只要侦听 submit 事件,并在该事件 发生时禁用提交按钮即可。
共有的表单字段方法
每个表单字段都有两个方法:focus()和 blur()。其中,focus()方法用于将浏览器的焦点设置 到表单字段,即激活表单字段,使其可以响应键盘事件。例如,接收到焦点的文本框会显示插入符号, 随时可以接收输入。使用 focus()方法,可以将用户的注意力吸引到页面中的某个部位。例如,在页面 加载完毕后,将焦点转移到表单中的第一个字段。为此,可以侦听页面的 load 事件,并在该事件发生 时在表单的第一个字段上调用 focus()方法
要注意的是,如果第一个表单字段是一个 元素,且其 type 特性的值为"hidden",那么 以上代码会导致错误。另外,如果使用 CSS的 display 和 visibility 属性隐藏了该字段,同样也会 导致错误。 HTML5为表单字段新增了一个 autofocus 属性。在支持这个属性的浏览器中,只要设置这个属性, 不用 JavaScript就能自动把焦点移动到相应字段。
与 focus()方法相对的是 blur()方法,它的作用是从元素中移走焦点。在调用 blur()方法时, 并不会把焦点转移到某个特定的元素上;仅仅是将焦点从调用这个方法的元素上面移走而已。在早期 Web 开发中,那时候的表单字段还没有 readonly 特性,因此就可以使用 blur()方法来创建只读字段。 现在,虽然需要使用 blur()的场合不多了,但必要时还可以使用的。
共有的表单字段事件
除了支持鼠标、键盘、更改和 HTML事件之外,所有表单字段都支持下列 3个事件。
当用户改变了当前字段的焦点,或者我们调用了 blur()或 focus()方法时,都可以触发 blur 和 focus 事件。这两个事件在所有表单字段中都是相同的。但是,change 事件在不同表单控件中触发的 次数会有所不同。对于 和
通常,可以使用 focus 和 blur 事件来以某种方式改变用户界面,要么是向用户给出视觉提示,要 么是向界面中添加额外的功能(例如,为文本框显示一个下拉选项菜单)。而 change 事件则经常用于 验证用户在字段中输入的数据。例如,假设有一个文本框,我们只允许用户输入数值。此时,可以利用 focus 事件修改文本框的背景颜色,以便更清楚地表明这个字段获得了焦点。可以利用 blur 事件恢复 文本框的背景颜色,利用 change 事件在用户输入了非数值字符时再次修改背景颜色。
2 文本框脚本
在 HTML 中,有两种方式来表现文本框:一种是使用 元素的单行文本框,另一种是使用
要表现文本框,必须将 元素的 type 特性设置为"text"。而通过设置 size 特性,可以指 定文本框中能够显示的字符数。通过 value 特性,可以设置文本框的初始值,而 maxlength 特性则用 于指定文本框可以接受的大字符数。
另一个与 的区别在于,不能在 HTML中给
我们建议读者像上面这样使用 value 属性读取或设置文本框的值,不建议使用标准的 DOM方法。 换句话说,不要使用 setAttribute()设置 元素的 value 特性,也不要去修改
2.1 选择文本
上述两种文本框都支持 select()方法,这个方法用于选择文本框中的所有文本。在调用 select() 方法时,大多数浏览器(Opera 除外)都会将焦点设置到文本框中。这个方法不接受参数,可以在任何 时候被调用
选择(select)事件
与 select()方法对应的,是一个 select 事件。在选择了文本框中的文本时,就会触发 select 事件。不过,到底什么时候触发 select 事件,还会因浏览器而异。在 IE9+、Opera、Firefox、Chrome 和 Safari中,只有用户选择了文本(而且要释放鼠标),才会触发 select 事件。而在 IE8及更早版本中,只要用户选择了一个字母(不必释放鼠标),就会触发 select 事件。另外,在调用 select()方法时也 会触发 select 事件。
取得选择的文本
虽然通过select事件我们可以知道用户什么时候选择了文本,但仍然不知道用户选择了什么文本。 HTML5 通过一些扩展方案解决了这个问题,以便更顺利地取得选择的文本。该规范采取的办法是添加 两个属性:selectionStart 和 selectionEnd。这两个属性中保存的是基于 0 的数值,表示所选择 文本的范围(即文本选区开头和结尾的偏移量)。
选择部分文本
HTML5 也为选择文本框中的部分文本提供了解决方案,即早由 Firefox 引入的 setSelectionRange()方法。现在除select()方法之外,所有文本框都有一个setSelectionRange() 方法。这个方法接收两个参数:要选择的第一个字符的索引和要选择的后一个字符之后的字符的索引 (类似于 substring()方法的两个参数)。
2.2 过滤输入
我们经常会要求用户在文本框中输入特定的数据,或者输入特定格式的数据。例如,必须包含某些 字符,或者必须匹配某种模式。由于文本框在默认情况下没有提供多少验证数据的手段,因此必须使用 JavaScript来完成此类过滤输入的操作。而综合运用事件和 DOM手段,就可以将普通的文本框转换成能 够理解用户输入数据的功能型控件。
屏蔽字符
有时候,我们需要用户输入的文本中包含或不包含某些字符。例如,电话号码中不能包含非数值字 符。如前所述,响应向文本框中插入字符操作的是 keypress 事件。因此,可以通过阻止这个事件的默 认行为来屏蔽此类字符。
虽然理论上只应该在用户按下字符键时才触发 keypress 事件,但有些浏览器也会对其他键触发此 事件。Firefox 和 Safari(3.1 版本以前)会对向上键、向下键、退格键和删除键触发 keypress 事件; Safari 3.1及更新版本则不会对这些键触发 keypress 事件。这意味着,仅考虑到屏蔽不是数值的字符还 不够,还要避免屏蔽这些极为常用和必要的键。所幸的是,要检测这些键并不困难。在 Firefox 中,所 有由非字符键触发的 keypress 事件对应的字符编码为 0,而在 Safari 3以前的版本中,对应的字符编 码全部为 8。为了让代码更通用,只要不屏蔽那些字符编码小于 10的键即可。
除此之外,还有一个问题需要处理:复制、粘贴及其他操作还要用到 Ctrl 键。在除 IE 之外的所有 浏览器中,前面的代码也会屏蔽 Ctrl+C、Ctrl+V,以及其他使用 Ctrl的组合键。因此,后还要添加一 个检测条件,以确保用户没有按下 Ctrl键
操作剪贴板
IE是第一个支持与剪贴板相关事件,以及通过 JavaScript访问剪贴板数据的浏览器。IE的实现成为 了事实上的标准,不仅 Safari 2、Chrome和 Firefox 3也都支持类似的事件和剪贴板访问(Opera不支持通过 JavaScript访问剪贴板),HTML 5后来也把剪贴板事件纳入了规范。下列就是 6个剪贴板事件。
beforecopy:在发生复制操作前触发。
copy:在发生复制操作时触发。
beforecut:在发生剪切操作前触发。
cut:在发生剪切操作时触发。
beforepaste:在发生粘贴操作前触发。
paste:在发生粘贴操作时触发
由于没有针对剪贴板操作的标准,这些事件及相关对象会因浏览器而异。在 Safari、Chrome和 Firefox 中,beforecopy、beforecut 和 beforepaste 事件只会在显示针对文本框的上下文菜单(预期将发 生剪贴板事件)的情况下触发。但是,IE则会在触发 copy、cut 和 paste 事件之前先行触发这些事件。 至于 copy、cut 和 paste 事件,只要是在上下文菜单中选择了相应选项,或者使用了相应的键盘组合 键,所有浏览器都会触发它们。
在实际的事件发生之前,通过 beforecopy、beforecut 和 beforepaste 事件可以在向剪贴板发 送数据,或者从剪贴板取得数据之前修改数据。不过,取消这些事件并不会取消对剪贴板的操作——只 有取消 copy、cut 和 paste 事件,才能阻止相应操作发生。 要访问剪贴板中的数据,可以使用 clipboardData 对象:在 IE中,这个对象是 window 对象的 属性;而在 Firefox 4+、Safari和 Chrome中,这个对象是相应 event 对象的属性。但是,在 Firefox、 Safari和 Chorme中,只有在处理剪贴板事件期间 clipboardData 对象才有效,这是为了防止对剪贴板 的未授权访问;在 IE 中,则可以随时访问 clipboardData 对象。为了确保跨浏览器兼容性,好只 在发生剪贴板事件期间使用这个对象。
这个 clipboardData 对象有三个方法:getData()、setData()和 clearData()。其中,getData() 用于从剪贴板中取得数据,它接受一个参数,即要取得的数据的格式。在 IE中,有两种数据格式:"text" 和"URL"。在 Firefox、Safari 和 Chrome 中,这个参数是一种 MIME 类型;不过,可以用"text"代表 "text/plain"。
类似地,setData()方法的第一个参数也是数据类型,第二个参数是要放在剪贴板中的文本。对于 第一个参数,IE 照样支持"text"和"URL",而 Safari 和 Chrome 仍然只支持 MIME 类型。但是,与 getData()方法不同的是,Safari和 Chrome的 setData()方法不能识别"text"类型。这两个浏览器在 成功将文本放到剪贴板中后,都会返回 true;否则,返回 false。
由于并非所有浏览器都支持访问剪贴板,所以更简单的做法是屏蔽一或多个剪贴板操作。在支持 copy、cut 和 paste 事件的浏览器中(IE、Safari、Chrome和 Firefox 3及更高版本),很容易阻止这些 事件的默认行为。在 Opera中,则需要阻止那些会触发这些事件的按键操作,同时还要阻止在文本框中 显示上下文菜单
2.3 自动切换焦点
使用 JavaScript可以从多个方面增强表单字段的易用性。其中,常见的一种方式就是在用户填写 完当前字段时,自动将焦点切换到下一个字段。通常,在自动切换焦点之前,必须知道用户已经输入了 既定长度的数据(例如电话号码)。
为增强易用性,同时加快数据输入,可以在前一个文本框中的字符达到大数量后,自动将焦点切 换到下一个文本框。换句话说,用户在第一个文本框中输入了 3个数字之后,焦点就会切换到第二个文 本框,再输入 3个数字,焦点又会切换到第三个文本框。
2.4 HTML5约束验证API
为了在将表单提交到服务器之前验证数据,HTML5新增了一些功能。有了这些功能,即便 JavaScript 被禁用或者由于种种原因未能加载,也可以确保基本的验证。换句话说,浏览器自己会根据标记中的规 则执行验证,然后自己显示适当的错误消息(完全不用 JavaScript 插手)。当然,这个功能只有在支持 HTML5这部分内容的浏览器中才有效,这些浏览器有 Firefox 4+、Safari 5+、Chrome和 Opera 10+。
只有在某些情况下表单字段才能进行自动验证。具体来说,就是要在 HTML 标记中为特定的字段 指定一些约束,然后浏览器才会自动执行表单验证。
必填字段
第一种情况是在表单字段中指定了 required 属性,如下面的例子所示:
任何标注有 required 的字段,在提交表单时都不能空着。这个属性适用于 、
其他输入类型
HTML5为 元素的 type 属性又增加了几个值。这些新的类型不仅能反映数据类型的信息, 而且还能提供一些默认的验证功能。其中,"email"和"url"是两个得到支持多的类型,各浏览器也 都为它们增加了定制的验证机制。例如:
顾名思义,"email"类型要求输入的文本必须符合电子邮件地址的模式,而"url"类型要求输入的 文本必须符合 URL 的模式。不过,本节前面提到的浏览器在恰当地匹配模式方面都存在问题。明显 的是"-@-"会被当成一个有效的电子邮件地址。浏览器开发商还在解决这些问题。
数值范围
除了"email"和"url",HTML5 还定义了另外几个输入元素。这几个元素都要求填写某种基于数字的值:"number"、"range"、"datetime"、"datetime-local"、"date"、"month"、"week", 还有"time"。浏览器对这几个类型的支持情况并不好,因此如果真想选用的话,要特别小心。目前, 浏览器开发商主要关注更好的跨平台兼容性以及更多的逻辑功能。因此,本节介绍的内容某种程度上有 些超前,不一定马上就能在实际开发中使用。
对所有这些数值类型的输入元素,可以指定 min 属性(小的可能值)、max 属性(大的可能值) 和 step 属性(从 min 到 max 的两个刻度间的差值)。例如,想让用户只能输入 0到 100的值,而且这 个值必须是 5的倍数,可以这样写代码:
在不同的浏览器中,可能会也可能不会看到能够自动递增和递减的数值调节按钮(向上和向下按 钮)。 以上这些属性在 JavaScript中都能通过对应的元素访问(或修改)。此外,还有两个方法:stepUp() 和 stepDown(),都接收一个可选的参数:要在当前值基础上加上或减去的数值。(默认是加或减 1。)
输入模式
HTML5为文本字段新增了 pattern 属性。这个属性的值是一个正则表达式,用于匹配文本框中的 值。例如,如果只想允许在文本字段中输入数值,可以像下面的代码一样应用约束:
注意,模式的开头和末尾不用加^和$符号(假定已经有了)。这两个符号表示输入的值必须从头到 尾都与模式匹配
与其他输入类型相似,指定 pattern 也不能阻止用户输入无效的文本。这个模式应用给值,浏览 器来判断值是有效,还是无效。在 JavaScript中可以通过 pattern 属性访问模式。
检测有效性
使用 checkValidity()方法可以检测表单中的某个字段是否有效。所有表单字段都有个方法,如 果字段的值有效,这个方法返回 true,否则返回 false。字段的值是否有效的判断依据是本节前面介 绍过的那些约束。换句话说,必填字段中如果没有值就是无效的,而字段中的值与 pattern 属性不匹 配也是无效的。
禁用验证
通过设置 novalidate 属性,可以告诉表单不进行验证。
在 JavaScript中使用 noValidate 属性可以取得或设置这个值,如果这个属性存在,值为 true, 如果不存在,值为 false。
3 选择框脚本
选择框是通过和元素创建的。为了方便与这个控件交互,除了所有表单字段共 有的属性和方法外,HTMLSelectElement 类型还提供了下列属性和方法。
add(newOption, relOption):向控件中插入新元素,其位置在相关项(relOption) 之前。
multiple:布尔值,表示是否允许多项选择;等价于 HTML中的 multiple 特性。
options:控件中所有元素的 HTMLCollection。
remove(index):移除给定位置的选项。
selectedIndex:基于 0的选中项的索引,如果没有选中项,则值为-1。对于支持多选的控件, 只保存选中项中第一项的索引。
size:选择框中可见的行数;等价于 HTML中的 size 特性。 选择框的 type 属性不是"select-one",就是"select-multiple",这取决于 HTML代码中有 没有 multiple 特性。选择框的 value 属性由当前选中项决定,相应规则如下。
如果没有选中的项,则选择框的 value 属性保存空字符串。
如果有一个选中项,而且该项的 value 特性已经在 HTML中指定,则选择框的 value 属性等 于选中项的 value 特性。即使 value 特性的值是空字符串,也同样遵循此条规则。
如果有一个选中项,但该项的 value 特性在 HTML中未指定,则选择框的 value 属性等于该 项的文本。
如果有多个选中项,则选择框的 value 属性将依据前两条规则取得第一个选中项的值。
在 DOM 中,每个元素都有一个 HTMLOptionElement 对象表示。为便于访问数据, HTMLOptionElement 对象添加了下列属性:
index:当前选项在 options 集合中的索引。
label:当前选项的标签;等价于 HTML中的 label 特性。
selected:布尔值,表示当前选项是否被选中。将这个属性设置为 true 可以选中当前选项。
text:选项的文本。
value:选项的值(等价于 HTML中的 value 特性)。
其中大部分属性的目的,都是为了方便对选项数据的访问。
在操作选项时,我们建议好是使用特定于选项的属性,因为所有浏览器都支持这些属性。在将表 单控件作为 DOM节点的情况下,实际的交互方式则会因浏览器而异。我们不推荐使用标准 DOM技术 修改元素的文本或者值。
最后,我们还想提醒读者注意一点:选择框的 change 事件与其他表单字段的 change 事件触发的 条件不一样。其他表单字段的 change 事件是在值被修改且焦点离开当前字段时触发,而选择框的 change 事件只要选中了选项就会触发。
3.1 选择选项
对于只允许选择一项的选择框,访问选中项的简单方式,就是使用选择框的 selectedIndex 属 性,如下面的例子所示:
var selectedOption = selectbox.options[selectbox.selectedIndex];
对于可以选择多项的选择框,selectedfIndex 属性就好像只允许选择一项一样。设置 selectedIndex 会导致取消以前的所有选项并选择指定的那一项,而读取 selectedIndex 则只会返 回选中项中第一项的索引值。
另一种选择选项的方式,就是取得对某一项的引用,然后将其 selected 属性设置为 true
与selectedIndex 不同,在允许多选的选择框中设置选项的 selected 属性,不会取消对其他选中项 的选择,因而可以动态选中任意多个项。但是,如果是在单选选择框中,修改某个选项的 selected 属性则 会取消对其他选项的选择。需要注意的是,将 selected 属性设置为 false 对单选选择框没有影响。
实际上,selected 属性的作用主要是确定用户选择了选择框中的哪一项。要取得所有选中的项, 可以循环遍历选项集合,然后测试每个选项的 selected 属性。
3.2 添加选项
可以使用 JavaScript 动态创建选项,并将它们添加到选择框中
3.3 移除选项
与添加选项类似,移除选项的方式也有很多种。首先,可以使用 DOM 的 removeChild()方法, 为其传入要移除的选项,如下面的例子所示:
selectbox.removeChild(selectbox.options[0]); //移除第一个选项
其次,可以使用选择框的 remove()方法。这个方法接受一个参数,即要移除选项的索引
后一种方式,就是将相应选项设置为 null。
3.4 移动和重排选项
在 DOM标准出现之前,将一个选择框中的选项移动到另一个选择框中是非常麻烦的。整个过程要 涉及从第一个选择框中移除选项,然后以相同的文本和值创建新选项,后再将新选项添加到第二个选 择框中。而使用 DOM 的 appendChild()方法,就可以将第一个选择框中的选项直接移动到第二个选 择框中。我们知道,如果为 appendChild()方法传入一个文档中已有的元素,那么就会先从该元素的 父节点中移除它,再把它添加到指定的位置。
移动选项与移除选项有一个共同之处,即会重置每一个选项的 index 属性。 重排选项次序的过程也十分类似,好的方式仍然是使用 DOM方法。要将选择框中的某一项移动 到特定位置,合适的 DOM 方法就是 insertBefore();appendChild()方法只适用于将选项添加 到选择框的后。
4 表单序列化
随着 Ajax的出现,表单序列化已经成为一种常见需求(第 21章将讨论 Ajax)。在 JavaScript中,可 以利用表单字段的 type 属性,连同 name 和 value 属性一起实现对表单的序列化。在编写代码之前, 有必须先搞清楚在表单提交期间,浏览器是怎样将数据发送给服务器的。
如果表单中包含
元素,则该元素会出现在元素集合中,但没有 type 属性。因此,如果 type 属性未定义,则不需要对其进行序列化。同样,对于各种按钮以及文件输入字段也是如此(文件输入字段在 表单提交过程中包含文件的内容;但是,这个字段是无法模仿的,序列化时一般都要忽略)。对于单选按钮 和复选框,要检查其 checked 属性是否被设置为 false,如果是则退出 switch 语句。如果 checked 属性为true,则继续执行 default 语句,即将当前字段的名称和值进行编码,然后添加到 parts 数组中。函数 的后一步,就是使用 join()格式化整个字符串,也就是用和号来分隔每一个表单字段。
最后,serialize()函数会以查询字符串的格式输出序列化之后的字符串。当然,要序列化成其他 格式,也不是什么困难的事。
5 富文本编辑
富文本编辑,又称为 WYSIWYG(What You See Is What You Get,所见即所得)。在网页中编辑富 文本内容,是人们对 Web 应用程序大的期待之一。虽然也没有规范,但在 IE早引入的这一功能基 础上,已经出现了事实标准。而且,Opera、Safari、Chrome和 Firefox都已经支持这一功能。这一技术 的本质,就是在页面中嵌入一个包含空 HTML页面的 iframe。通过设置 designMode 属性,这个空白 的 HTML页面可以被编辑,而编辑对象则是该页面
元素的 HTML代码。designMode 属性有两 个可能的值:"off"(默认值)和"on"。在设置为"on"时,整个文档都会变得可以编辑(显示插入符 号),然后就可以像使用字处理软件一样,通过键盘将文本内容加粗、变成斜体,等等。
5.1 使用contenteditable属性
另一种编辑富文本内容的方式是使用名为 contenteditable 的特殊属性,这个属性也是由 IE 早实现的。可以把 contenteditable 属性应用给页面中的任何元素,然后用户立即就可以编辑该元素。 这种方法之所以受到欢迎,是因为它不需要 iframe、空白页和 JavaScript,只要为元素设置 contenteditable 属性即可。
5.2 操作富文本
与富文本编辑器交互的主要方式,就是使用 document.execCommand()。这个方法可以对文档执 行预定义的命令,而且可以应用大多数格式。可以为 document.execCommand()方法传递 3个参数: 要执行的命令名称、表示浏览器是否应该为当前命令提供用户界面的一个布尔值和执行命令必须的一个 值(如果不需要值,则传递 null)。为了确保跨浏览器的兼容性,第二个参数应该始终设置为 false, 因为 Firefox会在该参数为 true 时抛出错误。
5.3 富文本选区
在富文本编辑器中,使用框架(iframe)的 getSelection()方法,可以确定实际选择的文本。 这个方法是 window 对象和 document 对象的属性,调用它会返回一个表示当前选择文本的 Selection 对象。每个 Selection 对象都有下列属性。
anchorNode:选区起点所在的节点。
anchorOffset:在到达选区起点位置之前跳过的 anchorNode 中的字符数量。
focusNode:选区终点所在的节点。 focusOffset:focusNode 中包含在选区之内的字符数量。
isCollapsed:布尔值,表示选区的起点和终点是否重合。
rangeCount:选区中包含的 DOM范围的数量。
Selection 对象的这些属性并没有包含多少有用的信息。好在,该对象的下列方法提供了更多信 息,并且支持对选区的操作。
addRange(range):将指定的 DOM范围添加到选区中。
collapse(node, offset):将选区折叠到指定节点中的相应的文本偏移位置。
collapseToEnd():将选区折叠到终点位置。
collapseToStart():将选区折叠到起点位置。
containsNode(node):确定指定的节点是否包含在选区中。
deleteFromDocument():从文档中删除选区中的文本,与document.execCommand("delete", false, null)命令的结果相同。
extend(node, offset):通过将 focusNode 和 focusOffset 移动到指定的值来扩展选区。
getRangeAt(index):返回索引对应的选区中的 DOM范围。
removeAllRanges():从选区中移除所有 DOM范围。实际上,这样会移除选区,因为选区中 至少要有一个范围。 reomveRange(range):从选区中移除指定的 DOM范围。
selectAllChildren(node):清除选区并选择指定节点的所有子节点。
toString():返回选区所包含的文本内容。
5.4 表单与富文本
由于富文本编辑是使用 iframe 而非表单控件实现的,因此从技术上说,富文本编辑器并不属于表 单。换句话说,富文本编辑器中的 HTML 不会被自动提交给服务器,而需要我们手工来提取并提交 HTML。为此,通常可以添加一个隐藏的表单字段,让它的值等于从 iframe 中提取出的 HTML。具体 来说,就是在提交表单之前,从 iframe 中提取出 HTML,并将其插入到隐藏的字段中。