JS与html之间的
交互
是通过事件
来实现的,可以用侦听器(或处理程序)来预定事件
从嵌套层次最深的节点开始然后逐级向上到不具体的节点(文档):
沿DOM树往上
+ 一个例子
Event Bubbling Example
Click Me
+ 如果单击了div元素,那么这个事件会按照(div->body->html->document)顺序传播
事件处理程序的名字以on开头
某个元素支持的每种事件,都可以使用一个与相应事件处理程序
同名的 HTML 特性来指定
+ 可以通过event变量直接访问事件对象
+ 扩展作用域的方式:
+ 1、用with扩展作用域
>拓展: with: 一般的,“由于with语句块中作用域的‘变量对象’是只读的,`所以在他本层定义的标识符,不能存储到本层,而是存储到它的上一层作用域”`。
function(){
with(document){
with(this){
//元素属性值
}
}
}
//就能更好访问自己的属性
var btn = document.getElementById("myBtn");
btn.onclick = function(){
alert("Clicked");
};
删除
,直接将事件处理程序的属性设置为nullbtn.onclick = null; //删除事件处理程序
所有DOM节点都包含这两种方法,三个参数的最后一个参数布尔值表示:
捕获阶段调用
冒泡阶段调用
var btn = document.getElementById("myBtn");
btn.addEventListener("click", function(){
alert(this.id);
}, false);
btn.addEventListener("click", function(){
alert("Hello world!");
}, false);
以上两个语段会按照顺序执行
要注意的点是:
- 1、
通过 addEventListener() 添加的事件处理程序只能使用 removeEventListener() 来移除
(匿名函数则无法移除)- 2、大多数情况下,都是将事件处理程序添加到
事件流的冒泡阶段
,这样可以最大限度地兼容各种浏览
器。
无论指定事件处理程序时使用什么方法
(DOM0 级或 DOM2 级)
,都会传入event
对象,event 对象包含与创建它的特定事件有关的属性和方法
this 、 currentTarget 和 target
this 始终等于 currentTarget 的值
,而 target
则只包含事件的实如果直接将事件处理程序指定给了目标元素
,则 this 、 currentTarget 和 target 包含相同的值例子
var btn = document.getElementById("myBtn");
btn.onclick = function(event){
alert(event.currentTarget === this); //true
alert(event.target === this); //true
};
在 JavaScript 中,添加到页面上的
事件处理程序数量将直接关系
到页面的整体运行性能
建立在
事件冒泡机制
之上的事件委托技术,可以有效地减少事件处理程序的数量
- Go somewhere
- Do something
- Say hi
var item1 = document.getElementById("goSomewhere");
var item2 = document.getElementById("doSomething");
var item3 = document.getElementById("sayHi");
EventUtil.addHandler(item1, "click", function(event){
location.href = "http://www.wrox.com";
});
EventUtil.addHandler(item2, "click", function(event){
document.title = "I changed the document's title";
});
EventUtil.addHandler(item3, "click", function(event){
alert("hi");
});
1、上面这段js代码可以看到如果对单击元素都是用这种方式那么要写
许多的添加事件处理程序的代码
2、因袭为了解决就用事件委托来解决:(在DOM树(开头已经介绍了)尽量更高的层次上添加一个事件处理)
var list = document.getElementById("myLinks");
EventUtil.addHandler(list, "click", function(event){
event = EventUtil.getEvent(event);
var target = EventUtil.getTarget(event);
switch(target.id){
case "doSomething":
document.title = "I changed the document's title";
break;
case "goSomewhere":
location.href = "http://www.wrox.com";
break;
case "sayHi":
alert("hi");
break;
}
});
1、如上,理解:为id为mylinks的ul元素添加一个事件,而其他列表项都是他的
子节点
,而且他们的事件会冒泡
,即由于冒泡原理,事件就会冒泡到ul上,因为ul上有点击事件,所以事件就会触发事件目标是被单击的列表项
,故而可以通过检测 id 属性来决定采取适当的操作
2、但是它与上面那段代码相比结果一样,事前消耗却更低,因为只取得了一个DOM元素,这样占用内存也更少
建议在
浏览器卸载页面之前移除
页面中的所有事件处理程序
Element 类型
和
将type设为submit就可以提交
这种提交方式浏览器会在将请求
发送给服务器之前触发 submit 事件
所以有机会验证表单数据
var form = document.getElementById("myForm");
// 提交表单
form.submit();
这种方式不会触发 submit 事件,因此要记得
在调用此方法之前先验证表单数据
。
两种方式
,和提交一样,第一种方式是type值设为reset,第二种是reset()方法,第二种方式不同在于会触发reset事件每个表单都有elements属性=>表单中所有表单元素的集合
- 可以按照位置和 name 特性来访问
var form = document.getElementById("form1");
//取得表单中的第一个字段
var field1 = form.elements[0];
//取得名为"textbox1"的字段
var field2 = form.elements["textbox1"];
如果有多个表单控件都在使用一个 name (如单选按钮),那么就会
返回以该 name 命名的一个
NodeList (一个列表)
1、焦点的理解:当你用鼠标点击一下页面时,会相应的产生一个焦点,比如说,你点击了一个文本输入框,光标将移动到那里,此时,那个文本框就获得了一个焦点,当你在别的地方再点击时,光标消失,那个文本框就失去了焦点。
2、在默认情况下,只有表单字段可以获得焦点
。对于其他元素而言,如果先将其
tabIndex 属性设置为-1,然后再调用 focus() 方法
,也可以让这些元素获得焦点