【有书共读】《JS高级程序设计》读书笔记05

十三章

事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间。

JavaScript 与 HTML 之间的交互是通过事件实现的。可以使用事件处理程序来预定事件,以便事件发生时执行相应的代码。

事件流

事件流描述的是从页面中接收事件的顺序。

事件冒泡

事件捕获

DOM 事件流

事件处理程序

HTML 事件处理程序

通过 HTML 指定事件处理程序。

<input type="button" value="click me" onclick="showMessage()" /> 

这样做有几个缺点:

  1. 有时差,用户可能在 HTML 元素一出现在页面上就触发相应事件,但可能事件处理程序还不能执行。
  2. 这种事件处理程序的作用域链在不同浏览器中会导致不同结果,不同 JavaScript引擎遵循的标识符解析规则略有差异,很可能会在访问非限定对象成员时出错。
  3. HTML 与 JavaScript 代码紧密耦合,一旦改动,起码改动连个地方。不能满足结构、样式、行为分离。

DOM0 级事件处理程序

使用 JavaScript 指定事件处理程序的传统方式,就是将一个函数复制给一个事件处理程序属性。该方法简单,而且可以跨浏览器使用,知道现在依然应用广泛。

var btn = document.getElementById("myBtn");
btn.onclick = function() {
    alert(this.id);
} // 删除事件处理程序 btn.onclick = null;

DOM2 级事件处理程序

“DOM2 级时间”定义了两个方法来添加和删除事件处理程序,IE9+ 支持。

  • addEventListener()
  • removeEventListener()

它们都接受 3 个参数,要处理的事件类型,作为事件处理程序的函数和一个布尔值,true表示在捕获阶段调用事件处理函数,false表示在冒泡阶段调用。

使用 DOM2 级方法可以添加多个事件处理程序。通过addEventListener()添加的事件监听必须使用removeEventListener()来移除。


事件对象

在触发 DOM 上的某个时间时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息。

DOM 中的事件对象

无论用什么方法添加事件处理程序,都会传入event对象。event对象包含与创建它的特定事件有关的属性和方法。

属性/方法 类型 读/写 说明
bubbles Boolean 只读 表明事件是否冒泡
cancelable Boolean 只读 表明是否可以取消事件的默认行为
currentTarget Element 只读 表明事件处理程序当前正在处理事件的元素
defaultPrevented Boolean 只读 为true表示已经调用了preventDefault()方法
detail Integer 只读 与事件相关的细节信息
eventPhase Integer 只读 调用事件处理程序的阶段:1 表示捕获阶段,2 表示“处于目标”阶段,3 表示冒泡阶段
preventDefault() Function 只读 取消事件的默认行为
stopImmediatePropagation() Function 只读 取消事件的进一步捕获或冒泡,同时阻止任何事件处理程序被调用
stopPropagation() Function 只读 取消事件的进一步捕获或冒泡
target Element 只读 目标元素
type String 只读 被触发的事件类型
trusted Boolean 只读 为true表示事件是浏览器生成的,为false表示事件是由开发人员通过 JavaScript 创建的
view AbstractView 只读 与事件相关联的抽象试图,等同于发生事件的window对象

在事件处理程序中,对象this始终等于currentTarget,而target只包含事件的实际目标。

只有在事件处理程序执行期间,event对象才存在。一旦时间处理程序执行完毕,event对象将会被立即销毁。

事件类型

UI事件

事件 说明
load 页面完全加载后触发
unload 页面完全卸载或触发
abort 当用户停止下载过程时,如果嵌入的内容没有加载完,则在<object>元素上面触发
error 当发生 JavaScript 错误时在window上触发,当无法加载图像时在<img>元素上面触发
select 用户选中文本框中的文本的时候触发
resize 窗口或框架大小变化的时候触发
scroll 滚动带滚动条的内容时触发

焦点事件

焦点事件会在页面获得或者失去焦点的时候触发。利用这些事件和document.hasFocus()方法及document.activeElement属性配合,可以知晓用户在页面上的行踪。

