前端编程提高之旅(十五)----jquery事件

HTML与js交互主要通过用户与浏览器操作页面时引发事件。文档或某些元素发生某些变化或操作时,浏览器会生成事件。jquery增加了事件处理能力。

   jquery事件部分可以从以下五部分理解:

   一、加载DOM函数

   这里指的如下方法:

 $(document).ready(function(){
  })

相比于传统的window.onload方法,前者在执行时机与可否多次使用上区别于后者。

   前者是在DOM完全就绪回调就会被调用,后者则是网页所有元素(包含关联文件)完全加载到浏览器后才会被调用。这里常见应用场景是,当需要对图片进行操作时,需要采用后者,因为后者才能保证图片文件被加载完成执行。

  前者可以多次使用,而后者只能使用一次,即便多次定义,后定义的函数会将之前定义的函数覆盖掉。

 二、各种事件绑定的方法

  (1)一般绑定方法:bind方法

   bind方法参数分别定义事件类型、回调函数。

   构建一个实例,HTML如下:

<div id="panel">
	<h5 class="head">什么是jQuery?</h5>
	<div class="content">
		jQuery是继Prototype之后又一个优秀的JavaScript库,它是一个由 John Resig 创建于2006年1月的开源项目。jQuery凭借简洁的语法和跨平台的兼容性,极大地简化了JavaScript开发人员遍历HTML文档、操作DOM、处理事件、执行动画和开发Ajax。它独特而又优雅的代码风格改变了JavaScript程序员的设计思路和编写程序的方式。
	</div>
</div>

bind使用代码如下:

  $("#panel h5.head").bind("click",function(){
	    var $content = $(this).next();
	    if($content.is(":visible")){
			$content.hide();
		}else{
			$content.show();
		}
	})

需要注意的是,回调函数内,this指的是带有相应行为的DOM元素,如需使用jquery中方法,徐将其转化为Jquery对象$(this)形式。

  (2)在bind基础上,简写绑定方法

   简写的绑定方法,方法名代表事件类型,参数为回调函数。

   依然延续上例,简写方法使用如下:

$("#panel h5.head").mouseover(function(){
	    $(this).next().show();
	}).mouseout(function(){
	    $(this).next().hide();
	})

(3)合成事件

   这里合成事件有两个hover方法与toggle方法。

   hover方法用于模拟鼠标悬停事件,有两个回调函数作为参数,第一个回调代表光标移入执行,第二个回调代表光标移出执行。

  沿用上例,使用方法如下:

$("#panel h5.head").hover(function(){
	    $(this).next().show();
	},function(){
	    $(this).next().hide();
	})

 toggle方法用于模拟鼠标连续单击行为,参数为多个回调,每个回调会根据单击次序顺序循环执行。

 不过这个方法在jquery1.9版本已经被删除了,这里并不多做讨论。

  (4)模拟操作

   模拟的是操作,也即是交互行为,从而引发事件,执行回调。这里用到的是trigger方法。

   举个例子,HTML代码:

<button id="btn">点击我</button>
<div id="test"></div>

采用模拟操作的代码:

$('#btn').bind("click", function(){
					 $('#test').append("<p>我的绑定函数1</p>");
			  }).bind("click", function(){
					 $('#test').append("<p>我的绑定函数2</p>");
			  }).bind("click", function(){
				  	 $('#test').append("<p>我的绑定函数3</p>");
		      });
	   $('#btn').trigger("click");

  对DOM绑定了单击事件,采用trigger方法,模拟了click事件,从而执行了回调。

  这里trigger方法模拟操作的事件还可以是自定义事件,当然也需要同时绑定自定义事件。

  依然延续上例,采用自定义事件代码实例:

$('#btn').bind("myClick", function(){
			$('#test').append("<p>我的自定义事件.</p>");
		});
	   $('#btn').click(function(){
			$(this).trigger("myClick");
	   });

trigger方法除了可以模拟操作,还可以在第二个参数中传入数据,这在MVC框架中,view间传递数据极其常用。

