Почему даже обработчики динамически вставленных объектов не срабатывают, даже если они существовали до запуска javascript?

Я работаю над клиентским приложением. Последние два дня я работал без перерыва, пытаясь понять, что происходит. Мой код слишком длинный, чтобы публиковать его там, где я могу объяснить, в чем моя проблема, я сузил проблему до следующего сценария/вопроса. Вот что у меня есть:

<html>
    <head>
    </head>
    <body>
        <a href="#" id="hyper">Link</a>
    </body>
</body>
</html>
<script type="text/javascript">
    document.getElementById("hyper").onclick = function(){alert("Link clicked!");};
    document.body.innerHTML = document.body.innerHTML;
</script>

Этот код отлично работает без document.body.innerHTML = document.body.innerHTML;.

Почему обработчик событий не срабатывает после body.innerHTML = body.innerHTML;, несмотря на то, что объект, object.id остаются прежними и загружаются до javascript?
Я просмотрел динамическую модель DOM, и все то же самое.


person Babiker    schedule 18.11.2010    source источник


Ответы (2)


Когда вы переназначаете body.innerHTML, даже если он сам, innerHTML изменяется и DOM сбрасывается. Это означает, что a#hyper был создан заново, а его onclick был уничтожен.

Идентификация с самоназначением (примечание: указано как Haskeller) может не существовать с геттерами и сеттерами.\

person Ming-Tang    schedule 18.11.2010

Здесь есть отличный ответ - в основном DOM регенерируется, когда Javascript повторно вставляет строку HTML. Сгенерированный DOM может выглядеть так же, но все программные ссылки в Javascript были установлены на новые адреса.

Решение для хранения обработчиков событий и методов находится здесь:

javascript cloneNode и свойства

person Ben    schedule 18.11.2010
comment
Спасибо, Стив. Я прочитал другие сообщения и понял, что хотя источник тот же, но объект, для которого был установлен обработчик события, уничтожен. Но мне не удалось попытаться имитировать решение в моем сценарии. Можете ли вы написать фрагмент того, как это будет на моем примере? - person Babiker; 18.11.2010