JavaScript:事件类型

 我们把事件分为了三大类,分别是一般事件、表单事件和页面事件。当前我们可以再做细分:

1、UI事件:如load、unload、error、resize、scroll、select、DOMActive,是用户与页面上的元素交互时触发的。

(1)、load事件

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>事件类型</title>
<script type="text/javascript" src="EventUtil.js"></script>
</head>
<body>
<center><input type="button" value="Click Me" id="myBtn"/></center><br />
<img src="7V5A54230.jpg" οnlοad="alert('Image loaded')" id="myImage"/>
<script>
var image=document.getElementById("myImage");
EventUtil.addHandler(window,"load",function(event){
alert("Loaded!");
});
EventUtil.addHandler(image,"load",function(event){
event=EventUtil.getEvent(event);
var target=EventUtil.getTarget(event);
alert(target.src);
});
</script>
</body>
</html>

  在创建新的<img>元素时,可以为其制定一个事件处理程序,以便图像加载完毕后给出提示,此时,最重要的是要在指定src属性之前先指定事件,例如:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>事件类型</title>
<script type="text/javascript" src="EventUtil.js"></script>
</head>
<body>
<script>
EventUtil.addHandler(window,"load",function(){
var image=document.createElement("img");
EventUtil.addHandler(image,"load",function(event){
    event=EventUtil.getEvent(event);
alert(EventUtil.getTarget(event).src);
});
document.body.appendChild(image);
image.src="7V5A54230.jpg";
});
</script>
</body>
</html>

  注意:新图像元素不一定要从添加到文档后才开始下载,只要设置了src属性就会开始下载。

  <script>元素也会触发load事件,以便开发人员确定动态加载的JavaScript文件是否加载完毕。与图像不同,只有在设置了<script>元素的src属性并将该元素添加到文档后,才会开始下载JavaScript文件。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>事件类型</title>
<script type="text/javascript" src="EventUtil.js"></script>
</head>
<body>
<script>
EventUtil.addHandler(window,"load",function(){
var script=document.createElement("script");
EventUtil.addHandler(script,"load",function(event){
    event=EventUtil.getEvent(event);
alert(EventUtil.getTarget(event).src);
});
script.src="jquery.js";
document.body.appendChild(script);
});
</script>
</body>
</html>

  IE和Opera还支持<link>元素上的load事件,以便开发人员确定样式表是否加载完毕。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>事件类型</title>
<script type="text/javascript" src="EventUtil.js"></script>
</head>
<body>
<script>
EventUtil.addHandler(window,"load",function(){
var link=document.createElement("link");
link.type="text/css";
link.rel="stylesheet";
EventUtil.addHandler(link,"load",function(event){
    event=EventUtil.getEvent(event);
alert(EventUtil.getTarget(event).src);
});
link.href="example.css";
document.getElementsByTagName("head")[0].appendChild(link);
});
</script>
</body>
</html>

(2)、onload事件:在文档被完全卸载后触发。

(3)、resize事件:当浏览器窗口被调整到一个新的高度或者宽度是,就会触发resize事件。

(4)、scroll事件:虽然scroll事件是在window对象发生的,但它实际表示的则是页面中相应元素的变化。

2、焦点事件:如blur、DOMFocusIn、DOMFocusOut、focus、focusin、focusout,在元素获得或失去焦点的时候触发,这些事件当中,最为重要的是blur和focus,有一点需要引起注意,这一类事件不会发生冒泡!

3、鼠标与滚轮事件:如click、dblclick、mousedown、mouseenter、mouseleave、mousemove、mouseout、mouseover、mouseup,是当用户通过鼠标在页面执行操作时所触发的。下面是拖放实例的js:

//封装通过class获取元素的方法,getELementsByClassName()的方法在IE中只有IE9+才支持。
//clsName是必须的,parent是可选的
function getByClass(clsName,parent){
  var oParent=parent?document.getElementById(parent):document,
      eles=[],
      elements=oParent.getElementsByTagName('*');//获取整个页面中的所有元素

  for(var i=0,l=elements.length;i<l;i++){
    if(elements[i].className==clsName){//判断元素的class名是否相等
      eles.push(elements[i]);
    }
  }
  return eles;//返回一个元素数组
}
window.οnlοad=drag;
function drag(){
   var oTitle=getByClass('login_logo_webqq','loginPanel')[0];//取元素数组的第一个
   // 拖曳
   oTitle.οnmοusedοwn=fnDown;
   // 关闭
   var oClose=document.getElementById('ui_boxyClose');
   oClose.οnclick=function(){
   	  document.getElementById('loginPanel').style.display='none';
   }
   // 切换状态
   var loginState=document.getElementById('loginState'),
       stateList=document.getElementById('loginStatePanel'),
       lis=stateList.getElementsByTagName('li'),
       stateTxt=document.getElementById('login2qq_state_txt'),
       loginStateShow=document.getElementById('loginStateShow');

   loginState.οnclick=function(e){
   	 e = e || window.event;
   	 //阻止事件冒泡,防止document.onclick发生
     if(e.stopPropagation){
          e.stopPropagation();
     }else{
          e.cancelBubble=true;
     }
   	 stateList.style.display='block';
   }

   // 鼠标滑过、离开和点击状态列表时
   for(var i=0,l=lis.length;i<l;i++){
      lis[i].οnmοuseοver=function(){
      	this.style.background='#567';
      }
      lis[i].οnmοuseοut=function(){
      	this.style.background='#FFF';
      }
      lis[i].οnclick=function(e){
      	e = e || window.event;
      	//阻止冒泡,防止loginState.onclick发生
      	if(e.stopPropagation){
          e.stopPropagation();
      	}else{
          e.cancelBubble=true;
      	}
      	var id=this.id;
      	stateList.style.display='none';
        stateTxt.innerHTML=getByClass('stateSelect_text',id)[0].innerHTML;
        loginStateShow.className='';
        loginStateShow.className='login-state-show '+id;
      }
   }
   //隐藏列表ul
   document.οnclick=function(){
   	  stateList.style.display='none';
   }
}
//鼠标跟随,需要获取光标位置
//鼠标事件都在浏览器视口中的特定位置上发生的。这个位置信息保存在事件对象的clientX和clientY属性中
function fnDown(event){
  event = event || window.event;
  var oDrag=document.getElementById('loginPanel'),
  // 光标按下时光标和面板之间的距离
  disX=event.clientX-oDrag.offsetLeft,
  disY=event.clientY-oDrag.offsetTop;
  // 移动
  document.οnmοusemοve=function(event){
  	event = event || window.event;
  	fnMove(event,disX,disY);
  }
  // 释放鼠标
  document.οnmοuseup=function(){
  	document.οnmοusemοve=null;
  	document.οnmοuseup=null;
  }
}

function fnMove(e,posX,posY){
  var oDrag=document.getElementById('loginPanel'),
      l=e.clientX-posX,
      t=e.clientY-posY,
      //防止脱出窗外
      winW=document.documentElement.clientWidth || document.body.clientWidth,//窗口宽
      winH=document.documentElement.clientHeight || document.body.clientHeight,//窗口高
      maxW=winW-oDrag.offsetWidth-10,//活动最大宽度;其中减去10是因为关闭按钮的样式有个right:-10px;
      maxH=winH-oDrag.offsetHeight;//活动最大高度
  if(l<0){
    l=0;//防止左脱出
  }else if(l>maxW){
    l=maxW;//防止右脱出
  }
  if(t<0){
    t=10;//防止上脱出;t等于10是因为关闭按钮的样式有个top:-10px;
  }else if(t>maxH){
    t=maxH;//防止下脱出
  }
  oDrag.style.left=l+'px';
  oDrag.style.top=t+'px';
}

4、滚轮事件:mousewheel(IE6+均支持)、DOMMouseScroll(FF支持的,与mousewheel效果一样)。是使用鼠标滚轮时触发的。

5、文本事件:textInput,在文档中输入文本触发。

6、键盘事件:keydown、keyup、keypress,当用户通过键盘在页面中执行操作时触发。  

   keydown:当用户按下键盘上的任意键时触发,而且如果按住不放的话,会重复触发此事件。

   keypress:当用户按下键盘上的字符键时触发,而且如果按住不放的话,会重复触发此事件。

   keyup:当用户释放键盘上的键时触发。

下面是抽奖实例:

<!doctype html>
<html>
<head>
<title>抽奖</title>
<meta charset="utf-8">
<style>
*{margin:0;
  padding:0;}

.title{width:400px;
       height:70px;
       margin:0 auto;
       padding-top:30px;
       text-align:center;
       font-size:24px;
       font-weight:bold;
       color:#F00;}

.btns{width:190px;
      height:30px;
      margin:0 auto;}

.btns span{display:block;
           float:left;
           width:80px;
           height:27px;
           line-height:27px;
           background:#036;
           border:1px solid #eee;
           border-radius:7px;
           margin-right:10px;
           color:#FFF;
           text-align:center;
           font-size:14px;
           font-family:"微软雅黑";
           cursor:pointer;}
</style>
</head>
<body>
<div id="title" class="title">开始抽奖啦!</div>
<div class="btns">
    <span id="play">开 始</span>
    <span id="stop">停 止</span>
</div>
<script>
var data=['Phone5','Ipad','三星笔记本','佳能相机','惠普打印机','谢谢参与','50元充值卡','1000元超市购物券'],
timer=null,
flag=0;
window.οnlοad=function(){
    var play=document.getElementById('play'),
        stop=document.getElementById('stop');

    // 开始抽奖
    play.οnclick=playFun;
    stop.οnclick=stopFun;

   // 键盘事件
   document.οnkeyup=function(event){
      event = event || window.event;
      if(event.keyCode==13){
         if(flag==0){
           playFun();
           flag=1;
         }else{
           stopFun();
           flag=0;
         }
      }
   }
}
function playFun(){
	var title=document.getElementById('title');
	var play=document.getElementById('play');
	//开始定时器之前需要清除定时器,防止同时多次点击触发多个定时器
	//多个定时器同时运行的效果就是抽奖显示的结果越来越快。
	clearInterval(timer);
	timer=setInterval(function(){
	   var random=Math.floor(Math.random()*data.length);//随机数值为0-7
	   title.innerHTML=data[random];
	},50);
    play.style.background='#999';
}
function stopFun(){
	clearInterval(timer);
	var play=document.getElementById('play');
	play.style.background='#036';
}
</script>
 </body>
</html>


7、合成事件:DOM3级新增,用于处理IME的输入序列。所谓IME,指的是输入法编辑器,可以让用户输入在物理键盘上找不到的字符。compositionstart、compositionupdate、compositionend三种事件。

8、变动事件:DOMsubtreeModified、DOMNodeInserted、DOMNodeRemoved、DOMAttrModified、DOMCharacterDataModified等,当底层DOM结构发生变化时触发。IE8-不支持。

9、变动名称事件:指的是当元素或者属性名变动时触发,当前已经弃用!

   对于事件的基本类型,随着HTML5的出现和发展,又新增了HTML5事件、设备事件、触摸事件、手势事件等各种事件,在后面我们再详细介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值