Утечка памяти в jQuery cluetip - PullRequest
       14

Утечка памяти в jQuery cluetip

0 голосов
/ 26 октября 2009

Я обнаружил утечку памяти в моем веб-приложении, которое динамически удаляет и добавляет якоря, которые имеют всплывающие подсказки прилагается, и я думаю, что я, возможно, сузил проблему до главное закрытие в подсказке, которая прикрепляет подсказку к узлу (строка 32: var link = this, $ this = $ (this);).

Я выполняю следующий скрипт в SIEV с измененным версия jquery 1.3.2 со следующим исправлением, которое позволяет элементы подсказки должны быть удалены. Тем не менее, якорные узлы становятся осиротевший, так как есть еще 1 ссылка на них после узлов подсказки удалены?

Если я изменю строку 32 источника cluetip на следующую для тестирования цели: var link = $ ('br'), $ this = $ ('br');

Якоря освобождаются, но узлы 'br' начинают накапливаться.

Поэтому мне было интересно, если кто-нибудь знает, как я могу обойти это проблема? или если я просто неправильно высвобождаю ресурсы?

Прилагаемые сценарии и источник:

jQuery модификация. После строки 1247 вставить следующее перед закрывающая фигурная скобка (http://markmail.org/message/cfi4bvfjc3m6ww6k#query:jquery%20memory%20leak%20in%20remove%20and%20empty+page:1+mid:tapc7zt3cwl6rw4f+state:results):

this.outerHTML = "";

Пример сценария:

<html> 
<head> 
    <link rel="stylesheet" type="text/css" href="jquery.cluetip.css"/> 


    <script type="text/javascript" src="jquery-1.3.2.js"></script> 
    <script type="text/javascript" src="jquery.cluetip.js"></script> 


    <script type="text/javascript"> 
            $(document).ready(function() { 
                    setInterval(resetCluetip, 1000); 
            }); 


            function resetCluetip() { 
                    $('a').each(function() { 
                            $(this).cluetip('destroy'); 
                            $(this).unbind().remove(); 
                    }); 


                    $('#cluetip*').unbind().empty(); 


                    $('body').html('<a href="#" class="contextMenu" title="title|body">anchor one</a><br>'); 


                    $('a').each(function() { 
                            $(this).cluetip({splitTitle: '|'}); 
                    }); 
            } 
    </script>
</head>
<body>
</body>
</html> 

1 Ответ

1 голос
/ 26 октября 2009

Итак, вот несколько комментариев:

  • Прежде всего, то, что этот сценарий делает для меня не имеет смысла ... сбрасывает подсказки и содержимое страницы каждую секунду. Почему бы просто не обновить атрибут title новой информацией, а затем обновить подсказку или установить атрибут cluetip ajaxCache: false, если вы получаете обновления через ajax?
  • Использование .remove() на объекте должно удалить его из DOM, а также отменить привязку любых ссылок, поэтому вам не нужно использовать .unbind().remove(); или .unbind().empty();
  • Подстановочные знаки не работают с идентификаторами таким образом $('#cluetip*') лучший способ сделать это - использовать фильтр атрибутов селектора, подобный этому $('div[id*="cluetip"]')
  • Я не смог продублировать утечку памяти.
...