Go to comments

jQuery 事件

一、绑定事件

.on()方法能实现绑定任何事件,内部由addEventLister()来实现的,

只不过.on()除了能绑定系统事件click, mouseenter…,这种浏览器能通过线程监测到的事件,

还可以绑定非系统的的自定义事件,自定义事件通过.trigger()来触发


1、.on()方法的四个参数

 .on( 'type', 'selector', 'data', 'handle' ) 

1. type 事件类型(必填)

2. selector 选择器,可以筛选具体绑定哪些标签,利用事件委托的时候才会用(可以不填)

3. data 函数执行的参数(可以不填)

4. handle 事件处理函数(必填)


同一个事件类型,可以绑定多个事件处理函数,点击一次弹出两次alert

<div class="demo" style="width:100px;height:100px;background-color:chocolate"></div>

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>

	$('.demo').on('click', function(){
		alert('第一次哦');
	});

	$('.demo').on('click', function(){
		alert('第二次呦');
	});

</script>


同一个事件类型,多次绑定同一个事件处理函数,也会弹出两次提示框

<div class="demo" style="width:100px;height:100px;background-color:chocolate"></div>

<script>
	
	function demo(){
		alert('弹出窗口');
	}

	$('.demo').on('click', demo);

	$('.demo').on('click', demo);

</script>

平时基本不会这样做,真想执行两次弹窗,一个函数里写两次alert()不好吗


2、第三个参数data

第三个参数data的类型可以是对象,字符串,布尔值,传什么都可以


但是要注意一个小问题,如果传的是"字符串",并且没有传第二个参数,

