конкретно этот косяк можно пофиксить вот так:
<html>
<head>
<style>
</style>
</head>
<body>
<div id="id1" onclick="Function1()">Click on me</div>
<script>
id1.outerHTML = id1.outerHTML.replace('onclick="Function1()"', 'onclick="Function2()"');
alert(id1.outerHTML);
function Function1(){
alert('Function1 is executed!');
}
function Function2(){
alert('Function2 is executed!');
}
</script>
</body>
</html>
Просто убрав строку с getElementById (она там особо не нужна, так как эл-ты с id и так доступны по именам переменных), но, в общем случае, конечно, это не сработает. Надо, избегать, короче, этого дерьма, по возможности.