方法/属性 说明
blur 在元素失去焦点时触发,不会冒泡
DOMFocusIn 在元素获得焦点时触发,与focus等价,但是会冒泡,只有 Opera 支持,在 DOM3 中被废弃
DOMFocusOut 在元素失去焦点时触发,是blur的通用版本,只有 Opera 支持,在 DOM3 中被废弃
focus 在元素获得焦点时触发,不会冒泡
focusin 在元素获得焦点时触发
focusout 在元素失去焦点时触发,会冒泡

鼠标和滚轮事件

DOM3 中定义了以下 9 个鼠标事件,如下表:

事件 说明
click 单击或回车时触发
dbclick 双击鼠标触发
mousedown 鼠标按下时触发
mouseenter 鼠标首次进入元素范围触发,这事件不冒泡,且在其后代元素上不会触发
mouseleave 鼠标离开元素范围触发,这事件不冒泡,且在其后代元素上不会触发
mousemove 鼠标在元素内部移动时,就会不断触发
mouseover 鼠标位于一个元素外部,然后用户将其首次移入另一个元素边界之内时触发
mouseout 鼠标离开元素范围进入另一个元素范围时触发
mouseup 在用户释放鼠标按钮时触发
mousewheel 鼠标滚轮滚动时触发,Firefox 不支持
DOMMouseScroll 鼠标滚轮滚动时触发,Firefox 支持

坐标位置

属性 说明
clientX 相对于浏览器视口中的水平坐标
clientY 相对于浏览器视口中的垂直坐标
pageX 相对于页面的水平坐标(页面没有滚动时,等于 clientX),IE 下有 x 属性
pageY 相对于页面的垂直坐标(页面没有滚动时,等于 clientY),IE 下有 y 属性
screenX 相对于屏幕坐标的水平坐标
screenY 相对于屏幕坐标的垂直坐标

修改键

虽然鼠标事件主要是在鼠标上触发的,但在按下鼠标时键盘上的某些键状态也可以影响到所要采取的操作,修改键如下:

属性 说明
shiftkey 检测是否按下了 shift 键
ctrlkey 检测是否按下了 ctrl 键
metakey 检测是否按下了 meta 键
altkey 检测是否按下了 alt 键

当鼠标事件发生时,通过检测这几个属性就可以确定用户是否同时按下了其中的键。

相关元素

对mouseover事件而言,事件的主目标是获得光标的元素,而相关元素就是那个失去光标的元素,mouseout则正好相反。

省略其他代码 }

鼠标按钮

更多事件信息


键盘与文本事件

有三个键盘事件:

  • keydown:当用户按下键盘上的任意键时触发,如果按住不放,会重复触发事件。
  • keypress:当用户按下键盘上的字符键时触发,如果按住不放,会重复触发事件。
  • keyup:当用户释放键盘上的键触发。

键码和字符编码

在发生keydown和keyup事件时,event对象的keyCode属性会包含一个代码,与键盘上一个特定的键对应。发生keypress事件时,event对象会包含一个charCode属性,会包含按下键所代表字符的编码。IE8 以下不支持charCode属性,但是会在keyCode中保存字符的 ASCII 编码。

var eventUtil = {
    getCharCode: function(event) { if(typeof event.charCode == 'number') { return event.charCode;
        } else { // IE8及以前,早期opera在keyCode中保存键码 return event.keyCode;
        }
    }
}

DOM3 级变化

DOM3 中不再包含charCode属性,而是包含两个新属性:key和char。key的值是一个字符串,按下某个字符键时,key的值就是相应的文本字符;按下非字符键,key的值是相应的键名(如“Shift”)。而char属性在按下字符键的行为与key相同,在按下非字符键时值为null。

textInput 事件

在 DOM3 级事件中引入,与keypress不同,只有在可编辑区域内输入字符的时候触发。出发该事件时,它的event对象中还包含一个data属性,这是属性就是用户输入的字符。event对象上还有一个属性,叫inputMethod,表示把文本输入到文本框中的方式。

  • 0,表示浏览器不确定是怎么输入的
  • 1,键盘输入
  • 2,粘贴
  • 3,拖放
  • 4,IME 输入
  • 5,在表单中选择某一项输入
  • 6,手写输入
  • 7,语音输入
  • 8,几种方法组合输入
  • 9,通过脚本输入

