il motivo è semplice: quando tu inserisci dinamicamente del nuovo html nel DOM (la struttura della pagina), anche se questo ha lo stesso id di precedenti elementi, questo nuovo html non eredita la gestione degli eventi precedentemente assegnata, nel nostro caso l'evento "click" su <a id="open">.

Tenendo il tuo codice dovresti, dopo
codice:
$("#opendiv").html("<a id='open'>Apri</a>");
tornare ad assegnare
codice:
$("#open").click(function(e) { ...
come intuirai non ha molto senso nè è comodo. Mi chiedo infatti, perchè devi inserire novamente l'html?? hide e show non eliminano i tag, assegnano la regola css display: none / block.
Che effetto volevi ottenere?