jQuery学习笔记9:高级事件

1    模拟操作

1.1    .trigger()方法

   $(‘input‘).click(function () {
       alert(‘我将要使用模拟用户操作来触发!‘);
   });        
   //模拟用户点击操作
   $(‘input‘).trigger(‘click‘);
等效于    
   $(‘input‘).click(function () {
       alert(‘我将要使用模拟用户操作来触发!‘);
   }).trigger(‘click‘);


    //trigger额外数据,只有一条的时候,可以省略中括号,多条不能省略,否则第二条之后就无法识别了。    
   $(‘input‘).click(function (e, data1, data2, data3, data4) {
       alert(data1 + ‘|‘ + data2 + ‘|‘ + data3[1] + ‘|‘ + data4.user);
   }).trigger(‘click‘, [‘123‘, ‘abc‘, [‘a‘, ‘b‘ , ‘c‘], {user : ‘Lee‘}]);    

   $(‘input‘).bind(‘click‘, {user : ‘Lee‘} ,function (e, data1, data2, data3, data4) {
       alert(data1 + ‘|‘ + data2 + ‘|‘ + data3[1] + ‘|‘ + data4.user + ‘|‘ + e.data.user);
   }).trigger(‘click‘, [‘123‘, ‘abc‘, [‘a‘, ‘b‘ , ‘c‘], {user : ‘Lee‘}]);    


   //click,mouseover这些是系统事件,自定义事件就是自己起名字的事件
   $(‘input‘).bind(‘myEvent‘, function () {
       alert(‘自定义事件!‘);
   }).trigger(‘myEvent‘);


   .trigger()方法提供了简写方案,只要想让某个事件执行模拟用户行为,直接再调用一个空的同名事件即可。

   $(‘input‘).click(function () {
       alert(‘我将要使用模拟用户操作来触发!‘);
   }).click();

1.2    .triggerHandler()方法

(1) .triggerHandler()方法并不会触发事件的默认行为,而.trigger()会。

   //trigger提交后跳转,没有阻止默认行为
   $(‘form‘).trigger(‘submit‘);
   //trigger提交后没有跳转,默认行为被阻止了
   $(‘form‘).triggerHandler(‘submit‘);


   //如果我们希望使用.trigger()来模拟用户提交,并且阻止事件的默认行为,则需要这么写
   $(‘form‘).submit(function (e) {
   e.preventDefault(); //阻止默认行为
   }).trigger(‘submit‘);


(2) .triggerHandler()方法只会影响第一个匹配到的元素,而.trigger()会影响所有。

(3).triggerHandler()方法会返回当前事件执行的返回值,如果没有返回值,则返回undefined;而.trigger()则返回当前包含事件触发元素的jQuery 对象(方便链式连缀调用)。

   $(‘input‘).click(function () {
       alert(‘我将要使用模拟用户操作来触发!‘);
   }).trigger(‘click‘).css(‘color‘, ‘red‘);                    //返回jQuery对象,可以连缀

   $(‘input‘).click(function () {
       alert(‘我将要使用模拟用户操作来触发!‘);
       return 123;
   }).triggerHandler(‘click‘);        //返回123

(4).trigger()在创建事件的时候,会冒泡。但这种冒泡是自定义事件才能体现出来,是jQuery 扩展于DOM 的机制,并非DOM 特性。而.triggerHandler()不会冒泡。

   $(‘div‘).bind(‘myEvent‘, function () {
       alert(‘自定义事件!‘);
   })    
   $(‘.d3‘).trigger(‘myEvent‘);                        //会冒泡    
   $(‘.d3‘).triggerHandler(‘myEvent‘);           //不会冒泡


2    命名空间

   $(‘input‘).bind(‘click.abc‘, function () {
       alert(‘abc‘);
   });

   $(‘input‘).bind(‘click.xyz‘, function () {
       alert(‘xyz‘);
   });    
   $(‘input‘).bind(‘mouseover.abc‘, function () {
       alert(‘abc‘);
   });    
   $(‘input‘).unbind(‘click.abc‘);  //移除click 事件中命名空间为abc的
   $(‘input‘).unbind(‘.abc‘);       //移除命名空间为abc的所有事件
   //对于模拟操作.trigger()和.triggerHandler(),用法也是一样的。
   $(‘input‘).trigger(‘click.abc‘);


3    事件委托与事件绑定

   在jQuery 中,我们通过事件冒泡的特性,让子元素绑定的事件冒泡到父元素(或祖先元素)上,然后再进行相关处理即可。

   使用.live()具备动态绑定功能,jQuery1.3 使用,jQuery1.7 之后废弃,jQuery1.9 删除。由于.live()和.die()在jQuery1.4.3版本中废弃了,之后推出语义清晰、减少冒泡传播层次、又支持链接连缀调用方式的方法:.delegate()和.undelegate()。但这个方法在jQuery1.7 版本中被.on()方法整合替代了。

     普通绑定.bind,普通解绑.unbind;事件委托.live .delegate,解除委托.die .undelegate。新方法绑定.on,新方法解绑.off。从jQuery1.7 以后推出了.on()和.off()方法实现事件委托。

   //替代.bind()方式
   $(‘.button‘).on(‘click‘, function () {
       alert(‘替代bind‘);
   });
   //替代.bind()方式,并使用额外数据和事件对象
   $(‘.button‘).on(‘click‘, {user : ‘Lee‘}, function (e) {
       alert(‘替代bind‘ + e.data.user);
   });
   //替代.bind()方式,并绑定多个事件
   $(‘.button‘).on(‘mouseover mouseout‘, function (e) {
       alert(‘移入移出‘);
   });
   //替代.bind()方式,以对象模式绑定多个事件
   $(‘.button‘).on({
       mouseover : function () {
           alert(‘移入‘);
       },
       mouseout : function () {
           alert(‘移出‘);
       }
   });
   //替代.bind()方式,阻止默认行为并取消冒泡
   $(‘form‘).on(‘submit‘, function () {
       return false;
   });

   $(‘form‘).on(‘submit‘, false);



   $(‘.button‘).on(‘click‘, function () {
       alert(‘替代bind‘);
   });
   $(‘.button‘).off(‘click‘);


   //替代.bind()方式,阻止默认行为
   $(‘form‘).on(‘submit‘, function (e) {
       e.preventDefault();
   });
   //替代.bind()方式,取消冒泡
   $(‘form‘).on(‘submit‘, function (e) {
       e.stopPropagation();
   });
   //替代.unbind()方式,移除事件
   $(‘.button‘).off(‘click‘);
   $(‘.button‘).off(‘click‘, fn);
   $(‘.button‘).off(‘click.abc‘);


   //替代.live .delegate
   $(‘#box‘).on(‘click‘, ‘.button‘, function () {
       $(this).clone().appendTo(‘#box‘);
   });

   //移出事件委托
   $(‘#box‘).off(‘click‘, ‘.button‘);


   jQuery 提供了.one()方法,绑定元素执行完毕后自动移除事件,可以方法仅触发一次的事件。
   //类似于.bind()只触发一次
   $(‘.button‘).one(‘click‘, function () {
       alert(‘one 仅触发一次!‘);
   });
   //类似于.delegate()只触发一次
   $(‘#box).one(‘click‘, ‘click‘, function () {
       alert(‘one 仅触发一次!‘);
   });






本文出自 “IT技术学习与交流” 博客,谢绝转载!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。