HTML5事件

contextmenu 事件

用以表示何时应该显示上下文菜单,以便开发人员取消默认的上下文菜单而提供自定义菜单。

beforeunload 事件

为了让开发人员有可能在页面卸载前阻止这一操作,这个事件会在浏览器卸载页面之前触发。但是不能彻底取消这个事件,因为那就相当于让用户无法离开当前页面。这个事件的意图是将控制权交给用户。为了显示这个弹出对话框,必须将event.returnValue的值设置为要显示给用户的字符串,同时作为函数的值返回。

DOMContentLoaded 事件

window的load事件会在页面中的一切都加载完毕时触发,但这个过程可能会因为要加载的外部资源过多而颇费周折。而DOMContentLoaded事件则在形成完整的 DOM 树之后就会触发,不理会图像、JavaScript 文件、CSS 文件或其他资源是否已经下载完毕。

readystatechange 事件

IE 为 DOM 文档中的某些部分提供了readystatechange事件。这个事件的目的是提供与文档或元素的加载状态有关的信息,支持该时间的每个对象都有一个readyState属性,可能包含下列 5 个值中的一个。

  • uninitialized(未初始化):对象存在但尚未初始化。
  • loading(正在加载):对象正在加载数据。
  • loaded(加载完毕):对象加载数据完成。
  • interactive(交互):可以操作对象了,但还没有完全加载。
  • complete(完成):对象已经加载完毕。


hashchange 事件

便于在 URL 的参数列表发生变化时通知开发人员。之所以新增这个事件,是因为在 Ajax 应用中,开发人员经常要利用 URL 参数列表来保存状态或导航信息。

必须要把该事件处理程序添加给window对象,然后 URL 参数列表只要变化就会调用它。此时的event对象应该额外包含两个属性:oldURL和newURL。这两个属性分别保存着参数列表前后的完整 URL。


触摸与手势事件

触摸事件

触摸事件会在用户手指放在屏幕上面时、在屏幕上滑动时或从屏幕上移开时触发。具体来说,有以下几个触摸事件:

  • touchstart:当手指触摸屏幕时触发,即使有一个手指放在屏幕上也会触发。
  • toucehmove:当手指在屏幕上滑动时连续地触发。
  • touchend:当手指从屏幕移开时触发。
  • touchcancel:当系统停止跟踪触摸时触发。

除了常见的 DOM 属性外,触摸事件还包含下列三个用于跟踪触摸的属性:

  • touches:表示当前跟踪的触摸操作的 Touch 对象的数组。
  • targetTouches:特定于事件目标的 Touch 对象的数组。
  • changeTouches:表示自上次触摸依赖发生了什么改变的 Touch 对象的数组。

每个 Touch 对象包含下列属性:

  • clientX:触摸目标在视口中的 x 坐标。
  • clientY:触摸目标在视口中的 y 坐标。
  • pageX:触摸目标在页面中的 x 坐标。
  • pageY:触摸目标在页面中的 y 坐标。
  • screenX:触摸目标在屏幕中的 x 坐标。
  • screenY:触摸目标在屏幕中的 y 坐标。
  • identifier:标识触摸的唯一 ID。
  • target:触摸 DOM 节点目标。

这些事件会在文档的所有元素上面触发,因而可以分别操作页面的不同部分。在触摸屏幕上的元素时,这些事件发生的顺序如下:

  1. touchstart
  2. mouseover
  3. mousemove
  4. mousedown
  5. mouseup
  6. click
  7. touchend

手势事件

两个手指触摸屏幕时就会产生手势,手势通常会改变显示项的大小,或者旋转显示项。有三个手势事件:

  • gesturestart:当一个手指已经按在屏幕上而另一手指又触摸屏幕时触发。
  • gesturechange:当触摸屏幕的任何一个手指的位置发生变化时触发。
  • gestureend:当任何一个手指从屏幕上移开时触发。

