22-讨论
8.5.3 讨论
1.传递额外的参数
trigger() 能够接受一个或者多个值,这些值将传递给所触发的处理程序。
这些值可以是任何类型,任意个数。当有超过一个参数值时,需要用数组包装它们:
jQuery('form').trigger('submit', ['John','Doe', 28, {gender:'M'}]);
上述情况中绑定的函数如下:
jQuery('form').bind('submit', function(e, name, surname, age, extra){
//用这些参数进行某些处理
});
这种方法简单且易于理解。问题是当需要接受许多参数时它看上去很糟糕;我个人认为参数的个数不能超过4~5个。
如果读者习惯于常见的 function(e){} 函数,这种方法也容易造成误导。
你开始觉得奇怪,其他这些参数是从哪里来的?
在编程事件中使用的其他例子:
jQuery('#slideshow').bind('add-image', function(e, src){
var $img = jQuery('<img />').attr('src', src);
jQuery(this).append($img);
});
jQuery('#slideshow').trigger('add-image', 'img/dogs4.jpg');
用在实际事件的例子:
jQuery('#button').bind('click', function(e, submit){
if( submit )
// 进行某些处理
else
// 进行其他的处理
});
jQuery('#button').trigger('click', true);
2.传递自定义事件对象
如果选择传递自定义事件对象,所传递的每个值可以当作处理程序接受的事件对象的属性来访问。
这意味着,无论传递多少数据,处理程序都只有一个参数——事件对象。
这比起第一个方法来已经是个优势,因为它使函数声明不那么冗长。
前面已经提到过,这种方法在jQuery 1.3之后变得更好。下面是使用自定义对象的第一个例子:
jQuery('form').bind('submit', function(e){
//用e.name、e.surname等进行某些操作
});
jQuery('form').trigger({
type:'submit',
name:'John',
surname:'Doe',
age: 28,
gender:'M'
});
传递一个对象实际上是创建一个 jQuery.Event 实例的快捷方式。[3]下面是另一种方法:
var e = jQuery.Event('submit'); // new运算符可以省略
e.name = 'John';
e.surname = 'Doe';
e.age = 28;
e.gender = 'M';
jQuery('form').trigger(e);
当然可以使用 jQuery.extend 代替一次设置一个属性的做法。
如果你计划在调用 trigger() 之后从这个对象中获取数据,就需要自行创建一个事件对象。顺便说一句,这是从处理程序向调用者传递信息的巧妙技术(下一章将介绍这方面的知识)。
3.这与event.data有何区别
使用 event.data 对于函数绑定时可以访问的静态值来说是有用的。当需要传递的数据必须在以后(或者每次)求值时, event.data 就无能为力了。