1. 按照参数的顺序  $('.demo').on('type', 'selector', 'data', 'handle) ,data会理解成选择器selector,不会有任何效果

2. 什么都打印不出来,其实连事件都没绑定上,因为是给$('.demo')下面的cc值绑定事件,但是没有符合条件的

$('.demo').on('click', 'cc', function(e){
    console.log(e.data);
});


参数传一个对象  { name: 'Glee' } ,到事件对象 e.data 属性里面取

<div class="demo" style="width:100px;height:100px;background-color:chocolate"></div>

<script>

	$('.demo').on('click', {name:'Glee'}, function(e){

		console.log(e.data); // {name: 'Glee'}

	});

</script>


第三个参数也可以填true

$('.demo').on('click', true, function(e){
	console.log(e.data); // true
});


如果第三个参数jiu想传"字符串",可以传一个占位第二参数,比如传一个空字符串,或者不传加一个逗号

$('.demo').on('click', '', '这是第三个参数', function(e){
    console.log(e.data); // 这是第三个参数
});


4、第二个参数selector

第二个参数selector作用蛮大的,不仅起到过滤的作用,而且事件委托的时候经常会使用到


给所有的 $('li') 绑定事件,效率肯定是不高的,我们利用事件委托给li绑定事件

1. 当点击 li 时候 e.target 是li,因为点击li,事件会冒泡到ul

2. 事件函数执行,e.target 判断事件源是谁?

3. 事件源是li,最后弹出li里的文本

<style>
*{margin:0;padding:0;}
ul{width:600px; padding:10px;list-style:none;background-color: antiquewhite;}
li{height:20px;padding:20px; margin-bottom:10px; background-color: burlywood;color:#fff;}
</style>

<ul>
	<li>1</li>
	<li>2</li>
	<li>3</li>
	<li>4</li>
	<li>5</li>
	<li>6</li>
</ul>

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>

	$('ul').on('click', function(e){

		alert($(e.target).text()); // e.target是事件源对象,也就是说事件发生在谁的身上
	});

</script>


需求是给li绑定事件,结果点击ul时也有反映,可以传第二个参数"li"

1. 事件还是给 $('ul') 绑定,只不过jQuery在内部冒泡的时候会判断一下,事件源是不是li ?

2. 如果事件源是li,才去执行事件处理函数,否则就不会执行,点击ul就不弹出了

$('ul').on('click', 'li', function(e){

    alert($(e.target).text());

});


怎么知道jQuery内部是给ul绑定的事件呢?

1. 创建一个新的li,然后插入到ul里面,也就是在绑定事件之后新增了li

2. 如果是给li绑定的事件,新添加的li现在没有被绑定事件,点击不会有反应,

3. 如果是给ul绑定的事件,事件委托追加任何一个li都会冒泡到ul,点击li是可以弹出

$('ul').on('click', 'li', function(e){
    alert($(e.target).text());
});

$('<li>新增7</li>').appendTo($('ul'));


总结第二个参数的目的

1. 进一步进行筛选,让谁起到作用

2. 起到事件委托的作用,只能谁去触发


5、.one()方法只执行一次

A标签绑定一个one()事件

第一次点击,先跳转到淘宝,然后取消A标签自己跳转百度的默认事件

第二次点击,one()方法没有用了,就打开A标签自己默认的href,跳转的百度

<a href="https://baidu.com" target="_black">点击</a>

<script>

	$('a').one('click',function(e){

		window.open('http://www.taobao.com'); // 跳转到淘宝

		return false; // 阻止A标签跳转百度的默认事件

	});

</script>

取消默认事件jQuery里非常简单,

1. 直接 return false 就可以是兼容,而且还阻止了冒泡,

2. 也可以 e.preventDefault() 阻止默认事件也是兼容的


一次性事件一般的适用场景做广告,配合延迟器来做


6、一个标签同时绑定多种事件类型

.on()一次绑定click、mouseenter、mousetleave,3个事件类型,

1. 可以这样 .on().on().on() 绑定,

2. 也可以一次 .on 来绑


.on()传一个对象,属性对应属性值的方式,jQuery内部 for in 来解析

<div class="demo" style="width:100px;height:100px;background-color:chocolate"></div>

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>

	$('.demo').on({
		click: function(){
			console.log('click');
		},
		mouseenter: function(){
			console.log('mouseenter');
		},
		mouseleave: function(){
			console.log('mouseleave');
		}
	});

</script>


二、解绑事件

为了解绑事件呈现出一个更好的对比

1. 给demo绑定两种事件类型click、mouseenter

2. 每种事件类型,绑定两种不同的事件处理函数

<div class="demo" style="width:100px;height:100px;background-color:chocolate"></div>

<script>

	$('.demo').on('click', clickOne);
	$('.demo').on('click', clickTwo);

	$('.demo').on('mouseenter', enterOne);
	$('.demo').on('mouseenter', enterTwo);

	// 两个命名的click事件处理函数
	function clickOne(){
		console.log('clickOne');
	}
	function clickTwo(){
		console.log('clickTwo');
	}

	// 两个命名的mouseenter事件处理函数
	function enterOne(){
		console.log('enterOne');
	}
	function enterTwo(){
		console.log('enterTwo');
	}

</script>


什么参数都不填,所有事件全部解绑,无论系统的还是自定义的

$('.demo').off();


如果传一个参数,

一定要传事件类型,对应click点击类型全部取消了,鼠标移入还是有反应的

$('.demo').off('click');


填两个参数,

第一个填事件类型,第二个填事件处理函数,点击只剩下一个事件函数clickOne

$('.demo').off('click', clickTwo);


on()用的第二个参数,官方推荐怎么绑定,off()也怎么来解绑

<style>
*{margin:0;padding:0;}
ul{width:600px; padding:10px;list-style:none;background-color: antiquewhite;}
li{height:20px;padding:20px; margin-bottom:10px; background-color: burlywood;color:#fff;}
</style>

<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
</ul>

<script>

	function clickOne(e){
		alert($(e.target).text());
	}

	$('ul').on('click', 'li', clickOne); // 绑定绑定

	$('ul').off('click', 'li', clickOne); // 就怎么解绑

</script>


绑定的是 li 这样解绑偶数位li是不行的

 $('ul').off('click', 'li:even', clickOne); 


三、主动触发事件trigger()

trigger()作用帮我们主动的去触发一列事件,

1. 无论是系统事件还是自定义事件

2. 自定义事件只能用trigger()


如果用户点击操作,浏览器有线程监控click点击事件,系统帮我们去触发, trigger() 是从代码层面上去触发事件

<div class="demo" style="width:100px;height:100px;background-color:chocolate"></div>

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>

	$('.demo').on('click', function(){
		console.log('click')
	});

	$('.demo').trigger('click');

</script>


第一个参数事件类型,第二个参数是一个数组,数组里面的值会成为事件函数执行时候的参数

<div class="demo" style="width:100px;height:100px;background-color:chocolate"></div>

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>

	$('.demo').on('click', function(e, a, b, c, d){ // 事件函数的第一个参数e是事件对象,后面的a,b,c,d对应数组里面的[10,20,30,40]

		console.log(a, b, c, d);

	});

	$('.demo').trigger('click', [10, 20, 30, 40]); // 10 20 30 40

</script>

.trigger()主动触发某一个事件函数的时候,

实参,需要参数用数组的形式传进去  ( 'click',  [10, 20, 30, 40] )  

形参,必须在事件对象e之后,必须把e先写出来   function( e, a, b, c, d ) 


trigger()的应用场景

比如广告层右上角有一个 x 关闭的,广告层播放广告会数秒,用户不点击 x 关闭,数秒 5~6 秒后广告播放完也会自动消失,

用户可以点击执行关闭方法

用户不点击时间到了 trigger() 自动触发,还执行关闭方法


trigger()对系统已有的事件触发还是非常有意义的,在编程里非常常见,

自定义事件这块trigger()还能大展身手


四、体现编程实力的时候到了"自定义事件"

on()方法可以绑定自定义 pageLoad 事件(pageLoad是我们自己定义的),使用 trigger('pageLoad') 触发

<div class="demo" style="width:100px;height:100px;background-color:chocolate"></div>

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>

	$('.demo').on('pageLoad', function(){
		console.log('触发了');
	});

	$('.demo').trigger('pageLoad'); // 参数变成了自定义事件类型pageLoad

</script>


自定义事件往往能体现出我们的编程实力,

比如fullpage插件,全屏滚动切换没有系统事件去监控到,但是我们的需要給每个页面都绑定自定义事件(pageLoad),叫页面加载成功事件

pageLoad事件,我们需要按照一定的逻辑,到达某个点了必须要使用 trigger() 去触发了


自定义事件的传参的形式是一样

<div class="demo" style="width:100px;height:100px;background-color:chocolate"></div>

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>

	$('.demo').on('pageLoad', function(e,a,b,c,d){
		console.log('pageLoad',a,b,c,d)
	});

	$('.demo').trigger('pageLoad', [10,20,30,40]);

</script>


五、hover()事件

如果不用hover事件也可以,通过两个on的方式绑定了mouseenter和mouseleave

<div class="demo" style="width:100px;height:100px;background-color:chocolate"></div>

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>

	$('.demo').on('mouseenter', function(){

		$(this).css({backgroundColor: 'orange'});

	}).on('mouseleave', function(){

		$(this).css({backgroundColor: 'yellow'});

	});

</script>


hover()事件很方便

$('.demo').hover(function(){

    $(this).css({backgroundColor: 'orange'});

}, function(){

    $(this).css({backgroundColor: 'yellow'});

});


六、直接使用事件

键盘事件

<input type="text">

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>

	$('input').keydown(function(){

		console.log($(this).val());
	});

</script>


思考题,

鼠标滑轮事件 mousewheel


七、事件对象

已经做好兼容了,名字和原生的也没有很大变化

e.pageX   点击位置

e.clienX    点击位置

e.which    鼠标是那个键

e.button   鼠标左右键

e.preventDefault()      阻止默认事件

e.stopPropagation()   阻止冒泡

return false;  兼容阻止事件冒泡和默认事件



Leave a comment 0 Comments.

Leave a Reply

换一张