该事件包含两个额外属性

  • rotation:手指变化引起的旋转角度,负值表示逆时针旋转,正值表示顺时针旋转。
  • scale:表示两个手指间距离的变化情况;这个值从 1 开始,并随距离拉大而增长,随距离缩短而减小。

内存和性能

事件委托

只需在 DOM 树中尽量最高的层次上添加一个事件处理程序:

<ul id="myLinks"> <li id="goSomewhere">Go somewhere</li> <li id="doSomething">Do something</li> <li id="sayHi">Say hi</li> </ul> 
var list = document.getElementById('myLinks');
EventUtil.addHandler(list, 'click', function(event) { var target = EventUtil.getTarget(event);
    target.style.backgroundColor = 'red';
});

十四章

JavaScript 最早的应用就是分担服务器处理表单的责任,打破处处依赖服务器的局面

除了通过getElementById()获取表单元素,也可以使用document.forms取得页面中所有表单。

提交表单

用户单击提交按钮或图像按钮时,就会提交表单。使用<input>或<button>都可以定义提交按钮,只要将其type特性的值设置为"submit"即可,而图像按钮则是通过将<input>的type特性值设置为"image"来定义的。因此,只要我们单击以下代码生成的按钮,就可以提交表单。

<!-- 通用提交按钮 --> <input type="submit" value="Submit Form"> <!-- 自定义提交按钮 --> <button type="submit">Submit Form</button> <!-- 图像按钮 --> <input type="image" src="graphic.gif" /> 


也可以使用编程方式调用submit()方法也可以提交表单。不过用该方法提交表单时不会触发submit事件,因此在调用该事件之前需要先验证表单数据。

重置表单

在用户单击重置按钮时,表单会被重置。使用type特性值为"reset"的<input>或<button>都可以创建重置按钮,如下面的例子所示:

<!-- 通用重置按钮 --> <input type="reset" value="Reset Form"> <!-- 自定义重置按钮 --> <button type="reset">Reset Form</button> 

这两个按钮都可以用来重置表单。在重置表单时,所有表单字段都会恢复到页面刚加载完毕时的初始值。如果某个字段的初始值为空,就会恢复为空;而带有默认值的字段,也会恢复为默认值。

用户单击重置按钮重置表单时,会触发reset事件。利用这个机会,我们可以在必要时取消重置操作。

表单字段

可以像访问页面中的其他元素一样,使用原生 DOM 方法访问表单元素。此外,每个表单都有elements属性,该属性是表单中所有表单元素(字段)的集合。这个elements集合是一个有序列表,其中包含着表单中的所有字段,例如<input>、 <textarea>、 <button>和<fieldset>。每个表单字段在elements集合中的顺序,与它们出现在标记中的顺序相同,可以按照位置和name特性来访问它们。下面来看一个例子。

var form = document.getElementById("form1"); //取得表单中的第一个字段 var field1 = form.elements[0]; //取得名为"textbox1"的字段 var field2 = form.elements["textbox1"]; //取得表单中包含的字段的数量 var fieldCount = form.elements.length;

共有的表单字段属性

  • disabled:布尔值,表示当前字段是否被禁用。
  • form:指向当前字段所属表单的指针,只读。
  • name:当前字段的名称。
  • readOnly:布尔值,表示当前字段是否只读。
  • tabIndex:表示当前字段的切换(tab)序号。
  • type:当前字段的类型,如"checkbox"、"radio"等等。
  • value:当前字段将被提交给服务器的值。对文件字段来说,这个属性是只读的,包含着文件在计算机中的路径。

共有的表单字段方法

  • focus():用于将浏览器的焦点设置到表单字段,即激活表单字段,使其可以相应键盘事件。
  • blur():从元素中移走焦点。一般用于设置readyOnly字段(现在已经不需要了)。

HTML5 中添加了一个autofocus属性,在支持这个属性的浏览器中,只要设置了这个属性,不用 JavaScript 就能自动把焦点移动到相应字段。

共有的表单字段事件

