JS事件

一、什么是事件

1、是指用户在某事务上由于某种行为所执行的操作
2、事件的要素
事件源:是指那个元素引发的事件,如:a标签、div标签
事件:事件是指执行的动作,如:单击、双击等
事件驱动程序:即执行的结果,如:单击button标签所执行的函数

二、事件的绑定

1.行内事件绑定函数
定义事件函数,在元素的事件上调用函数,此方式一个事件只能绑定一个函数

<button οnclick="foo()"></button>
		<script type="text/javascript">
			function foo(){
			  console.log("点击事件");
			}
		</script>

2.脚本中绑定匿名函数

<button id="btn"></button>
		<script type="text/javascript">
			
			var btn = document.getElementById("btn");
			btn.onclick = function(){
			  console.log("点击事件");
			}
			
		</script> 

3.用 addEventListener() 来绑定事件监听函数

addEventListener语法:
elementObject.addEventListener(eventName,handle,useCapture);

参数 obj 为点击的元素对象,ev为事件类型注意要去掉事件的on,只写 click、dblclick、mouseover这样的事件,fn为事件运行的函数。

elementObject:DOM对象(即DOM元素 )

eventName:事件名称。注意,这里的事件名称没有“ on ”,如鼠标单击事件 click ,鼠标双击件 doubleclick ,鼠标移入事件 mouseover,鼠标移出事件 mouseout 等

handle:事件句柄函数,即用来处理事件的函数。

useCapture:Boolean类型,是否使用捕获,一般用false。

<button id="btn"></button>
		<script type="text/javascript">
			
			var btn = document.getElementById("btn");
			btn.addEventListener("click",function(){
			  console.log("点击事件");
			})
			
		</script>

特点:
1、行内绑定:绑定函数是唯一的,可以在调用的时候传入参数,但参数是固定的值,不建议使用
2、在脚本中使用onxxxx绑定函数:可以绑定多个函数,但是后面绑定的函数会替换掉前面的函数,最终只会执行最后一个,直接给引用的方式不能传参,如果要传参必须使用匿名函数,在匿名函数中调用事件的函数并传参。
3、使用addEventListener:可以绑定多个函数,并且多个函数依次执行,如果在传参与2的方式相同

三、DOM的常用事件与基本操作

1、鼠标移动事件
•鼠标移动事件包括鼠标移入、移出、和移动事件
•移入: onmouseover
•移出: onmouseout
•移动: onmousemove

<button id="btn"></button>
		<script type="text/javascript">
			var box = document.getElementById("box");		
			//鼠标移入
			box.onmouseover = function(){
				console.log("鼠标移入");
			}
			//鼠标移动
			box.onmousemove = function(){
				console.log("鼠标移动");
			}
			//鼠标移出
			box.onmouseout = function(){
				console.log("鼠标移出");
			}			
		</script> 

例题:鼠标的拖拽效果

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style>
			div{
				width: 100px;
				height: 100px;
				background: red;
				position: absolute;
	            left: 0;
	            top: 0;
			}
		</style>
	</head>
	<body>
		<div id="box">
			<!--<button id="btn">回放</button>-->
		</div>
		
		<script type="text/javascript">
			// 选中元素之中让元素发生跟随鼠标移动的行为;
	        // 1. 鼠标按下 :  拖拽开始;
	        // 2. 鼠标移动 :  拖拽进行中;
	        // 3. 鼠标抬起 :  拖拽结束;
	        
	        //绑定id名为box的div
	        var box = document.getElementById("box");
	        //判断是否开启状态--拖拽默认没有开始
	        var drag_start = false;
	        //因为当鼠标按下的时候,会需要到左上的坐表
	        var offset_x = null;
	        var offset_y = null;
	        
	        //1. 鼠标按下 :  拖拽开始
	        box.onmousedown = function( evt ){
	        	//console.log("拖拽开始");
	        	drag_start = true;
	        	
	        	var e = evt || event;	        	
	        	//获取鼠标按下时,距离元素边框的x轴和y轴的位置
	        	offset_x = e.offsetX;
	        	offset_y = e.offsetY;
	        	
	        }
	        
	        // 2. 鼠标移动 :  拖拽进行中;
	        //鼠标移动,就必须用到鼠标的位置,就必须使用到事件对象,则创建evt
	        document.onmousemove = function( evt ){
	        	//console.log("拖拽进行中");
				//如果拖拽默认没有开始,那么后边的代码不执行
	        	if( drag_start === false ){ return false }
	        	
	        	var e = evt || event;
	        	//给box设置x,y值
	        	box.style.left = e.clientX - offset_x +"px";
	        	box.style.top = e.clientY - offset_y +"px";
	        	
	        }
	        
	        
	        // 3. 鼠标抬起 :  拖拽结束;
	        box.onmouseup = function(){
	        	//console.log("拖拽结束");
	        	//拖拽结束drag_start = false
	        	drag_start = false;
	        }      
		</script>
	</body>