$('#btn').bind("myClick", function(event, message1, message2){
			$('#test').append( "<p>"+message1 + message2 +"</p>");
		});
	   $('#btn').click(function(){
			$(this).trigger("myClick",["我的自定义","事件"]);
	   });

采用triggerHandler方法可以模拟操作的同时避免触发浏览器默认操作,具体实例如下:

   html:

<button id="old">trigger</button>
<button id="new">triggerHandler</button>
<input />

  jquery代码:

 $('#old').bind("click", function(){
			$("input").trigger("focus");
		});
		$('#new').bind("click", function(){
		    $("input").triggerHandler("focus");
		});
		$("input").focus(function(){
            $("body").append("<p>focus.</p>");
        })

对比可知,后者没有触发浏览器默认聚焦功能。

  (5)绑定多个事件

   绑定多个事件的方法可采用bind方法,在第一个参数中将事件类型空格隔开。

   使用案例如下:

<!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>
 <title></title>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <style>
  div{
	width:100px;
	height:50px;
  }
  .over{
  color:red;
  background:#888;
  }
  </style>
 <script src="../../scripts/jquery.js" type="text/javascript"></script>
  <script type="text/javascript">
  $(function(){
     $("div").bind("mouseover mouseout click", function(){
        $(this).toggleClass("over");
     });
  })
  </script>
</head>
<body>
<div >滑入.</div>
</body>
</html>

(6)给绑定事件添加命名空间

   命名空间便于管理,当元素绑定多个事件时,删除事件只需要指定命名空间,节省了代码量。

   实例:

<!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>
 <title></title>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <style>
	div{width:100px;height:50px;background:#888;color:white;}
 </style>
  <script src="../../scripts/jquery.js" type="text/javascript"></script>
  <script type="text/javascript">
  $(function(){
	$("div").bind("click.plugin",function(){
	       $("body").append("<p>click事件</p>");
	});
	$("div").bind("mouseover.plugin", function(){
	       $("body").append("<p>mouseover事件</p>");
	});
	$("div").bind("dblclick", function(){
		   $("body").append("<p>dblclick事件</p>");
	});
	$("button").click(function() {
		$("div").unbind(".plugin");
	})
	/*
		click,mouseover 事件被删除,
	*/
  })
  </script>
</head>
<body>
<div>test.</div>
<button >根据命名空间,删除事件</button>
</body>
</html>

三、移除事件

   上面提到了绑定事件的各种方法,移除事件主要采用unbind方法,第一个参数即移除事件名,第二个参数可选为移除回调函数。

   使用实例:

$('#btn').bind("click", myFun1 = function(){
					 $('#test').append("<p>我的绑定函数1</p>");
			  }).bind("click", myFun2 = function(){
					 $('#test').append("<p>我的绑定函数2</p>");
			  }).bind("click", myFun3 = function(){
				  	 $('#test').append("<p>我的绑定函数3</p>");
		      });
	   $('#delTwo').click(function(){
			  $('#btn').unbind("click",myFun2);//移除第二个绑定click函数
	   });

    假如事件只需执行一次,可以采用one方法进行事件绑定,用法类似bind方法。

 $('#btn').one("click", function(){
					 $('#test').append("<p>我的绑定函数1</p>");
			  }).one("click", function(){
					 $('#test').append("<p>我的绑定函数2</p>");
			  }).one("click", function(){
				  	 $('#test').append("<p>我的绑定函数3</p>");
		      });

     四、事件对象属性

   事件对象,顾名思义即触发事件后,传入回调函数的对象,包含事件类型、事件目标、光标位置等与事件有关的属性。

    根据这些事件对象属性,便于编写关于本事件的各种操作。常用的防止多次单击、防止冒泡、默认操作都采用事件对象属性实现。

   实例:

$("a").click(function(event) {
	  alert("Current mouse position: " + event.pageX + ", " + event.pageY );//获取鼠标当前相对于页面的坐标
	  return false;//阻止链接跳转
	});

五、事件冒泡与阻止默认行为

  (1)事件冒泡

   关于事件冒泡,即触发一个事件,整个事件会从本层元素向外部包含的元素扩散,这样就可能导致,不希望触发的元素被触发事件。

  实例:

<!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>4-4-1</title>
<style type="text/css">
*{margin:0;padding:0;}
body { font-size: 13px; line-height: 130%; padding: 60px; }
#content { width: 220px; border: 1px solid #0050D0;background: #96E555 }
span { width: 200px; margin: 10px; background: #666666; cursor: pointer;color:white;display:block;}
p {width:200px;background:#888;color:white;height:16px;}
</style>
<script src="../../scripts/jquery.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
	// 为span元素绑定click事件
	$('span').bind("click",function(){
		var txt = $('#msg').html() + "<p>内层span元素被点击.<p/>";
		$('#msg').html(txt);
	});
	// 为div元素绑定click事件
	$('#content').bind("click",function(){
	    var txt = $('#msg').html() + "<p>外层div元素被点击.<p/>";
		$('#msg').html(txt);
	});
	// 为body元素绑定click事件
	$("body").bind("click",function(){
		var txt = $('#msg').html() + "<p>body元素被点击.<p/>";
		$('#msg').html(txt);
	});
})
</script>
</head>
<body>
<div id="content">
	外层div元素
	<span>内层span元素</span>
	外层div元素
</div>

<div id="msg"></div>
</body>
</html>

 解决事件冒泡的方法是在上述案例中,执行事件对象属性防止对象冒泡方法event.stopPropagation方法。

$('span').bind("click",function(event){
		var txt = $('#msg').html() + "<p>内层span元素被点击.<p/>";
		$('#msg').html(txt);
		event.stopPropagation();    //  阻止事件冒泡
	});
	// 为div元素绑定click事件
	$('#content').bind("click",function(event){
	    var txt = $('#msg').html() + "<p>外层div元素被点击.<p/>";
		$('#msg').html(txt);
		event.stopPropagation();    //  阻止事件冒泡
	});

(2)阻止浏览器默认行为

   这里采用的是事件对象属性的event.preventDefault方法。

 (3)如果既想阻止冒泡行为,又需要阻止浏览器默认行为,可以再回调中返回false,一并执行。

   实例:

$('span').bind("click",function(event){
		var txt = $('#msg').html() + "<p>内层span元素被点击.<p/>";
		$('#msg').html(txt);
		return false;
	});
时间: 2024-10-10 10:46:20

前端编程提高之旅(十五)----jquery事件的相关文章

前端编程提高之旅(五)----写给大家看的css书

   自实习也有几个月的时间了,以爱奇艺实习为敲门砖,进入了目前这家公司.如果说当初能进爱奇艺是临时突击DIV+CSS的话,目前在这家公司体验到,任何技术都必须悉知原理,这样才能做到庖丁解牛,做一个内行的人.css属性和用法都摆在那里,但如果用得好,除了躬身实践,提高理论积淀就特别必要了,这本<写给大家看的css书>快速扫过一遍之后,之前工作遇到过不清楚的问题,一扫而空,所以有必要总结下.    css层叠的理解    css是层叠样式表的英文缩写,层叠意味着样式从文档结构中一个层次传递到另一

前端编程提高之旅(二)----网站常见特效的jquery实现

最好的编程语言是逻辑,前端各种交互特效的实现多可以用jquery实现,特效可以纷飞,内在逻辑则基本不变.这一篇文章主要介绍jquery实现常见特效背后的逻辑.    1.通过类名获取元素集合    首先来看一个js原生代码不支持的方法,通过类来获取元素集合. document.getElementsByClassName=function(classname){ var retnode = []; var myclass = new RegExp('\\b'+classname+'\\b');/

前端编程提高之旅(三)----浏览器兼容之IE6

在爱奇艺实习期间,乐帝主要负责移动端活动页面的制作,由于移动浏览器是随着智能手机兴起的,这就决定了移动端不会重蹈浏览器兼容问题的覆辙,一开始就比较好的支持web标准,而纵观整个互联网行业,移动web开发还处于起步阶段,在很长一段时间pc端web作为主要的服务形式还会继续.从小来说作为一名前端开发人员,不了解浏览器兼容也会贻笑大方.这篇文章基于<IE7web标准之道>,对浏览器兼容做一个概览.    时间到了2014年,大概很少人会想到IE7发布之后,时隔这么多年IE6仍然占据市场7%的浏览器份

前端编程提高之旅(十六)————jquery中的动画

    上一篇文章对jquery中的事件做了总结,这篇文章主要对jquery中的动画做一下总结归类.最近微信端分享中,有很多页面交互及动画做的非常受欢迎,非常符合移动端体验.看似花哨的动画从本质上都脱离不了编写动画的基本方法.乐帝将jquery动画部分内容,做了一个简单的归类.     如下图:     如上图所示,无论多复杂的动画,从实现上都采用这些最底层的动画方法.本篇将从动画方法和与动画状态有关的方法讲起.    一.动画方法    1.同时改变高.宽.不透明度方法    这里涉及show

前端编程提高之旅(十八)----移动端web流行交互技术方案研究

   在停止实习后,生活最大变化在于没有项目的压力,可以根据兴趣场景,探索技术实现.这个过程对于个人来说,动力自内而外,需求自上而下,都由个人把握.    生活在移动互联网井喷的今天,同时又关注前端技术,平常对微信端流行的交互(或者说玩法)有着特殊的敏感性.如果说之前接触MVC框架还是对单页面网站.CSS3前沿特效有一个概念的话,微信朋友圈及好友分享网页,则把国内网页构建的流行趋势,从幕后推向前台.    乐帝通过研究移动端web流行交互,构建起了一个初步可行的技术方案,用来实现单页面与DOM动

前端编程提高之旅(二)----站点常见特效的jquery实现

最好的编程语言是逻辑,前端各种交互特效的实现多能够用jquery实现.特效能够纷飞.内在逻辑则基本不变.这一篇文章主要介绍jquery实现常见特效背后的逻辑.   1.通过类名获取元素集合    首先来看一个js原生代码不支持的方法.通过类来获取元素集合. document.getElementsByClassName=function(classname){ var retnode = []; var myclass = new RegExp('\\b'+classname+'\\b');//

前端编程提高之旅(十七)----jquery中表单、表格和ajax

从一个框架核心功能层面上说,实现了选择器.DOM操作.事件.动画,功能已经完备了.而任何框架写出了就是应用的,所以这篇涉及的表单与表格知识,虽在DOM操作中有所涉及,但更偏于实际项目中的应用技巧的使用.ajax部分的内容更是前端与后端交互的核心.    一.jQuery中的表单与表格应用    实际项目中,表单和表格分别扮演采集.提交用户输入的信息和显示列表的数据.在HTML中非常重要.下面是这部分知识导图:    1.表单    (1)单行文本框     单行文本框职能是获取用户输入的指定格式

前端编程提高之旅(十三)----jquery选择器

  Jquery代表javascript和query,即对javascript查询操作的类库,jquery是web前端界的事实标准.最近读<锋利的jquery>,发现这本书最大特点是,更深层的讨论一些jquery使用情境和优化方法,对于有一定jquery使用经验的开发者有独特价值.本篇算是乐帝读此书,对选择器和DOM操作加深理解的总结.    javascript自身包含三大弊端: 复杂的文档对象模型(DOM) 不一致的浏览器实现和便捷的开发 调试工具的缺乏    Jquery存在的意义就在于

前端编程提高之旅(十一)----jquery代码的组织

最近做内推项目,虽然项目不算太大,还是遇到了一些代码组织的问题,说到底还是对整个项目的掌控力不够,为此乐帝专门在网络中搜集了一些jquery代码组织的文章并总结出两种方法来更好组织jquery代码.    一.回调函数   回调函数的定义:   A callback is a function that is passed as an argument to another function and is executed after its parent function has comple