Your problem is the features .animate()you use in snake.screenUpdate(). For example, if you change them to .css(), you will see new items right in place. This, of course, would ruin the smooth movement of the rest of the snake, so you might want to treat things differently, for example:
for (i in this.body) {
offset = 3 + parseInt(i);
currentNode = $('#box :nth-child(' + offset + ')');
if (currentNode.size() == 0) {
$('#box').append($('<div class="snakeItem"></div>'));
currentNode = $('#box :nth-child(' + offset + ')');
currentNode.css({top: $('#head').height() * this.body[i].position.y + "px"}, duration / 3);
currentNode.css({left: $('#head').width() * this.body[i].position.x + "px"}, duration / 3);
} else {
currentNode.animate({top: $('#head').height() * this.body[i].position.y + "px"}, duration / 3);
currentNode.animate({left: $('#head').width() * this.body[i].position.x + "px"}, duration / 3);
}
}
This should work if I understood your violin correctly.