Самое большое, на что вы можете обратить внимание - это события и то, как вы их назначаете.
Например, возьмите этот сценарий (поскольку вы его не предоставили):
<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
будет срабатывать также на #ajaxResponseTarget
, а Prototype упрощает определение того, какой элемент был целью события. Элементам в #ajaxResponseTarget
не присваиваются события, поэтому невозможно заменить его содержимое потерянными событиями из целей в пределах.