Вы ожидаете, что перемещение onComplete выполнится после завершения первого перемещения. Это вряд ли произойдет, потому что Move и Ajax.Updater являются асинхронными. Решение состоит в том, чтобы перейти к абсолютным движениям и отменить исходное движение, прежде чем второе вступит в конфликт с ним.
$('content').store('originalOffset', $('content').cumulativeOffset());
new PeriodicalExecuter(function() {
$('content').store(
'move',
new Effect.Move('content', {
x:$('content').retrieve('originalOffset').left,
y:$('content').retrieve('originalOffset').top + 15,
duration:1,
mode: 'absolute'
})
);
new Ajax.Updater('content','/getcontent', {
asynchronous:true,
evalScripts:true,
onCreate: function() {
$('content').retrieve('move').cancel();
},
onComplete:function(request, json) {
new Effect.Move(
'content', {
x:$('content').retrieve('originalOffset').left,
y:$('content').retrieve('originalOffset').top,
duration:1,
mode: 'absolute'
}
);
},
insertion:Insertion.Top,
requestHeaders:['X-Update', 'content']
})
}, 5);