Слушатели события JavaScript должны быть удалены до удаления элемента, к которому они присоединены?

Если массив не отсортирован, нет действительно лучшего пути (кроме использования вышеупомянутого indexOf, который я думаю суммы к тому же самому). Если массив отсортирован, можно сделать двоичный поиск, который работает как это:

  1. Выбор средний элемент массива.
  2. элемент, который Вы ищете больше, чем элемент, который Вы выбрали? Если так, Вы устранили нижнюю половину массива. Если это не, Вы устранили верхнюю часть.
  3. Выбор средний элемент остающейся половины массива, и продолжаются как на шаге 2, устраняя половины остающегося массива. В конечном счете Вы будете или находить свой элемент или не иметь массива в запасе для просмотра.

Двоичный поиск работает вовремя пропорциональный логарифму длины массива, таким образом, это может быть намного быстрее, чем рассмотрение каждого отдельного элемента.

8
задан Brian Tompsett - 汤莱恩 21 July 2019 в 18:03
поделиться

3 ответа

Ага, немного. Недостаточно, чтобы быть огромной проблемой, но старые версии IE будут протекать при таких обстоятельствах.

Начиная с Prototype 1.6.1 (в настоящее время в его финальном кандидате на выпуск), библиотека обрабатывает эту очистку при выгрузке страницы. Когда вы используете Prototype для добавления наблюдателя событий, он сохраняет ссылку на этот элемент в массиве; при выгрузке страницы он проходит через этот массив и удаляет всех ваших наблюдателей.

Однако, если пользователь собирается оставаться на этой странице какое-то время, использование памяти будет накапливаться в течение всего срока службы страницы. У вас есть несколько вариантов:

  1. Прослушивать события на предке формы, который никогда не заменяется. Затем в своем обработчике проверьте, откуда произошло событие. (например, «делегирование события» )

  2. Явно отмените регистрацию всех ваших вызовов перед вызовом Element # replace . В вашем примере вы бы сделали:

     $ ('foo', 'bar'). Each (Element.stopObserving);
    

Это эквивалентно вызову stopObserving без аргументов, что приводит к удалению всех обработчиков для данного элемента.

Я бы рекомендовал вариант 1.

(Мы говорили об автоматическом удалении слушателя в будущей версии Prototype в рамках Element # update и Element # replace , но это компромисс производительности.)

3
ответ дан 5 December 2019 в 21:21
поделиться

Всегда полезно удалять любые прослушиватели событий из элементов, которые удаляются из DOM, в случае сценария, упомянутого ниже Йонасом.

0
ответ дан 5 December 2019 в 21:21
поделиться

События, которые не являются незарегистрированными не могут автоматически освобождать свою память. Это особенно проблема в старых версиях IE.

В прототипе для этого использовалась автоматическая система сборки мусора, но этот метод был удален в версии 1.6. Это описано здесь . Я не знаю, означает ли удаление метода, что сборка мусора больше не происходит, или метод просто больше не является общедоступным. Также обратите внимание, что он всегда вызывался только при выгрузке страницы, а это означает, что если ваши пользователи остаются на одной странице в течение длительного времени, выполняя множество обновлений AJAX и DOM, утечка памяти может быть недопустимой даже во время этого одного посещения страницы.

4
ответ дан 5 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: