扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
delegate()函数用于为指定元素的一个或多个事件绑定事件处理函数。
夏县网站建设公司成都创新互联,夏县网站设计制作,有大型网站制作公司丰富经验。已为夏县上千提供企业网站建设服务。企业网站搭建\成都外贸网站建设要多少钱,请找那个售后服务好的夏县做网站的公司定做!
此外,你还可以额外传递给事件处理函数一些所需的数据。
即使是执行delegate()函数之后新添加的元素,只要它符合条件,绑定的事件处理函数仍然对其有效。
此外,该函数可以为同一元素、同一事件类型绑定多个事件处理函数。触发事件时,jQuery会按照绑定的先后顺序依次执行绑定的事件处理函数。
要删除通过delegate()绑定的事件,请使用undelegate()函数。
从jQuery 1.7开始,请优先使用事件函数on()替代该函数。
该函数属于jQuery对象(实例)。
语法
jQuery 1.4.2 新增该函数。其主要有以下两种形式的用法:
用法一:
jQueryObject.delegate( selector , events [, data ], handler )
用法二:jQuery 1.4.3 新增支持该用法。
jQueryObject.delegate( selector, eventsMap )
参数
参数
描述
selector
String类型一个jQuery选择器,用于指定哪些后代元素可以触发绑定的事件。如果该参数为null或被省略,则表示当前元素自身绑定事件(实际触发者也可能是后代元素,只要事件流能到达当前元素即可)。
events
String类型一个或多个用空格分隔的事件类型和可选的命名空间,例如"click"、"focus click"、"keydown.myPlugin"。
data
可选/任意类型触发事件时,需要通过event.data传递给事件处理函数的任意数据。
handler
Functidelegate类型指定的事件处理函数。
eventsMap
Object类型一个Object对象,其每个属性对应事件类型和可选的命名空间(参数events),属性值对应绑定的事件处理函数(参数handler)。
关于参数events中可选的命名空间,请参考最下面的示例代码。
关于参数selector,你可以简单地理解为:如果该参数等于null或被省略,则为当前匹配元素绑定事件;否则就是为当前匹配元素的后代元素中符合selector选择器的元素绑定事件。
参数handler中的this指向当前匹配元素的后代元素中触发该事件的DOM元素。如果参数selector等于null或被省略,则this指向当前匹配元素(也就是该元素)。
delegate()还会为handler传入一个参数:表示当前事件的Event对象。
参数handler的返回值与DOM原生事件的处理函数返回值作用一致。例如"submit"(表单提交)事件的事件处理函数返回false,可以阻止表单的提交。
如果事件处理函数handler仅仅只用于返回false值,可以直接将handler设为false。
返回值
delegate()函数的返回值为jQuery类型,返回当前jQuery对象本身。
重要说明:delegate()函数并不是为当前jQuery对象匹配的元素绑定事件处理函数,而是为它们的后
代元素中符合选择器selector参数的元素绑定事件处理函数。delegate()函数并不是直接为这些后代元素挨个绑定事件,而是"委托"给当前
jQuery对象的匹配元素来处理。由于DOM
2级的事件流机制,当后代元素selector触发事件时,该事件会在事件冒泡中传递给其所有的祖辈元素,当事件流传递到当前匹配元素时,jQuery会
判断是哪个后代元素触发了事件,如果该元素符合选择器selector,jQuery就会捕获该事件,从而执行绑定的事件处理函数。
示例说明
以点击事件("click")为例,以下是jQuery中事件函数的常规用法(某些函数也存在其它形式的用法,此处暂不列出):
// 这里的选择器selector用于指定可以触发事件的元素
// 这里的选择器ancestor应是selector的祖辈元素,selector触发的事件可以被其祖辈元素在事件流中捕获,从而以"代理"的形式触发事件。
// jQuery 1.0+ (1.4.3+支持参数data)
$("selector").click( [ data ,] handler );
// jQuery 1.0+ (1.4.3+支持参数data)
$("selector").bind( "click" [, data ], handler );
// jQuery 1.3+ (1.4+支持参数data)
$("selector").live( "click" [, data ], handler );
// jQuery 1.4.2+
$("ancestor").delegate( "selector", "click" [, data ], handler );
// jQuery 1.7+
$("ancestor").on( "click", "selector" [, data ], handler );
请参考下面这段初始HTML代码:
div id="n1"
p id="n2"spanCodePlayer/span/p
p id="n3"span专注于编程开发技术分享/span/p
em id="n4";/em
/div
p id="n5"Google/p
我们为div中的所有p元素绑定点击事件:
// 为div中的所有p元素绑定click事件处理程序
// 只有n2、n3可以触发该事件
$("div").delegate("p", "click", function(){
// 这里的this指向触发点击事件的p元素(Element)
alert( $(this).text() );
});
运行代码(其他代码请自行复制到演示页面运行)
如果要绑定所有的p元素,你可以编写如下jQuery代码:
//为所有p元素绑定click事件处理程序(body内的所有p元素,就包含所有的p元素)
//n2、n3、n5均可触发该事件
$("body").delegate("p", "click", function(event){
// 这里的this指向触发点击事件的p元素(Element)
alert( $(this).text() );
});
此外,我们还可以同时绑定多个事件,并为事件处理函数传递一些附加的数据,我们可以通过jQuery为事件处理函数传入的参数event(Event事件对象)来进行处理:
var data = { id: 5, name: "李四" };
//为n5绑定mouseenter mouseleave两个事件,并为其传入附加数据data
//附加数据可以是任意类型
$("body").delegate("#n5", "mouseenter mouseleave", data, function(event){
var $me = $(this);
var options = event.data; // 这就是传入的附加数据
if( event.type == "mouseenter"){
$me.html( "你好," + options.name + "!");
}else if(event.type == "mouseleave" ){
$me.html( "再见," + options.name + "!");
}
} );
此外,即使符合条件的元素是delegate()函数执行后新添加,绑定事件对其依然有效。同样以初始HTML代码为例,我们可以编写如下jQuery代码:
//为div中的所有p元素绑定click事件处理程序
//只有n2、n3可以触发该事件
$("div").delegate("p", "click", function(event){
alert( $(this).text() );
});
//后添加的n6也可以触发上述click事件,因为它也是div中的p元素
$("#n1").append('p id="n6"上述绑定的click事件对此元素也生效!/p');
参数events还支持为事件类型附加额外的命名空间。当为同一元素绑定多个相同类型的事件处理函数时。使用命名空间,可以在触发事件、移除事件时限定触发或移除的范围。
function clickHandler(event){
alert( "触发时的命名空间:[" + event.namespace + "]");
}
var $p = $("p");
// A:为所有p元素绑定click事件,定义在foo和bar两个命名空间下
$("body").delegate( "p", "click.foo.bar", clickHandler );
// B:为所有p元素绑定click事件,定义在test命名空间下
$("body").delegate( "p", "click.test", clickHandler );
var $n2 = $("#n2");
// 触发所有click事件
$n2.trigger("click"); // 触发A和B (event.namespace = "")
// 触发定义在foo命名空间下的click事件
$n2.trigger("click.foo"); // 触发A (event.namespace = "foo")
// 触发定义在bar命名空间下的click事件
$n2.trigger("click.bar"); // 触发A (event.namespace = "bar")
// 触发同时定义在foo和bar两个命名空间下的click事件
$n2.trigger("click.foo.bar"); // 触发A (event.namespace = "bar.foo")
// 触发定义在test命名空间下的click事件
$n2.trigger("click.test"); // 触发B (event.namespace = "test")
// 移除所有p元素定义在foo命名空间下的click事件处理函数
$p.undelegate( "click.foo" ); // 移除A
delegate()函数的参数eventsMap是一个对象,可以"属性-值"的方式指定多个"事件类型-处理函数"。对应的示例代码如下:
var events = {
"mouseenter": function(event){
$(this).html( "你好!");
},
"mouseleave": function(event){
$(this).html( "再见!");
}
};
//为n5绑定mouseenter mouseleave两个事件,并为其传入附加数据data
$("body").delegate("#n5", events);
在编程的世界里,Java一直是企业级别开发最喜欢选择的编程语言,从java目前的就业形势来看还是相当不错的,由于手机安卓开发的需要,许多人也开始转战Java的学习,极客营觉得虽然java开发人员的需求量变得越来越大,但这并不代表做java开发人员的技术就可以一成不变,java技术更新的很快,而且在现在中国的培训机构里java学员都是批量生产的,那么竞争压力也是很大的。所以许多人在学好java的基础后,转战到火热的安卓开发。极客营今天来分析一下java各种大致学习路线。\x0d\x0a\x0d\x0a首先总结一下做java最后大致是两个方向:web企业级开发(JavaWeb J2EE)和手机android开发。这两个方向的先决条件是J2SE,J2SE并不是那么简单,只有当你逐渐学的深入了你才体会到java的精髓。\x0d\x0a\x0d\x0a1.HTML+CSS+DIV,前端会用到,作为研发人员至少应该会简单写些页面出来,这是许多编程语言都需要了解的基础。\x0d\x0a\x0d\x0a2.JAVASCRIPT,想要使用一些特殊的效果就需要这个了,但是你并不需要很精通,当你需要用到JS的地方可以用Jquery代理,Jquery很好学,很有用的JS框架,看似复杂华丽的效果他都能轻松完成。\x0d\x0a\x0d\x0a3.Ajax,前端异步交互技术,值得去研究\x0d\x0a\x0d\x0a4.JSP,Servlet,Javabean,发展至今已经不提倡在JSP里嵌入JAVA代码,所以仅仅是作为视图层使用,嵌入些如JSTL和Struts2标签库的标签成为动态页面。Servlet是应该重点学习的,包括如过滤器、监听器等,这些都是当下Struts2或者未来WEB框架的底层基础和原理。\x0d\x0a\x0d\x0a5.Strut2+Hibernate(or JPA)+Spring,当下十分流行的开发框架。其实是很容易上手的,但关键是需要懂得原理。\x0d\x0a\x0d\x0a6.Web Service技术,它能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。
H5edu教育Html5为您解答:
1.事件代理的原理和意义
实现原理是利用了浏览器的事件冒泡和事件源(target)。
在js中事件会冒泡到父级节点,所以我们可以在父级节点进行事件代理。例如一个使用jQuery的函数:
$("#tab td").click(function(){
$(this).css("background","red");
}) ;
上面的函数给一个tab的td加了一个单击事件,但是如果表格1000行,就得绑定1000次,
$("#tab").bind("click",function(ev)){
var $obj=$(ev.target);
$obj.css("background","red");
}
以上用bind函数将click绑定到了tab上,从而实现事件代理。
2.jQuery中的绑定函数
(1).bind()为每个匹配元素的特定事件绑定事件处理函数
$("#niu").bind('click',function(){
alert("hello niuniu");
});
此代码把id为niu的元素响应事件click,并显示警报。使用bind绑定多个事件时,可以这样
$("#niu").bind('mouseenter mouseleava',function(){
$(this).css("background","yellow");
});
$("#foo").bind({
click:function(){
},
mouseenter:function(){
}
});
(2).delegate()指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数
$("table").delegate("td","click",function(){
$(this).toggleClass("chosen");
});
(3).on在选择元素上绑定一个或多个事件的事件处理函数
function greet(event) { alert("Hello"+event.data.name); }
$("button").on("click", { name: "Karl" }, greet);
$("button").on("click", { name: "Addy" }, greet);
(4).live给所有匹配的元素附加一个事件处理函数,即使这个元素是以后再添加进来的
$("a").live("click", function() { return false; })
以上是常用的绑定函数。
技术文档引用:
自从.live()方法处理事件一旦传播到文档的顶部,live事件是不可能停止传播的。同样地,.delegate() 事件将始终传播给其中包含的被委托元素;同时,任何在 DOM 树中,比这些元素低的元素上绑定的相同事件,在 .delegate() 事件被调用的时候,也会被触发。因此,如果要在事件中阻止委托事件被触发,可以调用event.stopPropagation()或者返回false防止委派处理程序冒泡。
简单来说,.bind()是直接绑定在元素上,而.live()和.delegate()则是通过冒泡的方式来绑定到元素上的。.bind()方法只能给当前存在的元素绑定事件,对于事后采用JS方式新生成的元素无效,而live方法可以对后生成的元素也可以绑定相应的事件。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流