事件基础

JavaScript 中一个事件由 事件主角事件类型事件过程 三部分组成

事件调用方式

script 标签中调用

<script></script>

obj.事件名 = function()
{
      
        
    ....;
};  // ; 是为了规范
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> window.onload = function() {
        
           // 获取元素 var obtn = document.getElementById("btn"); // 为元素添加点击事件 obtn.onclick = function() {
        
           alert("学习网"); }; } </script>
	</head>
	<body>
		<input id="btn" type="button" value="弹出" />
	</body>
</html>

元素中调用事件

元素中调用事件是在 HTML 属性中来调用事件,即事件属性

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> function alertMes() {
        
           alert("学习网"); } </script>
	</head>
	<body>
		<input type="button" onclick="alertMes()" value="弹出" />
	</body>
</html>

常见事件

鼠标事件

onclick:鼠标单击事件 可以为任何元素添加单击事件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> window.onload = function() {
        
           var odiv = document.getElementById("btn"); odiv.onclick = function() {
        
           alert("学习网"); }; }; </script>
	</head>
	<body>
		<div id="btn">调式代码</div>
	</body>
</html>
obtn.onclick = alertMes;
function alertMes()
{
      
        
    alert("Hello Word");
};
/* 等价如下 */
obtn.onclick = function()
{
      
        
    alert("Hello Word");
};

onmouseover:鼠标移入事件
onmouseout:鼠标移出事件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> window.onload = function() {
        
           var op = document.getElementById("content"); op.onmouseover = function() {
        
           this.style.color = "red"; }; op.onmouseout = function() {
        
           this.style.color = "black"; }; }; </script>
	</head>
	<body>
		<p id="content">学习网</p>
	</body>
</html>

onmousedown:鼠标按下事件
onmouseup:鼠标松开事件

onmousemove:鼠标移动事件
当鼠标按下会触发 onmousedown 事件,当用户松开时会触发 onmouseup 事件,鼠标移动会触发 onmousemove 事件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> window.onload = function() {
        
           var odiv = document.getElementById("title"); var obtn = document.getElementById("btn"); obtn.onmousedown = function() {
        
           odiv.style.color="red"; }; obtn.onmouseup = function() {
        
           odiv.style.color = "black"; }; obtn.onmousemove = function() {
        
           odiv.style.color = "gold"; }; }; </script>
	</head>
	<body>
		<h1 id="title">学习网</h1>
		<hr />
		<input id="btn" type="button" value="button"/>
	</body>
</html>

键盘事件

onkeydown:键盘按下
onkeyup:键盘松开

统计输入字符串的长度

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> window.onload = function() {
        
           var otxt = document.getElementById("txt"); var onum = document.getElementById("num"); otxt.onkeyup = function() {
        
           var str = otxt.value; onum.innerHTML = str.length; }; }; </script>
	</head>
	<body>
		<input id="txt" type="text" />
		<div>字符串长度为:<span id="num">0</span></div>
	</body>
</html>

验证输入是否正确

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> window.onload = function() {
        
           var otxt = document.getElementById("txt"); var odiv = document.getElementById("content"); var myregex = /^[0-9]*$/; otxt.onkeyup = function() {
        
           //判断输入是否是数字 if(myregex.test(otxt.value)){
        
           odiv.innerHTML = "输入正确"; }else{
        
           odiv.innerHTML = "必须输入数字"; } }; }; </script>
	</head>
	<body>
		<input id="txt" type="text" />
		<div id="content" style="color: red;"></div>
	</body>
</html>

表单事件

onfocus:获取焦点时触发的事件
onblur:失去焦点时触发的事件

用户准备在文本框中输入内容时,此时它会获得光标,触发 onfocus 事件;当文本框失去光标时,就会触发 onblur 事件;具有焦点事件地元素有:表单元素(单选框、复选框、单行文本框、多行文本框、下拉列表)超链接

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> window.onload = function() {
        
           // 获取元素对象 var oSearch = document.getElementById("search"); // 获取焦点 oSearch.onfocus = function() {
        
           if(this.value == "百度一下,你就知道") this.value = ""; }; // 失去焦点 oSearch.onblur = function() {
        
           if(this.value == "") this.value = "百度一下,你就知道"; }; }; </script>
	</head>
	<body>
		<input id="search" type="text" value="百度一下,你就知道" />
		<input id="Button1" type="button" value="搜索" />
	</body>
</html>

focus() 仅仅用于让元素获取焦点
onselect:选中单行或者多行文本框中的内容时,就会触发 onselect 事件

