09-解决方案
9.2.2 解决方案
可能的解决方案之一是让一个或者多个全局对象担当事件处理程序的角色。这些元素可以是DOM元素,也可以不是。所有全局事件将在这些元素中的一个上绑定和触发。
你不用这么做:
jQuery('#text1').bind('change-page', function(e, title){
jQuery(this).text( 'Page is ' + title );
});
jQuery('#text2').bind('change-page', function(e, title){
jQuery(this).text( 'At ' + title + ' Page' );
});
jQuery.trigger('change-page', 'Inbox');
而代之以:
jQuery.page = jQuery({}); //只是一个空对象
jQuery.page.bind('change', function(e, title){
jQuery('#text1').text( 'Page is ' + title );
});
jQuery.page.bind('change', function(e, title){
jQuery('#text2').text( 'At ' + title + ' Page' );
});
jQuery.page.trigger('change', 'Inbox');
语法上似乎很相似,但是对 trigger
的每次调用不需要列举jQuery的数据注册表(也就是 jQuery.cache
)。
即使你决定使用一个DOM元素,原理也相同。DOM元素有时候更合适。例如,如果要创建一个与表格相关的插件,那么将每个 <table>
元素作为事件处理程序就很有意义。
DOM元素的问题是在许多浏览器中它们是内存泄漏的主要根源。内存泄漏发生在用户离开页面而JavaScript引擎无法释放某些RAM内存时。
当使用DOM元素时,应该注意在这些对象中保存数据的方式。这也就是jQuery提供 date()
方法的原因。
在大部分情况下,我个人仍然使用常规的JavaScript对象。可以为它们添加属性和函数,而且内存泄漏的可能性(和严重性)比较小。