js DOM
HTML DOM
Document Object Model
文档对象模型,通过DOM可以来任意来修改网页中各个内容
文档
文档指的是网页,一个网页就是一个文档
对象
对象指将网页中的每一个节点都转换为对象
转换完对象以后,就可以以一种纯面向对象的形式来操作网页了
模型
模型用来表示节点和节点之间的关系,方便操作页面
节点(Node)
节点是构成网页的最基本的单元,网页中的每一个部分都可以称为是一个节点
虽然都是节点,但是节点的类型却是不同的,所以属性和方法也都不尽相同
常用的节点
- 文档节点 (document) 代表整个网页
document对象作为 window对象的属性存在的,我们不用获取可以直接使用
通过该对象我们可以在整个文档访问内查找节点对象
并可以通过该对象创建各种节点对象 - 元素节点(element) 代表网页中的标签
浏览器会将页面中所有的标签都转换为一个元素节点
可以通过document 的方法来获取元素节点
比如:document.getElementById()
- 属性节点(attribute) 代表标签中的属性
属性节点并非是元素节点的子节点,而是元素节点的一部分,相当于元素对象的属性
可以通过元素节点来获取指定的属性节点
例如:元素节点.getAttributeNode("属性名")
- 文本节点(text) 代表网页中的文本内容
文本节点一般是作为元素节点的子节点存在的
获取文本节点时,一般先要获取元素节点,再通过元素节点获取文本节点
例如:元素节点.firstChild
获取元素节点的第一个子节点,一般为文本节点
节点对象的属性
事件简介
事件指的是用户和浏览器之间的交互行为。比如:点击按钮、关闭窗口、鼠标移动。。。
我们可以为事件来绑定回调函数来响应事件。
绑定事件的方式
1.可以在标签的事件属性中设置相应的JS代码
<button onclick="alert("Hello");">按钮</button>
但这种写法是结构和行为耦合,不方便维护,不推荐使用
2.可以获取节点对象,来设置指定事件属性的 回调函数
<button id="btn">按钮</button>
<script>
var btn = document.getElementById("btn");
btn.onclick = function() {
alert("Hello");
};
</script>
文档的加载
浏览器在加载一个页面时,是按照自上向下的顺序加载的,加载一行执行一行。
如果将 js代码编写到页面的上边,当代码执行时,页面中的DOM对象还没有加载
此时将会无法正常获取到DOM对象,导致DOM操作失败。
解决方式
1.可以将js代码编写到body 结束标签的上边
<body>
<button id="btn">按钮</button>
<script>
var btn = document.getElementById("btn");
btn.onclick = function(){
alert("Hello");
};
</script>
</body>
2.将js代码编写到 window.onload = function(){}中
window.onload 对应的回调函数会在整个页面加载完毕以后才执行
所以可以确保代码执行时,DOM对象已经加载完毕了
<script>
window.onload = function(){
var btn = document.getElementById("btn");
btn.onclick = function(){
alert("Hello");
};
};
</script>
DOM 操作
DOM 查询
在网页中浏览器已经为我们提供了document 对象
它代表的是整个网页,它是window对象的属性,可以在页面中直接使用
document 查询方法:
- document.getElementById("id属性值");
根据元素的id属性查询一个元素节点对象 - document.getElementsByName("name属性值");
根据元素的name属性值查询一组元素节点对象,返回一个 类数组对象 - document.getElementsByTagName("标签名");
根据标签名来查询一组元素节点对象,返回一个 类数组对象
元素的属性:
读取元素属性
方式1:元素.属性名
例子:元素.name 元素.id 元素.value 元素.className
注意:class 属性不能采用这种方式,
**读取class属性时需要使用 元素.className **
方式2:元素.getAttribute("属性名");
这两种方式都可以获取元素的属性值,但不同是,第二种方式可以获取用户自定义的属性,
而第一种方式不能获取到
修改元素属性
元素.属性名 = 属性值
元素.setAttribute("属性名", 属性值);
同样的,对于自定义属性也只能使用第二种方式
删除元素属性
元素.属性名 = "";
元素.removeAttribute("属性名");
同样的,对于自定义属性也只能使用第二种方式
hasAttribute()
元素.hasAttribute("属性名")
判断元素是否有该属性,有则返回 true,没有返回 false
元素.innerHTML
使用该属性可以获取或设置元素内部的HTML代码,但对于 自结束标签没用
为了代码看起来更方便,可以在字符串每一行后面加上个反斜杠 \ 来转义
元素.innerText
该属性和 innerHTML 类似,但这个属性只返回 文本,就不包括 html标签
该属性也等价于 元素.textContent
DOM查询
通过具体的元素节点来查询
元素.getElementsByTagName()
通过标签名查询当前元素的指定后代元素
元素.childNodes
获取当前元素的所有子节点,即所有后代元素
childNodes 属性会获取包括文本节点在的所有节点
如果DOM标签与标签间有空白那么就会当成文本节点
注意:在 IE8 及以下的浏览器中,不会将空白文本当成子节点,
元素.children
获取当前元素的所有子元素 ,不会包括空白文本节点
元素.firstChild
获取当前元素的第一个子节点,可能会获取到空白的文本子节点
元素.firstElementChild
获取当前元素的第一个子元素,就不会取到空白文本节点
但不支持IE8及以下的浏览器, 如果需要兼容他们尽量不要使用
元素.lastChild
获取当前元素的最后一个子节点,可能会获取到空白的文本子节点
元素.lastElementChild
获取当前元素的最后一个子元素
不支持IE8及以下的浏览器
元素.parentNode
获取当前元素的父元素
元素.previousSibling
获取当前元素的前一个兄弟节点
因为是节点,所以也有可能会获取到 文本节点
元素.previousElementSibling
获取前一个兄弟元素,IE8及以下不支持
元素.nextSibling
获取当前元素的后一个兄弟节点
元素.nextElementSibling
获取当前元素的后一个兄弟元素 ,IE8及以下不支持
元素.nodeValue
文本节点可以通过这个属性来获取 和设置文本节点的内容
innerHTML 和 innerText
这两个属性并没有在DOM标准定义,但是大部分浏览器都支持这两个属性
两个属性作用类似,都可以获取到标签内部的内容,
不同是innerHTML会获取到html标签,而innerText会自动去除标签
如果使用这两个属性来设置标签内部的内容时,没有任何区别的
读取标签内部的文本内容
h1中的文本内容元素.firstChild.nodeValue
document对象的其他的属性和方法
document.all
获取页面中的所有元素,相当于 document.getElementsByTagName("*")
;
document.documentElement
获取页面中html根元素 ,相当于 document.getElementsByTagName("html")[0]
;
document.body
获取页面中的body元素 ,相当于 document.getElementsByTagName("body")[0]
;
document.getElementsByClassName()
根据元素的class属性值查询一组元素节点对象
这个方法不支持IE8及以下的浏览器,若要ie8支持就用下面的
document.querySelector()
根据CSS选择器去页面中查询一个元素,很强大
如果匹配到的元素有多个,则它会返回查询到的第一个元素,也包括其元素里的所以子元素
let box = document.querySelector(".box");
let div = document.querySelector(".box div");
document.querySelectorAll()
根据CSS选择器去页面中查询一组元素
会将匹配到所有元素封装到一个数组中返回,即使只匹配到一个
DOM 修改
document.createElement("TagName")
可以用于创建一个元素节点对象,
它需要一个标签名作为参数,将会根据该标签名创建元素节点对象, 并将创建好的对象作为返回值返回
document.createTextNode("textContent")
可以根据文本内容创建一个文本节点对象
父节点.appendChild(子节点)
向父节点中添加指定的子节点
// 创建元素节点
let Liwker = document.createElement("p");
// 创建元素文本节点
let LiwkerText = document.createTextNode("Liwker");
// 将文本节点插入元素节点
Liwker.appendChild(LiwkerText);
// 获取父元素
let person = document.getElementById("person");
// 插入元素节点
person.appendChild(Liwker);
父节点.insertBefore(新节点,旧节点)
将一个新的节点插入到旧节点的前边
父节点.replaceChild(新节点,旧节点)
使用一个新的节点去替换旧节点
父节点.removeChild(子节点)
删除指定的子节点
推荐方式:子节点.parentNode.removeChild(子节点)
以上方法,实际就是改变了相应元素(标签)的innerHTML的值。
var city = document.getElementById("city");
// 使用innerHTML也可以完成DOM的增删改的相关操作
// 但是 innerHTML 会把该元素全部更新,所以动静很大,影响性能
// 一般我们会两种方式结合使用
// 原方法:city.innerHTML += "<li>广州</li>";
//改进:创建一个li
var li = document.createElement("li");
//向li中设置文本,这样可以省去创建文本节点再插入了
li.innerHTML = "广州";
//将li添加到city中
city.appendChild(li);
DOM对CSS的操作
读取和修改内联样式
使用 style 属性来操作元素的内联样式
读取内联样式:
语法:元素.style.样式名
元素.style.width 元素.style.height
注意:如果样式名中带有 - ,则需要将样式名修改为驼峰命名法将 - 去掉,将 - 后的字母改大写
比如:background-color > backgroundColor border-width > borderWidth
修改内联样式:
语法:元素.style.样式名 = "样式值"
值是字符串,所以要加引号
注意:通过 style 属性修改和读取的样式都是内联样式,由于内联样式的优先级比较高,所以我们通过JS来修改的样式,往往会立即生效
如果样式中设置了 !important,则内联样式将不会生效,所以这个 ! 要慎用
cssText
元素.style.cssText = ""
可以同时设置多个CSS属性,这也是在元素的style属性来添加的
oDiv.style.cssText = "width:100px;height:100px;border:1px solid gray;";
读取元素的当前样式
getComputedStyle() 方法
ie9 以上和其他浏览器都支持
这个方法是window对象的方法,可以返回一个对象,这个对象中保存着当前元素生效样式
参数:
1.要获取样式的元素
2.可以传递一个伪元素,一般传null
例子:
// 获取元素的宽度
let width = getComputedStyle(box, null).width; // ["width"] 也一样
// 因为这个方法返回的是一个对象,所以需要指定 属性
注意:通过该方法读取到样式都是只读的不能修改,修改只能用 style 属性
这个方法会获取具体的值,而不是 auto
currentStyle 属性
这个属性只有 IE 支持
语法:元素.currentStyle.样式名
获取元素当前的样式
例子:
box.currentStyle.width
注意:通过这个属性读取到的样式是只读的不能修改
如果属性值是 auto,则只能获取 "auto",不能获取具体的值
实现兼容性
/*
* 定义一个函数,用来获取指定元素的当前的样式
* 参数:
* obj 要获取样式的元素
* name 要获取的样式名
*/
function getStyle(obj, name){
//对象.属性不存在,不会报错,如果直接寻找对象,(当前作用域到全局作用域)找不到会报错
if(window.getComputedStyle){
//正常浏览器的方式,具有getComputedStyle()方法
return getComputedStyle(obj , null)[name];
}else{
//IE8的方式,没有getComputedStyle()方法
return obj.currentStyle[name];
}
//return window.getComputedStyle?getComputedStyle(obj , null)[name]:obj.currentStyle[name];
}
其他的样式相关的属性
注意:以下样式都是只读的,未指明偏移量都是相对于当前窗口左上角
元素.clientHeight
元素的可见高度,返回数值,包括元素的内容区和内边距的高度
元素.clientWidth
元素的可见宽度,包括元素的内容区和内边距的宽度
元素.offsetHeight
整个元素的高度,包括内容区、内边距、边框,但没有 margin
元素.offfsetWidth
整个元素的宽度,包括内容区、内边距、边框,但没有 margin
元素.offsetParent
当前元素的定位祖先元素
离他最近的开启了定位的祖先元素,如果所有的元素都没有开启定位,则返回 body
元素.offsetLeft
元素.offsetTop
当前元素和定位父元素之间的距离
offsetLeft 水平距离 offsetTop 垂直距离
元素.scrollHeight
元素.scrollWidth
获取元素滚动区域的高度和宽度
元素.scrollTop
元素.scrollLeft
获取 元素垂直和水平 滚动条 滚动的距离
判断滚动条是否滚动到底
垂直滚动条到底
scrollHeight - scrollTop == clientHeight
水平滚动条到底
scrollWidth - scrollLeft == clientWidth
查看滚动条距离
ie9 以下不兼容:
window.pageXOffset / window.pageYOffset
ie9以下版本:
document.body.scrollLeft / Top;
document.documentElement.scrollLeft / Top;
移动滚动条
scrollTo(参数一,参数二)
设置滚动条位置
参数一:x方向
参数二:y方向
ps:如果只设置一个方向 ,一个方向设置为0
事件(Event)
JavaScript常见的事件共有以下5种。
- 鼠标事件
- 键盘事件
- 表单事件
- 编辑事件
- 页面事件
事件操作是JavaScript的核心,可以这样说:“不懂事件操作,JavaScript等于白学”。
事件对象
当响应函数被调用时,浏览器每次都会将一个事件对象作为实参传递进响应函数中,这个事件对象中封装了当前事件的相关信息,比如:鼠标的坐标,键盘的按键,鼠标的按键,滚轮的方向。。
可以在响应函数中定义一个形参,来使用事件对象,但是在IE8以下浏览器中事件对象没有做完实参传递,而是作为 window对象 的属性保存
例子:
元素.事件 = function(event){
// 解决事件对象兼容性
event = event || window.event;
};
获取到鼠标的坐标
event.clientX
event.clientY
用于获取鼠标在当前的可见窗口的坐标
div的偏移量,是相对于整个页面的
event.pageX
和event.pageY
可以获取鼠标相对于当前页面的坐标
但是这个两个属性在IE8中不支持,所以如果需要兼容IE8,则不要使用
事件的冒泡(Bubble)
事件的冒泡指的是事件向上传导,当后代元素上的事件被触发时,将会导致其祖先元素上的同类事件也会触发。
事件的冒泡大部分情况下都是有益的,如果需要取消冒泡,则需要使用事件对象来取消
可以将事件对象的 cancelBubble 设置为true,即可取消冒泡
元素.事件 = function(event){
event = event || window.event;
event.cancelBubble = true;
};
事件的委派
指将事件统一绑定给元素的共同的祖先元素,这样当后代元素上的事件触发时,会一直冒泡到祖先元素,从而通过祖先元素的响应函数来处理事件。
事件委派是利用了冒泡,通过委派可以减少事件绑定的次数,提高程序的性能
我们希望,只绑定一次事件,即可应用到多个的元素上,即使元素是后添加的
我们可以尝试将其绑定给元素的共同的祖先元素
target : event 中的target 表示的是 实际触发事件 的对象
所以可以使用 target 来判定是否 是目标元素触发的事件
事件的绑定
事件处理器
之前经常用 元素.事件 = 函数
来对绑定事件
但是这种方法只能绑定最后一次
事件监听器
元素.addEventListener(type, fn, false)
通过这个方法也可以为元素多次绑定响应函数
参数:
1.事件的字符串,不要 on,例如 click
2.回调函数,当事件触发时该函数会被调用
3.是否在捕获阶段触发事件,需要一个布尔值,一般都传 false
使用addEventListener()
可以同时为一个元素的相同事件同时绑定多个响应函数,
这样当事件被触发时,响应函数将会按照函数的绑定顺序执行
这个方法不支持IE8及以下的浏览器
btn01.addEventListener("click",function(){
alert(1);
},false);
btn01.addEventListener("click",function(){
alert(2);
},false);
元素.attachEvent()
在IE8中可以使用attachEvent()
来绑定事件
参数:
1.事件的字符串,要on
2.回调函数
这个方法也可以同时为一个事件绑定多个处理函数,
不同的是它是后绑定先执行,执行顺序和 addEventListener()
相反
btn01.attachEvent("onclick",function(){
alert(1);
});
btn01.attachEvent("onclick",function(){
alert(2);
});
为了解决这种兼容性问题,我们定义一个 bind 函数
//定义一个函数,用来为指定元素绑定响应函数
/*
addEventListener()中的this,是绑定事件的对象
attachEvent()中的this,是window
需要统一两个方法this
参数:
obj 要绑定事件的对象
eventStr 事件的字符串(不要on)
callback 回调函数
*/
function bind(obj, eventStr, callback){
if(obj.addEventListener){
//大部分浏览器兼容的方式
obj.addEventListener(eventStr, callback, false);
} else {
/* IE8及以下
而这里的this默认是window,所以需要转换
*/
obj.attachEvent("on"+eventStr , function(){
//在匿名函数中调用回调函数,并且用 call 方法
callback.call(obj);
});
}
}
解绑事件
元素.removeEventListener(type, fn, false)
removeEventListener() 只可以解除“事件监听器”添加的事件,它是不可以解除“事件处理器”添加的事件。如果想要解除“事件处理器”添加的事件,我们可以使用 obj.事件名 = null;
事件的传播
关于事件的传播网景公司和微软公司有不同的理解
微软公司认为事件应该是由内向外传播,也就是当事件触发时,应该先触发当前元素上的事件,
然后再向当前元素的祖先元素上传播,也就说事件应该在冒泡阶段执行。
网景公司认为事件应该是由外向内传播的,也就是当前事件触发时,应该先触发当前元素的最外层的祖先元素的事件,
然后在向内传播给后代元素。
W3C综合了两个公司的方案,将事件传播分成了三个阶段
- 捕获阶段
在捕获阶段时从最外层的祖先元素,向目标元素进行事件的捕获,但是默认此时不会触发事件 - 目标阶段
事件捕获到目标元素,捕获结束开始在目标元素上触发事件 - 冒泡阶段
事件从目标元素向他的祖先元素传递,依次触发祖先元素上的事件
如果希望在捕获阶段就触发事件,可以将addEventListener()
的第三个参数设置为 true
一般情况下我们不会希望在捕获阶段触发事件,所以这个参数一般都是 false
IE8及以下的浏览器中没有捕获阶段
鼠标事件
事件 | 说明 |
---|---|
onclick | 鼠标单击事件 |
onmouseover | 鼠标移入事件 |
onmouseout | 鼠标移出事件 |
onmousedown | 鼠标按下事件 |
onmouseup | 鼠标松开事件 |
onmousemove | 鼠标移动事件 |
拖拽事件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>123</title>
<style type="text/css">
#box1{
width: 100px;
height: 100px;
background-color: red;
position: absolute;
}
#box2{
width: 100px;
height: 100px;
background-color: yellow;
position: absolute;
left: 200px;
top: 200px;
}
</style>
</head>
<body>
我是一段文字
<div id="box1"></div>
<div id="box2"></div>
<img src="img/an.jpg" id="img1" style="position: absolute;"/>
<script type="text/javascript">
/*
拖拽box1元素
- 拖拽的流程
1.当鼠标在被拖拽元素上按下时,开始拖拽 onmousedown
2.当鼠标移动时被拖拽元素跟随鼠标移动 onmousemove
3.当鼠标松开时,被拖拽元素固定在当前位置 onmouseup
*/
/*
* 提取一个专门用来设置拖拽的函数
* 参数:开启拖拽的元素
*/
function drag(obj){
//当鼠标在被拖拽元素上按下时,开始拖拽 onmousedown
obj.onmousedown = function(event){
//设置box1捕获所有鼠标按下的事件
/*
* setCapture()
* 只有IE支持,但是在火狐中调用时不会报错,
* 而如果使用chrome调用,会报错
*/
/*if(box1.setCapture){
box1.setCapture();
}*/
obj.setCapture && obj.setCapture();
event = event || window.event;
//div的偏移量 鼠标.clentX - 元素.offsetLeft
//div的偏移量 鼠标.clentY - 元素.offsetTop
var ol = event.clientX - obj.offsetLeft;
var ot = event.clientY - obj.offsetTop;
//为document绑定一个onmousemove事件
document.onmousemove = function(event){
event = event || window.event;
//当鼠标移动时被拖拽元素跟随鼠标移动 onmousemove
//获取鼠标的坐标
var left = event.clientX - ol;
var top = event.clientY - ot;
//修改box1的位置
obj.style.left = left+"px";
obj.style.top = top+"px";
};
//为document绑定一个鼠标松开事件
document.onmouseup = function(){
//当鼠标松开时,被拖拽元素固定在当前位置 onmouseup
//取消document的onmousemove事件
document.onmousemove = null;
//取消document的onmouseup事件
document.onmouseup = null;
//当鼠标松开时,取消对事件的捕获
obj.releaseCapture && obj.releaseCapture();
};
/*
* 当我们拖拽一个网页中的内容时,浏览器会默认去搜索引擎中搜索内容,
* 此时会导致拖拽功能的异常,这个是浏览器提供的默认行为,
* 如果不希望发生这个行为,则可以通过return false来取消默认行为
*
* 但是这招对IE8不起作用 */
return false;
};
}
// 获取元素对象
var box1 = document.getElementById("box1");
var box2 = document.getElementById("box2");
var img1 = document.getElementById("img1");
// 开启拖拽
drag(box1);
drag(box2);
drag(img1);
</script>
</body>
</html>
滚轮事件
现在一般用 onwheel
来代替了 onmousewheel
,但 onwheel 苹果和ie8不支持
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>滚轮事件</title>
<style type="text/css">
#box1{
width: 100px;
height: 100px;
background-color: red;
}
</style>
</head>
<body style="height: 2000px;">
<div id="box1"></div>
<script type="text/javascript">
//获取id为box1的div
var box1 = document.getElementById("box1");
//为box1绑定一个鼠标滚轮滚动的事件
/*
* onmousewheel鼠标滚轮滚动的事件,会在滚轮滚动时触发,
* 但是火狐不支持该属性
*
* 在火狐中需要使用 DOMMouseScroll 来绑定滚动事件
* 注意该事件需要通过 addEventListener() 函数来绑定
*/
box1.onmousewheel = function(event){
event = event || window.event;
//event.wheelDelta 可以获取鼠标滚轮滚动的方向
//向上滚 120 向下滚 -120
//wheelDelta这个值我们不看大小,只看正负
//wheelDelta这个属性火狐中不支持
//在火狐中使用event.detail来获取滚动的方向
//向上滚 -3 向下滚 3
/*
* 当鼠标滚轮向下滚动时,box1变长
* 当滚轮向上滚动时,box1变短
*/
//判断鼠标滚轮滚动的方向
if(event.wheelDelta > 0 || event.detail < 0){
//向上滚,box1变短
box1.style.height = box1.clientHeight - 10 + "px";
} else {
//向下滚,box1变长
box1.style.height = box1.clientHeight + 10 + "px";
}
/*
* 使用addEventListener()方法绑定响应函数,取消默认行为时不能使用return false
* 需要使用event来取消默认行为event.preventDefault();
* 但是IE8不支持event.preventDefault();这个玩意,如果直接调用会报错
*/
event.preventDefault && event.preventDefault();
// event.cancelBubble = true; // 取消冒泡是不行的
/*
* 当滚轮滚动时,如果浏览器有滚动条,滚动条会随之滚动,
* 这是浏览器的默认行为,如果不希望发生,则可以取消默认行为
*/
return false;
};
//为火狐绑定滚轮事件
bind(box1,"DOMMouseScroll",box1.onmousewheel);
function bind(obj , eventStr , callback){
if(obj.addEventListener){
//大部分浏览器兼容的方式
obj.addEventListener(eventStr , callback , false);
}else{
/*
* this是谁由调用方式决定
* callback.call(obj)
*/
//IE8及以下
obj.attachEvent("on"+eventStr , function(){
//在匿名函数中调用回调函数
callback.call(obj);
});
}
}
</script>
</body>
</html>
键盘事件
onkeydown
按键被按下
对于onkeydown来说如果一直按着某个按键不松手,则事件会一直触发
当onkeydown连续触发时,第一次和第二次之间会间隔稍微长一点,其他的会非常的快,这种设计是为了防止误操作的发生。
onkeyup
按键被松开
键盘事件一般都会绑定给一些可以获取到焦点的对象或者是 document
keyCode
可以通过event.keyCode
来获取按键的 Unicode编码
通过它可以判断哪个按键被按下
除了keyCode,事件对象中还提供了几个属性
altKey
ctrlKey
shiftKey
这个三个用来判断alt ctrl 和 shift是否被按下
如果按下则返回 true,否则返回false
//判断一个y是否被按下
//判断y和ctrl是否同时被按下
if(event.keyCode === 89 && event.ctrlKey){
console.log("ctrl和y都被按下了");
}
input.onkeydown = function(event) {
event = event || window.event;
//数字 48 - 57
//使文本框中不能输入数字
if(event.keyCode >= 48 && event.keyCode <= 57) {
//在文本框中输入内容,属于onkeydown的默认行为
//如果在onkeydown中取消了默认行为,则输入的内容,不会出现在文本框中
return false;
}
};
表单事件
在JavaScript中,常用的表单事件有3种。
- onfocus 和 onblur
- onselect
- onchange
onfocus 和 onblur
onfocus表示获取焦点时触发的事件,而onblur表示失去焦点时触发的事件,两者是相反操作。
onfocus和onblur这两个事件往往都是配合一起使用的。例如用户准备在文本框中输入内容时,此时它会获得光标,就会触发onfocus事件。当文本框失去光标时,就会触发onblur事件。
并不是所有的HTML元素都有焦点事件,具有“获取焦点”和“失去焦点”特点的元素只有2种。
- 表单元素(单选框、复选框、单行文本框、多行文本框、下拉列表)
- 超链接
onselect
在JavaScript中,当我们选中“单行文本框”或“多行文本框”中的内容时,就会触发onselect事件。
对于select元素来说,我们可以使用 obj.options[n]
方式来得到某一个列表项
还有select()方法
select()跟onselect是不一样的。select()是一个方法,仅仅用于全选文本。而onselect是一个属性,它是用于事件操作的。select()和onselect的关系,跟focus()和onfocus的关系是相似的。
// 每次点击搜索框,就自动帮我们把文本框内的文本全选中
var oSearch = document.getElementById("search");
oSearch.onclick = function ()
{
this.select();
};
onchange
在JavaScript中,onchange 事件常用于“具有多个选项的表单元素”
- 单选框选择某一项时触发
- 复选框选择某一项时触发
- 下拉列表选择某一项时触发
选择下拉列表的某一项时,触发的是onchange事件,而不是onselect事件。onselect事件仅仅在选择文本框中的内容时才会触发,我们要清楚这两者的区别
编辑事件
常用的编辑事件有3种
- oncopy
- onselectstart
- oncontextmenu
oncopy
我们可以使用oncopy事件来防止页面内容被复制
document.body.oncopy = function ()
{
return false;
}
onselectstart
我们可以使用onselectstart事件来防止页面内容被选取
防止页面内容被选取,从本质上来说也是为了防止用户复制内容。也就是说,为了防止用户复制内容,我们有两种实现方式:oncopy事件和onselectstart事件
document.body.onselectstart = function ()
{
return false;
}
oncontextmenu
我们可以使用oncontextmenu事件来禁止鼠标右键
document.oncontextmenu = function ()
{
return false;
}
页面事件
onload
onload 表示文档加载完成后再执行的一个事件
window.onload = function(){
……
}
onbeforeunload
onbeforeunload 表示离开页面之前触发的一个事件
与window.onload 相对的应该是window.onunload,不过一般情况下我们极少用到 window.onunload,而更倾向于使用 window.onbeforeunload