每次点击搜索框,自动帮我们把文本框内的文本全部选中

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> window.onload = function() {
        
           var oSearch = document.getElementById("search"); oSearch.onclick = function() {
        
           this.select(); }; }; </script>
	</head>
	<body>
		<input id="search" type="text" value="百度一下,你就知道" />
	</body>
</html>

onchange:用于具有多个选项的表单元素;单选框选择某一项时触发;复选框选择某一项时触发;下拉列表选择某一项时触发
单选框

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> window.onload = function() {
        
           var ofruit = document.getElementsByName("fruit"); var op = document.getElementById("content"); for(var i = 0; i < ofruit.length; i++) {
        
           ofruit[i].onchange = function() {
        
           if(this.checked) op.innerHTML = "你选择的是:" + this.value; }; } } </script>
	</head>
	<body>
		<div>
			<label><input type="radio" name="fruit" value="苹果" />苹果</label>
			<label><input type="radio" name="fruit" value="香蕉" />香蕉</label>
			<label><input type="radio" name="fruit" value="西瓜" />西瓜</label>
		</div>
		<p id="content"></p>
	</body>
</html>

复选框的全选与反选

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> window.onload = function() {
        
           var oselectall = document.getElementById("selectAll"); var ofruit = document.getElementsByName("fruit"); oselectall.onchange = function() {
        
           // 如果选中,即 this.checked 返回 true if(this.checked){
        
           for(var i = 0; i < ofruit.length; i++) ofruit[i].checked = true; }else{
        
           for(var i = 0; i < ofruit.length; i++) ofruit[i].checked = false; } }; } </script>
	</head>
	<body>
		<div>
			<p><label><input id="selectAll" type="checkbox"/>全选/反选:</label></p>
			<label><input type="checkbox" name="fruit" value="苹果" />苹果</label>
			<label><input type="checkbox" name="fruit" value="香蕉" />香蕉</label>
			<label><input type="checkbox" name="fruit" value="西瓜" />西瓜</label>
		</div>
	</body>
</html>

下拉列表

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> window.onload = function() {
        
           var olist = document.getElementById("list"); olist.onchange = function() {
        
           var link = this.options[this.selectedIndex].value; window.open(link); //打开一个新的窗口 }; } </script>
	</head>
	<body>
		<select id="list">
			<option value="http://www.baidu.com">百度</option>
			<option value="http://www.sina.com.cn">新浪</option>
			<option value="http://www.qq.com">腾讯</option>
			<option value="http://www.sohu.com">搜狐</option>
		</select>
	</body>
</html>

编辑事件

oncopy:防止页面内容被复制

document.body.oncopy = function()
{
      
        
    return false;
}

onselectstart:防止页面内容被选取

document.body.onselectstart = function()
{
      
        
    return false;
}

oncontextmenu:禁止鼠标右键

document.oncontextmenu = function()
{
      
        
    return false;
}

页面事件

onload:表示文档加载完成后再执行的一个事件

window.onload = function()
{
      
        
    ......
}

onbeforeunload:表示离开页面之前触发的一个事件

window.onbeforeunload = function()
{
      
        
    ......
}

一个函数仅仅是定义而没有被调用的话,则函数本身是不会执行的

事件进阶

JavaScript 中,想要给元素添加一个事件的两种方式是 事件处理器事件监听器

事件处理器

通过 HTML 属性的方式来给元素添加一个事件
事件处理器没办法为一个元素添加多个相同的事件

变量名.onclick = function()
{
      
        
    ......;
};

事件监听器

addEventListener():为一个元素添加事件,可以为同一种元素添加多个相同的事件

obj.addEventListenner(type, fn, false)
/* obj是一个 DOM 对象,用 getElementById()、getElementsByTagName()等方法获取元素节点 type 是一个字符串,指的是事件类型 fn 是一个函数名,或者匿名函数 false 表示事件冒泡阶段的调用 */
// fn 是一个函数名
obtn.addEventListener("click", alertMes, false);
function alertMes()
{
      
        
    alert("JavaScript");
}
// 调用匿名函数
obtn.addEventListener("click", function(){
      
        
    alert("JavaScript");
}, false);

实际开发中,可能使用多次 window.onload,但是 JavaScript 只执行最后一次 window.onload

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script type="text/javascript"> function addLoadEvent(func) {
        
           var oldonload = window.onload; if(typeof window.onload != "function"){
        
           window.onload = func; }else{
        
           window.onload = function() {
        
           oldonload(); func(); } } } addLoadEvent(function(){
        
           var obtn1 = document.getElementById("btn1"); obtn1.onclick = function() {
        
           alert("第一次"); }; }); addLoadEvent(function(){
        
           var obtn2 = document.getElementById("btn2"); obtn2.onclick = function() {
        
           alert("第二次"); }; }); addLoadEvent(function(){
        
           var obtn3 = document.getElementById("btn3"); obtn3.onclick = function() {
        
           alert("第三次"); }; }); </script>
	</head>
	<body>
		<input id="btn1" type="button" value="按钮1" /><br />
		<input id="btn2" type="button" value="按钮2" /><br />
		<input id="btn3" type="button" value="按钮3" /><br />
	</body>
</html>

removeEventListener():为元素解绑某个事件

obj.removeEventListener(type, fn, false);
/* obj:是一个DOM对象, 使用 getElementById()、getElementsByTagName()等方法获取 type: 字符串, 指的是事件类型, fn 必须是一个函数名, 而不能是一个函数 */

解除事件监听器添加的事件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> window.onload = function(){
        
           var odiv = document.getElementById("content"); var obtn = document.getElementById("btn"); // 为 div 添加事件 odiv.addEventListener("click", changeColor, false); // 点击按钮后,为 div 解除事件 obtn.addEventListener("click",function(){
        
           odiv.removeEventListener("click", changeColor, false); }, false); function changeColor(){
        
           this.style.color = "hotpink"; } } </script>
	</head>
	<body>
		<p id="content">学习网</p>
		<input id="btn" type="button" value="解除" />
	</body>