</html>

2、鼠标位置的获取
•鼠标的位置可以通过事件对象获取
•要获取事件对象,必须在事件函数中定义形参,在调用函数时传入”event”对象

		<button id="btn"></button>
		<script type="text/javascript">
			
			var box = document.getElementById("box")
			box.onclick = function( evt ){
				var e = evt || event;
				console.log(e);
			}
			
		</script> 
属性名描述
clientX/clientY事件发生的时候,鼠标相对于浏览器窗口可视文档区域的左上角的位置;在DOM标准中,这两个属性值都不考虑文档的滚动情况,也就是说,无论文档滚动到哪里,只要事件发生在窗口左上角,clientX和clientY都是 0,所以在IE中,要想得到事件发生的坐标相对于文档开头的位置,要加上document.body.scrollLeft和 document.body.scrollTop
offsetX,offsetY事件发生的时候,鼠标相对于源元素左上角的位置
pageX,pageY检索相对于父元素鼠标水平坐标的整数
screenX、screenY鼠标指针相对于显示器左上角的位置,如果你想打开新的窗口,这两个属性很重要

例题:一个跟随鼠标移动的效果

		<style type="text/css">
			div{
				width: 100px;
				height: 100px;
				background: yellow;
				position: absolute;
			}
		</style>
		<div id="box"></div>
		<script type="text/javascript">
			window.onload = function(){

				document.onmousemove = function( evt ){
					var e = evt || event;
					var oDIV = document.getElementById("box");
					var scrollTop = document.documentElement.scrollTop||document.body.scrollTop;
					var scrollLeft = document.documentElement.scrollLeft||document.body.scrollLeft;
					oDIV.style.left = e.clientX + scrollLeft + "px";
					oDIV.style.top = e.clientY + scrollTop + "px";
					
					
				}
			}
		</script>

扩展效果:一连串元素跟随鼠标效果

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			div{
				width: 50px;
				height: 50px;
				background: red;
				position: absolute;
			}
		</style>
	</head>
	<body>
		<div></div><div></div><div></div><div></div><div></div>
		<div></div><div></div><div></div><div></div><div></div>
		<div></div><div></div><div></div><div></div><div></div>
		<div></div><div></div><div></div><div></div><div></div>
		<div></div><div></div><div></div><div></div><div></div>
		<script type="text/javascript">
			window.onload = function(){
				var oDIV = document.getElementsByTagName("div");
				document.onmousemove = function( evt ){
					var e = evt || event;
					for(var i = oDIV.length - 1 ; i > 0 ; i --){
	                    oDIV[i].style.left = oDIV[i - 1].style.left;
	                    oDIV[i].style.top = oDIV[i - 1].style.top;
                	}
                oDIV[0].style.left = e.clientX + "px";
                oDIV[0].style.top = e.clientY + "px";
				}
			}
		</script>
	</body>
</html>