除了支持鼠标、键盘、更改和 HTML 事件之外,所有表单字段都支持下列 3 个事件。

  • blur:当前字段失去焦点时触发。
  • change:对于<input>和<textarea>元素,在它们失去焦点且value值改变时触发;对于<select>元素,在其选项改变时触发。
  • focus:当前字段获得焦点时触发。

文本框脚本

在 HTML 中,有两种方式来表现文本框:一种是使用<input>元素的单行文本框,另一种是使用<textarea>的多行文本框。

要表现文本框,必须将<input>元素的type特性设置为"text"。而通过设置size特性,可以指定文本框中能够显示的字符数。通过value特性,可以设置文本框的初始值,而maxlength特性则用于指定文本框可以接受的最大字符数。

<textarea>元素则始终会呈现为一个多行文本框。要指定文本框的大小,可以使用rows和cols特性。其中, rows特性指定的是文本框的字符行数,而cols特性指定的是文本框的字符列数(类似于input元素的size特性)。与<input>元素不同, <textarea>的初始值必须要放在<textarea>和</textarea>之间,如下面的例子所示:

<textarea rows="25" cols="5">initial value</textarea> 

选择文本

上述两种文本框都支持select()方法,这个方法用于选择文本框中的所有文本。在调用select()方法时,大多数浏览器都会将焦点设置到文本框中。这个方法不接受参数,可以在任何时候被调用。

var textbox = document.forms[0].elements["textbox1"];

在文本框获得焦点时选择其所有文本,这是一种非常常见的做法,特别是在文本框包含默认值的时候。因为这样做可以让用户不必一个一个地删除文本。下面展示了实现这一操作的代码。

选择(select)事件

与select()方法对应的,是一个select事件。在选择了文本框的文本时,就会触发select事件。

取得选择的文本

HTML5 添加了两个属性:selectionStart和selectionEnd。这连个属性中保存的是基于 0 的数值,表示所选择文本的范围(即文本选区开头和结尾的偏移量)。

function getSelectedText(textbox){ return textbox.value.substring(textbox.selectionStart, textbox.selectionEnd);
}


过滤输入

我们经常会要求用户在文本框中输入特定的数据,或者输入特定格式的数据。由于文本框在默认情况下没有提供多少验证数据的手段,因此必须使用JavaScript 来完成此类过滤输入的操作。

屏蔽字符

上述代码中,由于 Firefox 和 Safari 会对向上键、向下键、退格键和删除键触发keypress事件;Firefox 中所有非字符键触发的keypress事件的字符编码是 0,Safari 3 以前版本中,对应的字符编码均为 8。除此之外还有一个问题需要考虑到买就是 Ctrl + C、Ctrl + V 以及其他 Ctrl 组合键。

操作剪贴板

要访问剪贴版中的数据,可以使用 clipboardData 对象:IE 中这个对象是window对象的属性,其他浏览器中,是相应event对象的属性。最好只在发生剪贴板事件期间使用这个对象。

clipboardData 对象有三个方法:

  • getData():接受一个参数,要取得的数据的格式。IE 中,有两种数据格式:"text"和"URL"。其他浏览器中,参数是一种 MIME 类型,不过,可以用"text"代表"text/plain"。
  • setData():第一个参数是数据类型,第二个参数是要放在剪贴板中的文本。
  • clearData():清除数据
var EventUtil = { // 省略的代码 getClipboardText: function(event) { var clipboardData = event.clipboardData || window.clipboardData; return clipboardData.getData("text");
    },
    setClipboardText: function(event) { if (event.clipboardData) { return event.clipboardData.setData("text/plain", value);
        } else if (window.clipboardData) { return window.clipboardData.setData("text", value);
        }
    }, // 省略的代码 }

自动切换焦点

使用 JavaScript 可以从多个方面增强表单字段的易用性。其中,最常见的一种方式就是在用户填写完当前字段时,自动将焦点切换到下一个字段。通常,在自动切换焦点之前,必须知道用户已经输入了既定长度的数据(例如电话号码)。 如下表单:

<input type="text" name="tel1" id="txtTel1" maxlength="3"> <input type="text" name="tel2" id="txtTel2" maxlength="3"> <input type="text" name="tel3" id="txtTel3" maxlength="4"> 

