$.on()方法是jquery1.7之后的一个超级方法,将事件绑定和事件委托整合到一个函数中去,支持绑定多个事件,并且可以绑定自定义事件。使用起来很方便。
事件委托
首先说一下事件委托。假如有100个<li>元素需要绑定一个click事件,通常的做法是:
$('li').click(eventHandler);
function eventHandler(event){
alert(event.target.innerHtml);
}
但是这样做有两个缺点:
- 每个元素绑定了相同的事件,进行了大量的重复操作。
- 当向ul中加入新的元素时,需要再次为这个新元素绑定上述事件。
使用事件委托就可以解决这个问题。
首先把事件绑定在子元素的父节点上,当点击子元素时,click事件会冒泡到父元素上,在父元素的eventHandler中,通过检测event.target来对触发该事件的子元素进行操作。用原生js实现事件委托的代码如下:
var $=function(id){
return document.getElementById(id);
};
var eventHandler=function(event){
var event = event? event: window.event
var target = event.srcElement ? event.srcElement:event.target;
do(target);
}
$('#ul').addEventListener('click',eventHandler);
在jquery的on方法中实现事件委托就更简单了,on方法可以接受三个参数:
第一个参数是事件名,可以只绑定一个事件,如on('click'),也可以绑定多个事件,如on('click dbclick mouseover')等
$('ul').on('click mouseover',eventHandler);//绑定多个事件
第二个参数是可选参数,接受一个selector,当事件触发元素符合selector时,会调用事件处理函数。
$('ul').on('click mouseover','li',eventHandler);//触发元素是li时执行eventandler
$('ul').on('click mouseover','li:even',eventHandler);//触发元素是li时,而且元素是第单数个时执行eventandler
第三个参数是事件处理函数。
自定义事件
on()方法可以绑定自定义事件,并通过trigger()来触发。所谓自定义事件,就是区别于标准事件的,在事件名称上,可以自己指定事件名。在触发动作上,则需要检测某个状态,并通过trigger来触发。
打个比方:到了晚上,当人进到屋子里会触发开灯事件,这里'turnOn'就是事件名,检测状态则是:人是否进入房子里。伪代码如下:
house.on('turnOn',turnOnLight);//为屋子绑定开灯事件
if(man in house){//检测人是否进入房间
house.trigger('turnOn');//触发开灯事件
}
这里用到自定义事件,和简单的拖拽功能。
html:(省略body和script等标签)
<div id='man'></div>
<div id=house>
<div id='light'></div>
</div>
css:
body{
width:100%;
overflow:hidden;
}
div{
background:red;
}
#man{
color:white;
position:absolute;
width:20%;
height:20%;
background-color:#ccc;
background-image:url('//pic.cnblogs.com/avatar/1016471/20161030122848.png');
background-size:contain;
background-repeat:no-repeat;
}
#house{
float:right;
width:300px;
height:300px;
background-color:black;
font-size:30px;
transition:background 0.3s ease-in-out; }
#light{
margin:0 auto;
width:20px;
height:20px;
border-radius:50%;
background-color:white;
display:none;
box-shadow:#fff 0px 0px 20px;
}
js:
var house=$('#house'),
man=$('#man'),
light=$('#light'),
turnOn=false;//表示开关状态,初始为false house.on('turnOn',function(){
if(turnOn){//如果开灯了则返回,防止重复触发事件
return true;
}
light.show('slow');
$(this).css('background-color','#529');
});
house.on('turnOff',function(){
if(!turnOn){//如果没开则返回,防止重复触发事件
return true;
}
light.hide();
$(this).css('background-color','black');
});
man.on('mousedown',function(event){
$(this).on('mousemove',mouseMove);
});
man.on('mouseup',function(event){
$(this).off('mousemove',mouseMove);
}); var mouseMove=function(event){
event.preventDefault();
var x=event.pageX,y=event.pageY,$this= $(this);
$this.css({left:(x-40)+'px',top:(y-40)+'px'});
if($this.offset().left+$this.width()>house.offset().left){
house.trigger('turnOn');//如果人进去,则触发开灯事件
turnOn=true;//将开关状态重置为true
}
if($this.offset().left+$this.width()<house.offset().left
&& turnOn){
house.trigger('turnOff');
turnOn=false;
}
};
jquery.on()超级方法的更多相关文章
-
jquery 通过submit()方法 提交表单示例
jquery 通过submit()方法 提交表单示例: 本示例:以用户注册作为例子.使用jquery中的submit()方法实现表单提交. 注:本示例仅提供了对表单的验证,本例只用选用了三个字段作为测 ...
-
重写jquery的ajax方法
//首先备份下jquery的ajax方法 var _ajax=$.ajax; //重写jquery的ajax方法 $.ajax=function(opt){ //备份opt中error和success ...
-
jQuery的extend方法
jq中的extend在面试中经常会被问道,今天我总结一个下有关于extend的用法三种进行对比,可能不全,希望大家指点, 用法一: $.extend({}) ,为jQuery类添加方法,可以理解为扩 ...
-
jQuery中eq()方法用法实例
本文实例讲述了jQuery中eq()方法用法.分享给大家供大家参考.具体分析如下: 此方法能够获取匹配元素集上的相应位置索引的元素. 匹配元素集上元素的位置索引是从0开始的. 语法结构: 复制代码 代 ...
-
HTML 5 的自定义 data-* 属性和jquery的data()方法的使用
人们总喜欢往HTML标签上添加自定义属性来存储和操作数据.但这样做的问题是,你不知道将来会不会有其它脚本把你的自定义属性给重置掉,此外,你这样做也会导致html语法上不符合Html规范,以及一些其它副 ...
-
深度理解Jquery 中 offset() 方法
参考原文:深度理解Jquery 中 offset() 方法
-
[转]jQuery的each方法的几种常用的用法
下面提一下jQuery的each方法的几种常用的用法 复制代码 代码如下: var arr = [ "one", "two", "three&quo ...
-
jquery中$.ajax方法提交表单
function postdata(){ //提交数据函数 $.ajax({ //调用jqu ...
-
JS,JQuery的扩展方法
转 http://blog.csdn.net/tuwen/article/details/11464693 //JS的扩展方法: 1 定义类静态方法扩展 2 定义类对象方法扩展 ...
随机推荐
-
TCP学习之三:客户端、服务端同步传输字符串
参考学习张子阳大神的博客:http://www.cnblogs.com/JimmyZhang/category/101698.html 一个客户端.发送一条消息 客户端: 服务端: 注意:Networ ...
-
[转]九个Console命令,让js调试更简单
转自:九个Console命令,让js调试更简单 一.显示信息的命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!DOCTYPE html> <html ...
-
struts工程建立配置细节
ActionForm ActionForm是用于存放表单提交的数据. 1.一个action是否必须配置一个actionForm,可以没有2.一个action是否可以配置多个表单?不可以,最多一个 在j ...
-
SSO系统的分析与架构
随着公司子系统越来越多,一直以来使用ucenter的同步登录方式的性能以及效率问题显得越来越大,重新构建一个SSO系统显得势在必行. 通过google搜索关于SSO单点登录文章,发现以下文章关于新浪微 ...
-
scala多个构造函数的定义方法
直接上代码: package com.test.scalaw.test.demo /** * scala定义多个构造函数, * 另外,Scala中有只有一个主要构造函数,其他都是辅助构造函数.而且需要 ...
-
Node.js权威指南 (7) - 实现基于TCP与UDP的数据通信
7.1 使用net模块实现基于TCP的数据通信 / 136 7.1.1 创建TCP服务器 / 136 7.1.2 socket端口对象 / 142 7.1.3 创建TCP客户端 / 151 7.1.4 ...
-
Dockerfile指令总结
指令的一般格式为INSTRUCTION arguments,指令包含FROM.MAINTAINER.RUN等. FROM 格式为FROM <image>或FROM <image> ...
-
vim美化基本配置
在home目录中创建一个 .vimrc文件 vim ~/.vimrc 文件基本配置 " 设置当文件被改动时自动载入 set autoread " quickfix模式 autocm ...
-
laravel+阿里大于实现发送验证码短信
一.短信服务使用阿里大于提供的短信接口 阿里大于官方网站上的接入流程: 在阿里大于申请接口后,需要做以下操作: 申请签名 申请短信模板 创建Accesskey,可以通过权限最大的Accesskey创建 ...
-
Oracle 与 mysql 建立透明网关
1.1.1. 文档编写目的 项目上需要做与Mysql数据库的对接,然而Oracle与Mysql数据库是异构的,因此这里采用透明网关的方式来解决. 另,项目上的环境为APP:12.2.6 ; DB: ...