【发布时间】:2011-07-15 06:41:50
【问题描述】:
我在一个页面上有大约 400 个元素,这些元素与它们相关联的点击事件(4 种不同类型的按钮,每种有 100 个实例,每种类型的点击事件执行相同的功能但具有不同的参数)。
我需要尽量减少这可能对性能产生的任何影响。通过将单击事件单独绑定到每个事件(使用 JQuery 的bind()),我会受到什么样的性能影响(内存等)?让内联onclick 在每个按钮上调用函数会更有效吗?
编辑澄清:):
我实际上有一个表(使用 JQGrid 生成),每行都有数据列,后跟 4 个图标“按钮”列-删除和其他三个使 AJAX 回调到服务器的业务功能:
我正在使用 JQGrid 的自定义格式化程序 (http://www.trirand.com/jqgridwsiki/doku.php?id=wiki:custom_formatter) 在每一行中构建图标“按钮”(我无法从服务器检索按钮 HTML)。
在我的自定义格式化程序函数中,我可以轻松地构建图标 HTML 并在内联 onclick 中使用适当的参数(来自该行中其他列的数据)调用适当的函数。我使用行列中的数据作为函数的参数。
function removeFormatter(cellvalue, options, rowObject) {
return "<img src='img/favoritesAdd.gif' onclick='remove(\"" + options.rowId + "\")' title='Remove' style='cursor:pointer' />";
}
所以,我可以想到两个选择:
1) 内联 onclick 如上所述
--或者--
2)delegate()(在下面的答案中提到(非常感谢!))
- 使用custom formatter 构建图标图像(每种图标类型都有自己的类名)。
- 在afterInsertRow JQGrid 事件中将图标的
data()设置为其参数。 - 将
delegate()处理程序应用于特定类的按钮(如下@KenRedler 所述)
> $('#container').delegate('.your_buttons','click',function(e){
> e.preventDefault();
> var your_param = $(this).data('something'); // store your params in data, perhaps
> do_something_with( your_param );
> }); //(code snippet via @KenRedler)
我不确定我猜想#2 是多少浏览器密集型选项...但我确实喜欢让 Javascript 远离我的 DOM 元素 :)
【问题讨论】:
-
事件委托是这里唯一合理的解决方案。
标签: jqgrid onclick memory-management jquery