3.按键事件的处理
(1).事件与描述:
onkeydown----某个键盘的键被按下
onkeypress-—某个键盘的键被按下或按住
onkeyup-----某个键盘的键被松开
(2).事件对象的属性
属性 与描述
altKey:返回当事件被触发时,“ALT” 是否被按下。
ctrlKey :返回当事件被触发时,“CTRL” 键是否被按下。
shiftKey:返回当事件被触发时,“SHIFT” 键是否被按下。
keyCode/which:对于 keypress 事件,该属性声明了被敲击的键生成的Unicode 字符码。对于 keydown 和 keyup 事件,它指定了被敲击的键的虚拟键盘码。虚拟键盘码可能和使用的键盘的布局相关。

按键示例: 聊天对话框

<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>无标题文档</title>
	<style type="text/css">
		*{
			font-size: 14px; 
			padding:0; 
			margin:0;
		}
		.main{
			position: relative;
			margin: 20px auto;
			border: 1px solid steelblue;
			width: 430px;
			height: 400px;
		}
		.msgInput{
			display: block;
			width: 406px;
			height: 60px;
			margin: 10px auto;
			
		}
		.sendbtn{
			position: absolute;
			width: 100px;
			height: 29px;
			bottom: 5px;
			right: 10px;
		}
		.content{
			list-style: none;
			width: 410px;
			height: 280px;
			margin: 5px auto;
			border: 1px dotted #D1D3D6;
			overflow-y: scroll;
		}
		.msgContent{
			width:auto;
			max-width: 250px;
			height: auto;
			word-break: break-all;
			margin: 5px;
			padding: 3px;
			border-radius: 5px;
		}		
		.content .left{
			float: left;
			text-align: left;
			background-color: lightgrey;
		}
		.content .right{
			float: right;
			text-align: right;
			background-color: yellowgreen;
		}
	</style>
</head>
<body>
	<div id="main" class="main">
		<ul id="content" class="content">
			<li class="msgContent left">hello?</li>
			<div style="clear: both;"></div>
			<li class="msgContent left">hello</li>
			<div style="clear: both;"></div>
			<li class="msgContent right">hi</li>
			<div style="clear: both;"></div>
			<li class="msgContent left">hehe</li>
			<div style="clear: both;"></div>
			<li class="msgContent left">goodbye</li>
			<div style="clear: both;"></div>
			<li class="msgContent right">。。。。</li>
			<div style="clear: both;"></div>
			<li class="msgContent right">sdfasdsadfassdfsdfsdfdsfsdfsdfsdfdfasdffasdfasfdasd fasd fasd fasdfasdfasdf</li>
		</ul>
		<textarea id="msg_input" class="msgInput"></textarea>
		<button id="sendbtn" class="sendbtn">发送</button>
	</div>
</body>
<script>
	var sendbtn_ele = document.getElementById("sendbtn");
	var msg_ipt_ele = document.getElementById("msg_input");
	var content_ele = document.getElementById("content");
	// 添加事件 : 
	sendbtn_ele.onclick = function(){
		sendMsg();
	}
	// alt + 回车;
	msg_ipt_ele.onkeydown = function( evt ){
		var e = evt || event;
		var keyCode = e.which || e.keyCode;
		// 按下alt键的同时 按下回车
		if( e.altKey && keyCode === 13){
			sendMsg();
		}
	}
	// 信息发送功能; => DOM操作;
	// 所有输入内容都在textarea里面所以我们必须要先去进行数据的获取;
	function sendMsg(){
		// 1. 取值;
		var ipt_value = msg_ipt_ele.value;
		// 2. 创建元素;
		var li  = document.createElement("li");
		var div = document.createElement("div");
		// 3. 建立 元素的基本结构;
		li.className = "msgContent right"
		// li.innerHTML = ipt_value;
		li.innerText = ipt_value;
		div.style.clear = "both";
		// 4. 元素插入;
		content_ele.appendChild(div);
		content_ele.appendChild(li);
		// 5. 用户体验优化;
		li.scrollIntoView();
		// 6. 清空输入框之内的内容;
		msg_ipt_ele.value = "";
		// 7. 让输入框获取焦点 : 
		// 获得焦点;
		msg_ipt_ele.focus();
		// 失去焦点;
		// msg_ipt_ele.blur();
		// 选中文字;
		// msg_ipt_ele.select();
	}
</script>
</html>
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值