事件冒泡的一些应用_利用事件冒泡处理多个事件[1]

在做项目时,有这样一个需求,需要点击Input显示隐藏下拉面板,从中选择内容填充入文本框。

最开始思路:

(1)文本框与下拉面板作为一个整体,整体失去焦点后,隐藏下拉面板,不可行;

(2)文本框正拥有焦点,此时点击面板,尝试先触发面板的点击事件再通过文本框的失去焦点事件

以上思路最终均不可行,原因:

(1)div没有获取焦点之说,何来失去焦点;

(2)文本框触发焦点事件总是会先执行,面板隐藏后无法再触发其点击事件;

最后解决思路:利用冒泡机制,将点击事件绑定在父容器中,如果有点击事件,判断target如果不是文本框并且不是下拉面板,则隐藏下拉面板(有点排除法意味);

demo在线演示:http://sandbox.runjs.cn/show/adgslqc2

源码:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
  <link rel="stylesheet" type="text/css" href="http://sandbox.runjs.cn/uploads/rs/294/c4c2o6mh/base.css">
	<style>
		.main{width: 400px;height: 400px;background-color: #F0F8FF;}
		.item{width: 153px;height: 100px;background-color: #B9D3EE;position:absolute;left: 60px;}
	</style>
</head>
<body>
	<div class="main fn-re" id="t">
		选择类别:<input id="t-1" type="text" />
		<div id="t-2" class="item fn-hide"></div>
	</div>

	<script type="text/javascript" src="http://sandbox.runjs.cn/uploads/rs/294/c4c2o6mh/jquery.js"></script>
	<script>
		var main = $('.main'),
			input = $('input'),
			item = $('.item');
		input.focus(function(){
			item.css('display','block');
		});
		//开始想使用blur事件来处理,不好用
		main.click(function(ev){
			var id = ev.target.id;
			if(id!='t-1'&&id!='t-2')
				$('.item').hide();
		});
	</script>
</body>
</html>

写的过程新发现:下面代码如果将target换成this,则会出现一些问题。打印之发现:this取得是整个父节点,而target获取的是点击时候的子节点

main.click(function(ev){
			var id = ev.target.id;
			if(id!='t-1'&&id!='t-2')
				$('.item').hide();
		});
时间: 2024-10-12 02:01:22

事件冒泡的一些应用_利用事件冒泡处理多个事件[1]的相关文章

ExtJS要利用观察者模式 去实现自定义的事件

1 // 要利用观察者模式 去实现自定义的事件 2 3 4 //1:由于浏览器他自己能定义内置的事件(click/blur...) 5 // 我们也应该有一个类似于浏览器这样的类,这个类 自己去内部定义一些事件(自定义事件) 6 var Observable = function(){ 7 //承装自己所定义的事件类型的 8 this.events = ['start','stop']; 9 //我们应该设计一种数据类型,这种数据类型就可以去维护自定义事件类型 和 和相关绑定函数的关系,结构如下

Delphi的基于接口(IInterface)的多播监听器模式(观察者模式 ),利用RTTI实现Delphi的多播事件代理研究

Delphi的基于接口(IInterface)的多播监听器模式(观察者模式 )http://www.cnblogs.com/hezihang/p/6083555.html 利用RTTI实现Delphi的多播事件代理研究http://www.cnblogs.com/hezihang/p/3299481.html

【转载】W3C下的冒泡和捕获机制。到底是冒泡呢。还是捕获呢。一个DOM元素绑定多个事件时如何执行。

原文  http://blog.csdn.net/u011719449/article/details/23787627 在准备阿里前端面试的时候看到这么一道题. 一个DOM元素绑定两个事件,一个冒泡,一个捕获,则事件会执行多少次,执行顺序如何. 这导致了我对冒泡和捕获又进一步深入的了解.(永远都在发现自己知识匮乏的日子中度过人生真是好抓急啊.) 首先冒泡和捕获是怎么一回事. 简单点说.冒泡就是从下往上,像鱼吐泡,泡泡是从下往上升的,也就是DOM元素被触法事件时(此时的dom元素为目标元素),目

事件分发机制完全解析_下

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中View的事件分发机制,相信阅读过的朋友对View的事件分发已经有比较深刻的理解了. 还未阅读过的朋友,请先参考 Android事件分发机制完全解析,带你从源码的角度彻底理解(上) . 那么今天我们将继续上次未完成的话题,从源码的角度分析ViewGruop的事件分发. 首先我们来探讨一下,什么是View

JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数

本篇体验JavaScript事件的基本面,包括: ■ 事件必须在页面元素加载之后起效■ 点击事件的一个简单例子■ 为元素注册多个点击事件■ 获取事件参数 □ 事件必须在页面元素加载之后起效 有这样一段简单的代码: <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <style>

黑马程序员_ 利用oc的协议实现代理模式

先说下代理模式是什么吧 定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象 而代理对象可以在客户端和目标对象之间起到中介的作用. 在看过李明杰老师的课程后,我对代理模式有了最初步的理解,虽然还很浅显 但是也明白了代理模式的 一些作用跟用法.首先使用代理模式可以降低耦合度.大大的增强了代码的弹性. 举个例子,小明想看电影,但是没时间买票 于是就拜托小强去买票 最简单的方式就是 建立一个person类(小明) 一个agent类(代理类) ag

如何识别事件是在捕获,目标对象,还有冒泡阶段进行的?

eventPhase  可以来识别 eventPhase等于1,捕获阶段 eventPhase等于2,事件处理程序处于目标对象上 eventPhase等于3,冒泡阶段调用的事件处理程序 注意:尽管"处于目标"发生在冒泡阶段,但是依然等于2

iOS7_ios7_如何实现UIAlertView以及监听点击事件(其它样式)_如何修改UITextField默认键盘样式

首先我们知道,UIAlertView实际上有多种样式,在xcode中,按住cmd点击UIAlertView,进入头文件我们看到: 1 typedef NS_ENUM(NSInteger, UIAlertViewStyle) { 2 UIAlertViewStyleDefault = 0, //默认样式 3 UIAlertViewStyleSecureTextInput, //加密文本样式 4 UIAlertViewStylePlainTextInput, //普通文本样式 5 UIAlertVi

jQueryindex();eq();利用数组来操作多个事件

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>text-button-fn.html</title> <script src="js/jquery-1.7.1.js"></script> <script> $(function(){ var div