У меня есть сценарий GreaseMonkey, который работает на сайте, который использует фреймы как неотъемлемую часть интерфейса. Этот скрипт утечки памяти, как сито, и я считаю, что это связано с моим использованием addEventListener в одном из фреймов. Проще говоря, я подключаю различные прослушиватели событий, затем перезагружает фрейм и присоединяет слушателей событий, а затем кадр перезагружается, вокруг и вокруг для сотен или, возможно, тысяч итераций, когда вы взаимодействуете с различными элементами в этом фрейме или другими. К концу этого времени Firefox перешел от ~ 300M памяти до 2G (или сработает до того, как он туда доберется).Ошибка утечки памяти AddEventListener из-за кадров
Я читал где-то, что полная перезагрузка страницы позволяет запускать программы сбора мусора FireFox и восстанавливать всю память из сиротских обработчиков событий и, конечно же, когда я нажимаю F5 после того, как мой скрипт работает некоторое время, в течение 10 секунд память вернется на 300M. К сожалению, это разбивает другой фрейм на сайте (очень популярное окно чата), поэтому, похоже, это подтверждает мое подозрение, что addEventListener виноват, но это не вариант в качестве решения.
Есть ли что-то еще, что я могу сделать, чтобы освободить память правильно, не заставляя обновление полной страницы?
(В настоящее время с помощью GM 1.5 и FF 17, но проблема существует с GM 0.8/FF 4 или около того.)
вместо добавления ваших слушателей событий внутри кадра (каждый раз, когда каркасные перезагружается), просто добавьте слушателей раз в коде вне рамки. Определите функции внутри кадра, соответствующие каждому событию, которое вы хотите обработать, и каждый обработчик событий (вне кадра) вызывает соответствующую функцию внутри фрейма. – Lee
@ Lee, вы бы хотели набросать, как будет выглядеть этот код? Также как я мог бы обрабатывать элементы, которые приходят и уходят изредка? По существу, панель представляет собой панель состояния, и по мере того как ваш статус изменяет появление новых элементов, к которым я затем присоединяю некоторые события. (Есть также постоянные элементы, и я определенно с нетерпением жду, чтобы попытаться ваш подход. :-)) – Hellion
Ли подход не будет работать, если это перекрестный домен. ... Неясно, что 'addEventListener' является проблемой /, но, возможно, существует обходное решение jQuery, если вы открыты для jQuery. Что произойдет, если вы используете сайт в течение как минимум 30 минут с отключенными сценариями Greasemonkey? –