</html>

解除事件处理器添加的事件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> window.onload = function(){
        
           var odiv = document.getElementById("content"); var obtn = document.getElementById("btn"); // 为 div 添加事件 odiv.onclick = changeColor; // 点击按钮后,为 div 解除事件 obtn.addEventListener("click",function(){
        
           odiv.onclick = null; }, false); function changeColor(){
        
           this.style.color = "hotpink"; } } </script>
	</head>
	<body>
		<p id="content">学习网</p>
		<input id="btn" type="button" value="解除" />
	</body>
</html>

event 对象

event对象:事件有关的详细信息临时保存的指定的地方

属性 说明
t y p e type type 事件类型
k e y C o d e keyCode keyCode 键码值
s h i f t K e y shiftKey shiftKey 是否按下 S h i f t Shift Shift
c t r l K e y ctrlKey ctrlKey 是否按下 C t r l Ctrl Ctrl
a l t K e y altKey altKey 是否按下 A l t Alt Alt

shiftKeyctrlKeyaltKey 返回的是布尔值

type

type:获取事件的类型, . 运算符访问

keyCode

keyCode:获取按下了键盘中的哪个键

event.keyCode;  // 返回的是一个数值
按键 键码
W(上) 87
S(下) 83
A(左) 65
D(右) 68
38
40
37
39

获取上下左右方向键

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> window.onload = function(){
        
           var ospan = document.getElementsByTagName("span")[0]; window.addEventListener("keydown", function(e){
        
           if(e.keyCode == 38 || e.keyCode == 68){
        
           ospan.innerHTML = "上"; }else if(e.keyCode == 39 || e.keyCode == 68){
        
           ospan.innerHTML = "右"; }else if(e.keyCode == 40 || e.keyCode == 83){
        
           ospan.innerHTML = "下"; }else if(e.keyCode == 37 || e.keyCode == 65){
        
           ospan.innerHTML = "左"; }else{
        
           ospan.innerHTML = ""; } }, false); } </script>
	</head>
	<body>
		<div>你控制的方向是:<span style="font-weight: bold; color: hotpink;"></span></div>
	</body>
</html>

this 对象

哪个 DOM 对象调用了 this 所在的函数,那么 this 指向的就是哪个 DOM 对象

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script> window.onload = function() {
        
           var btns = document.getElementsByTagName('button'); // btns得到的是伪数组 里面的每一个元素 btns[i] for (var i = 0; i < btns.length; i++) {
        
           btns[i].onclick = function() {
        
           // (1) 我们先把所有的按钮背景颜色去掉 干掉所有人 for (var i = 0; i < btns.length; i++) {
        
           btns[i].style.backgroundColor = ''; } // (2) 然后才让当前的元素背景颜色为pink 留下我自己 this.style.backgroundColor = 'pink'; } } } </script>
	</head>
	<body>
		<button>按钮1</button>
		<button>按钮2</button>
		<button>按钮3</button>
		<button>按钮4</button>
		<button>按钮5</button>
	</body>
</html>