DOM 事件类型


DOM 加载事件 ?!    —  (节点)变动事件 ?!   —    剪贴板事件 ?!

提到加载事件,可能会想到 window.onload,实际上,DOM 加载事件是一大类事件,主要包括以下形式:


[1] onload 事件

load 事件是最常用的一个事件,当页面完全加载后,就会触发 window 上的 load 事件。

<script type="text/javascript">
    window.onload = function(){
	console.log('页面加载完成');
    }
</script>

onload 事件,不仅发生在 wondow 对象上,还可能发生在各种外部资源上。简单来说,网页渲染是一个不断加载各种资源的过程,图像、样式表、脚本、音视频等资源以及 window、document 和 XHR 对象,都会触发 onload 事件。

<script type="text/javascript">
	var img = new Image();
	img.onload = function(){
		document.body.appendChild(img);
	}
	img.src = 'http://www.webpiece.cn/wp-content/uploads/2019/11/project.png';
</script>

不过,页面如果是从浏览器缓存中加载的话,并不会触发该事件。


[2] error 事件

load 事件是加载成功时触发,而 error 事件与之相反,在加载失败的时候触发。可触发的元素与 load 事件相同。

任何没有通过 try - catch 处理的错误都会触发 window.onload 事件。

# 要指定 onerror 事件处理程序,可以使用 DOM0 级技术,也可以使用 DOM2 级事件的标准格式

error 事件可以接受 3 个参数:错误消息、错误消息所在的 URL 和行号。多数情况下,只有错误消息有用,因为 URL 只是给出了文档的位置,而行号所指的代码行即可能出自嵌入的 JS 代码,也可能来自于外部文件。

// DOM0级
window.onerror = function(message,url,line){
    alert(message);
}
// DOM2级
window.addEventListener("error",function(message,url,line){
    alert(message);
});

# 发生 error 事件时,图片下载已经结束了,但是,可以在 error 事件中重置 src 属性,指向备用的图像地址

<script type="text/javascript">
	var img = new Image();
	document.body.appendChild(img);
	img.onerror = function(){
		img.src = 'http://www.webpiece.cn/wp-content/uploads/default.png'
	}
	img.src = 'http://www.webpiece.cn/wp-content/uploads/2019/11/project.png';
</script>

UIEvent


[ scroll 事件 ] scroll 事件适用于所有可滚动的元素和 window 对象(浏览器窗口)。

scroll() 方法触发 scroll 事件,或规定当发生 scroll 事件时运行的函数。

$(selector).scroll(function(){
   // 可选,规定当发生 scroll 事件时运行的函数
})

鼠标事件 ?!


# 与mouseover和mouseout不同,mouseenter和mouseleave只关注元素本身,子元素之间的移动不会触发。

属性:
	clientX,clientY		// 鼠标到页面的左边、上边
	screenX,screenY		// 鼠标到屏幕的左边、上边
	ctrlkey,shiftKey,altKey,metaKey	// 按下ctrl、shift、alt、meta,值为true
	button(0,1,2)	// 按下左边、中间、右边的键

顺序:
1. 从元素上方移过
	mousemove - mouseover(A) - mouseenter(A) - mousemove(A) - mouseout(A) - mouseleave(A)
2. 点击元素
	mousedown - [mousemove] - mouseup -click
// 实例:拖拽元素

<div id="div0"></div>
<style media="screen">
  #div0 {
    position: absolute;
    top: 0;
    left: 0;
    width: 100px;
    height: 100px;
    border: 1px solid black;
  }
</style>
var elem = document.getElemenyById('div0');
var clientX, clientY, isMoving;
var mouseDownHandler = function(event) {
  event = event || window.event;
  clientX = event.clientX;
  clientY = event.clientY;
  isMoving = true;
}

var mouseMoveHandler = function(event) {
  if (!isMoving) return;
  event = event || window.event;
  var newClientX = event.clientX,
      newClientY = event.clientY;
  var left = parseInt(elem.style.left) || 0,
      top = parseInt(elem.style.top) || 0;
  elem.style.left = left + (newClientX - clientX) + 'px';
  elem.style.top = top + (newClientY - clientY) + 'px';
  clientX = newClientX;
  clientY = newClientY;
}

var mouseUpHandler = function() {
  isMoving = false;
}

addEvent(elem, 'mousedown', mouseDownHandler);
addEvent(elem, 'mouseup', mouseUpHandler);
addEvent(elem, 'mousemove', mouseMoveHandler);

滚轮事件 ?!

属性:
	deltaMode	// 用于指定delta值的单位
	deltaX	// 鼠标滚轮在X轴上产生的偏移量
	deltaY	// 鼠标滚轮在Y轴上产生的偏移量
	deltaZ	// 鼠标滚轮在Z轴上产生的偏移量

键盘事件 ?!    —    文本事件 ?!   —   焦点事件 ?!