您可以注意的最重要的事情是事件,以及您如何分配它们。
例如,采取这种情况(因为您没有提供一个):
<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 事件的工作方式,“click” on.someButtonClass
也会触发 on #ajaxResponseTarget
,并且 Prototype 使得确定哪个元素是事件的目标变得非常简单。没有事件分配给内 #ajaxResponseTarget
的元素,因此无法将其内容替换为内目标的孤立事件。