Защо дори манипулаторите на динамично вмъкнати обекти не се задействат, дори ако са съществували преди стартирането на javascript?

Работя върху клиентско приложение. Работя без прекъсване през последните два дни, опитвайки се да разбера какво се случва. Кодът ми е твърде дълъг, за да го публикувам там, където мога да обясня какъв е проблемът ми, стесних къде е проблемът до следния сценарий/въпрос. Ето какво имам:

<html>
    <head>
    </head>
    <body>
        <a href="/bg#" 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