Как я могу управлять IE6+jQuery+jQuery-ui утечками памяти?

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

Если нет, я откладываю их в сторону до тех пор, пока «ранние последователи» не выбивают неровные края, а затем проверяю снова каждые несколько месяцев / лет.

28
задан 13 revs, 3 users 100% 19 June 2015 в 20:37
поделиться

8 ответов

Мне неприятно это говорить, ваш подход правильный и профессиональный, но я бы хотел просто оставить его.

Последствия Не исправляя это, пользователи IE6 будут замечать, что их машина становится все медленнее и медленнее, и в конечном итоге либо полностью вылетает из строя, либо, скорее всего, дает сбой IE6.

Ну и что?

Действительно - почему это ваша проблема?

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

Маловероятно, что кто-то, все еще использующий IE6, мог даже указать на ваше приложение как на утечку.

Наконец, когда IE6 все-таки дает сбой, он сообщает IE6 как виновник - вы можете с полным основанием указать, что это ошибка в IE6, которую Microsoft исправила в новой версии.

Ваше дорогое время лучше потратить на улучшение приложения для пользователи не попали в ловушку унаследованного ада - ваше приложение должно в основном работать для пользователей IE6, но такого рода проблемы могут отнять у вас все время и не решить их проблему. IE6 по-прежнему будет неподдерживаемой дырой в безопасности браузера.

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


Обновление

Хорошо, эту проблему исправить нелегко - MS описывает ошибку IE6 (и дает советы, как ее исправить) здесь: http: // msdn. microsoft.com/en-us/library/bb250448(VS.85).aspx

В основном это не проблема с javascript или jQuery - реальная проблема связана с IE6 DOM - когда элементы HTML добавляются на страницу (с помощью javascript, вместо того, чтобы находиться на странице при загрузке) IE не может собирать мусор, если они не созданы очень специфическим образом.

Это задняя часть того, как пользовательский интерфейс jQuery создает элементы (см. порядок вставки DOM ошибка в ссылке выше), и это не то, что разработчики jQuery или вы можете легко исправить.

Так как же исправить проблему? Что ж, вы можете придерживаться устаревшего всплывающего календаря для IE6 или написать свой собственный.