为增强易用性,同时加快数据输入,可以在前一个文本框中的字符达到最大数量后,自动将焦点切换到下一个文本框。换句话说,用户在第一个文本框中输入了 3 个数字之后,焦点就会切换到第二个文本框,再输入 3 个数字,焦点又会切换到第三个文本框。

function tabForward(event) {
    event = EventUtil.getEvent(event); var target = EventUtil.getTarget(event); if (target.value.length == target.maxlength) { var form = target.form; for (var i = 0, len = form.elements.length; i < len; i++) { if (form.elements[i] == target) { if (form.elements[i + 1]) {
                    form.elements[i + 1].focus();
                } return;
            }
        }
    }
}; var textbox1 = document.getElementById("txtTel1"); var textbox2 = document.getElementById("txtTel2"); var textbox3 = document.getElementById("txtTel3");

EventUtil.addHandler(textbox1, "keyup", tabForward);
EventUtil.addHandler(textbox2, "keyup", tabForward);
EventUtil.addHandler(textbox3, "keyup", tabForward);

HTML5 约束验证 API

必填字段

<input type="text" name="username" required>

其他输入类型

HTML5 为<input>元素添加了几个新的值,比较实用的就是email和url。

数值范围

还定义了另外几个输入元素,这几个元素都要求填写某种基于数字的值:"number"、"range"、"datetime"、"datetime-local"、"date"、"month"、"week"和"time"。

对所有这些数值类型的输入元素,可以指定min属性,max属性和step属性:

<input type="number" min="0" max="100" step="5" name="count"> 

以上属性在 JavaScript 中都能通过对应的元素访问(或修改),还有两个方法:

  • stepUp():在当前值基础上加上数值。
  • stepDown():在当前值基础上减去数值。

输入模式

HTML5 为文本字段新增了pattern属性,这个属性是一个正则表达式,用于匹配文本框中的值。

检测有效性

使用checkValidity()方法可以检测表单的某个字段是否有效,validaity属性则会告诉你为什么字段有效或者无效。这个对象包含一系列属性,每个属性会返回一个布尔值。

  • customError:如果设置了setCustomValidity(),则为true,否则返回false。
  • patternMismatch:如果值与指定的pattern属性不匹配,返回true。
  • rangeOverflow:如果值比max大,返回true。
  • rangeUnderflow:如果值比min小,返回true。
  • stepMisMatch:如果min和max之间的步长值不合理,返回true。
  • tooLong:如果值的长度超过了maxLength属性指定的长度,返回true。
  • typeMismatch:如果值不是"mail"或"url"要求的格式,返回true。
  • valid:如果这里的其他属性都是false,返回true。
  • validMissing:如果标注为required的字段中没有值,返回true。

禁用验证

设置noValidate属性,可以告诉表单不进行验证。

选择框脚本

选择框是通过<select>和<option>元素创建的。为了方便与这个控件交互,除了所有表单字段共有的属性和方法外, HTMLSelectElement 类型还提供了下列属性和方法:

  • add(newOption, relOption):向控件中插入新<option>元素,其位置在相关项(relOption)之前。
  • multiple:布尔值,表示是否允许多项选择;等价于 HTML 中的multiple特性。
  • options:控件中所有<option>元素的 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 中,每个<option>元素都有一个 HTMLOptionElement 对象表示。为便于访问数据,HTMLOptionElement 对象添加了下列属性:

  • index:当前选项在 options 集合中的索引。
  • label:当前选项的标签;等价于 HTML 中的label特性。
  • selected:布尔值,表示当前选项是否被选中。将这个属性设置为true可以选中当前选项。
  • text:选项的文本。
  • value:选项的值(等价于 HTML 中的value特性)

选择选项

var selectedOption = selectbox.options[selectbox.selectedIndex];

对于多选项,可以通过selected属性获取被选中的项。

function getSelectedOptions(selectbox) { var result = new Array(); var option = null; for (var i = 0, len = selectbox.options.length; i < len; i++) {
        option = selectbox.options[i]; if (option.selected) {
            result.push(option);
        }
    } return result;
}

添加选项

DOM 方法:

