您可以注意的最大事件是事件及其分配方式。
例如,采用这种情况(因为您尚未提供):
<div id="ajaxResponseTarget"> ...</div><script type="text/javascript"> $(someButton).observe('click', function() { new Ajax.Updater($('ajaxResponseTarget'), someUrl, { onSuccess: function() { $$('#ajaxResponseTarget .someButtonClass').invoke('observe', 'click', function() { ... }); } }); });</script>这将导致内存泄漏,因为在进行
#ajaxResponseTarget更新时(内部,Prototype将使用
innerHTML)带有
click事件的元素将从文档中删除而不会删除其事件。第二次单击
someButton,您将获得两倍的事件处理程序,并且垃圾回收无法删除第一组事件处理程序。
避免这种情况的一种方法是使用事件委托:
<div id="ajaxResponseTarget"> ...</div><script type="text/javascript"> $('ajaxResponseTarget').observe('click', function(e) { if(e.element().match('.someButtonClass')) { ... } }); $(someButton).observe('click', function() { new Ajax.Updater($('ajaxResponseTarget'), someUrl); });</script>由于DOM事件的工作方式,
.someButtonClass也会在上触发“ click”
#ajaxResponseTarget,并且Prototype使确定事件目标的元素变得非常简单。没有事件被分配到元素 之内
#ajaxResponseTarget,所以也没有办法为内目标替换它的内容,以孤儿的活动。