Я бы порекомендовал первое, но если вы действительно хотите создать второе, следует соблюдать несколько основных правил:

  1. Всегда добавляйте элементы сверху вниз - например, если вы хотите создать таблицу, добавьте элемент

    в DOM страницы, затем добавьте , затем ]
    и так далее. Это задняя часть на передний план, так как гораздо быстрее построить всю таблицу, а затем добавить ее в DOM - к сожалению, именно здесь IE6 теряет ее отслеживание.

  2. Используйте только атрибуты CSS и HTML 3.2 - звучит глупо, но IE6 создает дополнительные объекты для хранения дополнительных атрибутов (или свойств 'expando'), и они также протекают.

  3. Отчасти связано с (2), но, как упоминает @gradbot, IE6 имеет проблемы со сборкой мусора переменных javascript - если они ссылаются на элемент DOM внутри инициированного события от этого элемента вы можете получить проблемы. Это также усугубляется ссылками javascript на элементы DOM, которые имеют ' expando 'properties.

  4. Если вы посмотрите в Интернете, возможно, уже есть выпадающий календарь DHTML, который придерживается этих правил - он не будет таким красивым, быстрым или настраиваемым, как jQuery UI, но я Я уверен, что видел, как это делается без утечек в IE6.

    Я думаю, что лучше всего сохранить как можно больше статичности - например, вы можете загрузить календарную сетку (номера недель и заголовки столбцов дней) со страницей и затем динамически загружать числа (и ничего больше). Создавайте номера дней в виде ссылок с javascript в href - обычно это не лучшая практика, но вероятность утечки в IE6 гораздо ниже.

    Я уверен, что видел, как это делается без утечек в IE6.

    Я думаю, что лучше всего сохранить как можно больше статичности - например, вы можете загрузить календарную сетку (номера недель и заголовки столбцов дней) со страницей и затем динамически загружать числа (и ничего больше). Создавайте номера дней в виде ссылок с javascript в href - обычно это не лучшая практика, но вероятность утечки в IE6 гораздо ниже.

    Я уверен, что видел, как это делается без утечек в IE6.

    Я думаю, что лучше всего сохранить как можно больше статичности - например, вы можете загрузить календарную сетку (номера недель и заголовки столбцов дней) со страницей и затем динамически загружать числа (и ничего больше). Создавайте номера дней в виде ссылок, используя javascript в href - обычно не лучшая практика, но вероятность утечки в IE6 гораздо ниже.

    22
    ответ дан 28 November 2019 в 03:44
    поделиться

    Лучшим отладчиком, доступным для IE6, является Visual Studio. (Даже бесплатная версия будет работать.) Как отмечает Джени, если ваша проблема возникает только в IE6, вы захотите отладить IE6, уделяя особое внимание коду, который работает только там.

    -1
    ответ дан 28 November 2019 в 03:44
    поделиться

    Эта проблема либо в части jQuery, предназначенной только для IE6, либо в общей части jQuery, в которой отсутствует специальный код IE6 (как указано в комментариях). В любом случае, это ошибка в jQuery, которую необходимо устранить. about: blank Вам придется либо покопаться в jQuery , либо отправить сообщение об ошибке . Если вам удастся это исправить, не забудьте прикрепить различие к багтрекеру, чтобы проект стал немного лучше. ;)

    Если у меня будет свободное время, я постараюсь помочь вам с этим.

    Править

    Хорошо, проблема кажется непреодолимой.

    Утечка, с которой вы столкнулись, связана с IE 6 SP 0 единственная проблема, утечка, вызванная подходом IE к DOM. Неважно, какой JS фреймворк вы используете, он отказывается работать правильно.

    Итак, ваши текущие варианты:

    • Умереть, пытаясь заставить ваших пользователей обновить IE 6 до более новой версии / пакета обновления,
    • Die (как в случае утечки) в IE (потеря клиентов) или
    • Die, пытаясь работать в IE.

    Но это не обязательно означает, что вы не можете решить эту проблему. Как насчет того, чтобы просто попытаться обойти стороной wole?

    Показать каждому пользователю, не использующему IE 6 SP 0, jQuery datepicker, и только IE 6 SP 0 другой более устойчивый (и, вероятно, базовый) datepicker с условными комментариями IE ]. Таким образом, вы можете сохранить привлекательность / функциональность в своем программном обеспечении и позволить пользователям IE 6 иметь те же базовые функции.

    Это может быть не такой простой вариант, но вы все равно сможете использовать то, что хотите , и IE6 по-прежнему сможет работать без утечек.

    Единственная проблема будет заключаться в том, что у вас будет большая нагрузка из-за того, что вам придется отлаживать два разных датпикера. Но вам все равно придется отлаживать IE 6, так что на данный момент это может быть вашим лучшим выбором.

    и только IE 6 SP 0 еще один более устойчивый (и, вероятно, базовый) datepicker с условными комментариями IE . Таким образом, вы можете сохранить привлекательность / функциональность в своем программном обеспечении и позволить пользователям IE 6 иметь те же базовые функции.

    Это может быть не такой простой вариант, но вы все равно сможете использовать то, что хотите , и IE6 по-прежнему сможет работать без утечек.

    Единственная проблема будет заключаться в том, что у вас будет большая нагрузка из-за того, что вам придется отлаживать два разных датпикера. Но вам все равно придется отлаживать IE 6, так что на данный момент это может быть вашим лучшим выбором.

    и только IE 6 SP 0 еще один более устойчивый (и, вероятно, базовый) datepicker с условными комментариями IE . Таким образом, вы можете сохранить привлекательность / функциональность в своем программном обеспечении и позволить пользователям IE 6 иметь те же базовые функции.

    Это может быть не такой простой вариант, но вы все равно сможете использовать то, что хотите , и IE6 по-прежнему сможет работать без утечек.

    Единственная проблема будет заключаться в том, что у вас будет большая нагрузка из-за того, что вам придется отлаживать два разных датпикера. Но вам все равно придется отлаживать IE 6, так что на данный момент это может быть вашим лучшим выбором.

    но вы все равно сможете использовать то, что хотите, и IE6 по-прежнему сможет работать без утечек.

    Единственная проблема будет заключаться в том, что у вас будет большая нагрузка из-за того, что вам придется отлаживать два разных датпикера. Но вам все равно придется отлаживать IE 6, так что на данный момент это может быть вашим лучшим выбором.

    но вы все равно сможете использовать то, что хотите, и IE6 по-прежнему сможет работать без утечек.

    Единственная проблема будет заключаться в том, что у вас будет большая нагрузка из-за того, что вам придется отлаживать два разных датпикера. Но вам все равно придется отлаживать IE 6, так что на данный момент это может быть вашим лучшим выбором.

    2
    ответ дан 28 November 2019 в 03:44
    поделиться

    Проблема с IE 6 в том, что в нем есть два сборщика мусора. Один для JavaScript и один для DOM. Так, например, если вы прикрепите функцию к событию DOM, а затем удалите элемент DOM, функция все равно будет существовать в памяти.

    Посмотрите это слайд-шоу . Это немного назойливо, но это хорошая информация.

    Они исправили эту проблему в IE 7. Я попробовал вашу страницу в IE8 в Windows 7 и не заметил утечки памяти.

    1
    ответ дан 28 November 2019 в 03:44
    поделиться

    попробуйте удалить эти объекты после уничтожения объекта datepicker:

    $.datepicker = null;
    $.fn.datepicker = null;
    
    2
    ответ дан 28 November 2019 в 03:44
    поделиться

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

    ОБНОВЛЕНИЕ Потратив немного времени на это, я убедился, что это не имеет ничего общего с самим датпикером.

    Мои тесты показывают, что при простой перезагрузке фиктивной страницы каждую секунду обнаруживается утечка памяти. Если вы затем включите jquery на этой странице, утечки немного увеличатся (накладные расходы на синтаксический анализ скрипта). Если вы затем добавите jquery-ui в микс, снова произойдет еще одно небольшое увеличение утечки памяти.

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

    0
    ответ дан 28 November 2019 в 03:44
    поделиться

    Проблема здесь немного глубже, чем просто jquery. Jquery вместе со многими другими браузерами «пропускает» циклические ссылки между объектами DOM и слушателями объектов. Скажем, у вас есть поле ввода, к которому прикреплен слушатель, затем вы удаляете элемент из dom и не имеете никакой ссылки на слушателя в вашем коде. Теперь любой современный браузер (> = ie7, ff, chrome, safari, opera) будет жить с этим и собирать мусор, в то время как IE6 будет думать, что поскольку к элементу dom прикреплен слушатель, он не должен собирать мусор dom и сам слушатель.

    Чтобы обойти это, некоторые люди используют очень сложные шаблоны проектирования, как показано, например, в коде событий в Google Doctype. Чтобы решить проблему для IE6, вам действительно нужно переписать часть jquery, чтобы обойти проблему IE6 и / или переключиться на использование другой библиотеки и / или не прикреплять какие-либо прослушиватели событий в вашем приложении к событиям DOM.

    1
    ответ дан 28 November 2019 в 03:44
    поделиться

    Очевидно, что описанные вами проблемы проистекают из недостатка IE6, который нельзя устранить с помощью программного исправления (будь то обновление jQuery, ручной вызов CollectGarbage или какой-то другой хак JavaScript / DOM).

    На мой взгляд, есть 3 варианта, которые могут решить эту проблему.

    1. Я могу представить, что ваши клиенты / пользователи используют IE6 SP0 из-за каких-то стандартов или правил компании, или даже потому, что некоторые старые веб-приложения, которые они все еще используют, не поддерживают новые браузеры. Если это не вариант обновления до IE7 (или, следовательно, до IE8), вы можете связаться с ИТ-отделом своих клиентов и вежливо указать, что обновление IE6 с помощью последних пакетов обновления не только решит проблему с приложением, которым они являются. платить за, но также исправляет многие недостатки безопасности и производительности, которые, несомненно, существуют в IE6 SP0. По общему признанию, это может быть неудобной ситуацией, но она может решить проблемы, с которыми вы сталкиваетесь, при этом позволяя им работать с браузером, который требуется по какой-либо причине.

    2. Если вы можете убедить ИТ-отдел своих клиентов, что IE6 - это устаревшие, они могут позволить вашим пользователям перейти на более новую версию браузера. Не будет преувеличением сказать, что кто-то, кто управляет ИТ-отделом, был бы более склонен принуждать сотрудников к обновлению части программного обеспечения, если бы они знали, что оно либо а) изобилует недостатками и дырами в безопасности, либо б) приближается дата окончания поддержки (как IE6 SP0 есть). IE6 SP0 на XP Pro SP2 поддерживается до 13 июля 2010 г., так что у него еще есть время, но, отмечая это, наряду с другими недостатками / ограничениями, которые вы можете обнаружить, они могут заставить их серьезно задуматься об обновлении раньше, чем позже.

    3. Если вы не можете убедить кого-либо обновить свои браузеры до IE6 SPX или IE7 / 8, тогда я не буду » не знаю, есть ли у вас выбор, кроме как удалить оскорбительный элемент управления со своей страницы, и выбрать другой вариант, пока браузер пользователя не разрешит это. Несомненно, существует множество реализаций элемента управления выбора даты, доступных в Интернете, которые удовлетворят ваши потребности. Это может быть не так шикарно, как версия jQuery, но на данный момент у вас не так много других вариантов.

    Надеюсь, вы найдете решение!

    не знаю, есть ли у вас выбор, кроме как удалить оскорбительный элемент управления со своей страницы, и выбрать другой вариант, пока браузер пользователя не разрешит это. Несомненно, существует множество реализаций элемента управления выбора даты, доступных в Интернете, которые удовлетворят ваши потребности. Это может быть не так шикарно, как версия jQuery, но на данный момент у вас не так много других вариантов.

    Надеюсь, вы найдете решение!

    не знаю, есть ли у вас выбор, кроме как удалить оскорбительный элемент управления со своей страницы, и выбрать другой вариант, пока браузер пользователя не разрешит это. Несомненно, существует множество реализаций элемента управления выбора даты, доступных в Интернете, которые удовлетворят ваши потребности. Это может быть не так шикарно, как версия jQuery, но на данный момент у вас не так много других вариантов.

    Надеюсь, вы найдете решение!

    4
    ответ дан 28 November 2019 в 03:44
    поделиться
    Другие вопросы по тегам:

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