var newOption = document.createElement("option");
newOption.appendChild(docuemnt.createTextNode("Option Text"));
newOption.setAttribute("value", "Option value");
selectbox.appendChild(newOption);

用 Option 构造函数创建新选项:

var newOption = new Option("Option Text", "Option value");
selectbox.appendChild(newOption);

用add()方法:

var newOption = new Option("Option Text", "Option value");
selectbox.add(newOption, undefined);

移除选项

可以使用removeChild(),也可以使用remove()方法,接受一个参数,要删除选项的索引。

移动和重排选项

使用appendChild()和insertBefore()。

表单序列化

由于 Ajax 的出现,表单序列化已经成为常见需求,在序列化表单之前,必须了解在表单提交期间,浏览器是怎样将数据发送给服务器的。

  • 对表单字段的名称和值进行 URL 编码,使用和 & 分隔。
  • 不发送禁用的表单字段。
  • 只发送勾选的复选框和单选框按钮。
  • 不发送type为"reset"和"button"的按钮。
  • 多选选择框中的每个选中的值单独一个条目。
  • 在单击提交按钮提交表单的情况下,也会发送提交按钮;否则,不发送提交按钮。也包括 type 为"image"的<input>元素。
  • <select>元素的值,就是选中的<option>元素的value特性值。如果<option>元素没有value特性,则是<option>元素的文本值。
function serialize(form) { var parts = [],
        field = null,
        i,
        len,
        j,
        optLen,
        option,
        optValue; for (i = 0, len = form.elements.length; i < len; i++) {
        field = form.elements[i]; switch (field.type) { case "select-one": case "select-multiple": if (field.name.length) { for (j = 0, optLen = field.options.length; j < optLen; j++) {
                        option = field.options[j]; if (option.selected) {
                            optValue = ""; if (option.hasAttribute) {
                                optValue = (option.hasAttribute("value") ? option.value : option.text);
                            } else {
                                optValue = (option.attributes["value"].specified ? option.value : option.text);
                            }
                            parts.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(optValue));
                        }
                    }
                } break; case undefined: //fieldset case "file": //file input case "submit": //submit button case "reset": //reset button case "button": //custom button break; case "radio": //radio button case "checkbox": //checkbox if (!field.checked) { break;
                } /* falls through */ default: //don't include form fields without names if (field.name.length) {
                    parts.push(encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value));
                }
        }
    } return parts.join("&");
}

富文本编辑

富文本编辑,又称为 WYSIWYG(What You See Is What You Get,所见即所得)。虽然也没有规范,但在 IE 最早引入的这一功能基础上,已经出现了事实标准。各大浏览器都已经支持这一功能。这一技术的本质,就是在页面中嵌入一个包含空 HTML 页面的<iframe>。通过设置designMode属性,这个空白的 HTML 页面可以被编辑,而编辑对象则是该页面body元素的 HTML 代码。designMode属性有两个可能的值:off(默认值)和on。可以给 iframe 指定一个非常简单的 HTML 页面作为其内容来源。例如:

<!DOCTYPE html> <html> <head> <title>Blank Page for Rich Text Editing</title> </head> <body> </body> </html> 

这个页面在 iframe 中可以像其他页面一样被加载。要让它可以编辑,必须要将designMode设置为on,但只有在页面完全加载之后才能设置这个属性。因此,在包含页面中,需要使用 onload 事件处理程序来在恰当的时刻设置designMode,如下面的例子所示:

<iframe name="richedit" style="height:100px;width:100px;" src="blank.htm"></iframe> <script type="text/javascript"> EventUtil.addHandler(window, "load", function(){
        frames["richedit"].document.designMode = "on";
    }); </script> 

使用 contenteditable 属性

<div class="editable contenteditable"></div> 
var div = document.getElementById("richeidt");
div.contentEditable = "true"; //有三个可能值"true","fasle"和"inherit" 

操作富文本

富文本选区

表单与富文本

通过innerHTML取得富文本编辑器中的值,然后放入一个隐藏的<input>中。


#笔记##设计##读书笔记#
全部评论

相关推荐

Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务