removeChild со странным поведением слушателя событий - PullRequest
0 голосов
/ 29 февраля 2020

Вот пример кода.

<html>
  <head>
    <script>
      class Test {
        constructor(elem) {
          this.elem = elem;
        }
      }

      window.onload = function() {
        const btn = document.getElementById('btn');
        const testListener = function() {
          const newBtn = document.createElement('button');
          newBtn.innerText = 'newButton';
          newBtn.rock = new Test(newBtn);
          const listener = function eventListener(e) {};
          newBtn.addEventListener('click', listener);
          document.body.appendChild(newBtn);
          setTimeout(function() {
            document.body.removeChild(newBtn);
          }, 5000);
        };
        btn.addEventListener('click', testListener);
      };
    </script>
  </head>
  <body>
    <button id="btn">Test</button>
  </body>
</html>

Logi c is,

  1. Нажмите кнопку Test, динамически создайте новую кнопку с пустой слушатель событий. Также для упрощения отладки снимка памяти добавьте свойство с новым Test object.
  2. Также запустите setTimeout с задержкой в ​​5 секунд, чтобы удалить только что созданную кнопку.

Странное поведение таково:

  1. Если вы не нажмете только что созданную кнопку, через 5 секунд сделайте снимок памяти, вы не найдете ни одного объекта Test.
  2. Если вы нажмете только что созданную кнопку в течение 5 секунд, сделаете снимок памяти, вы найдете объект Test, все еще находящийся в памяти, который сохраняется вновь созданным элементом кнопки, а кнопка - некоторым объектом InternalNode , Что будет утечка памяти.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...