Как освободить память от зацикленного объекта - PullRequest
0 голосов
/ 31 мая 2009

Я пытаюсь динамически обновить всплывающую подсказку, созданную с помощью Prototip и Prototype. То, как я пытаюсь это сделать, вероятно, не самый лучший способ (так что, если вы знаете лучший способ, который будет полезен), но единственный способ, которым я мог бы подумать, это сделать javascript в элементе div и обновить javascript внутри элемента div для обновления всплывающей подсказки. Тем не менее, похоже, что это утечка памяти, так как каждый раз, когда javascript обновляется, новый объект Tip создается и сохраняется в памяти. Если нет лучшего способа сделать это, как я могу очистить память?

Я сделал этот простой скрипт для проверки утечки памяти, теперь мне нужно выяснить, как сделать так, чтобы утечка памяти была исправлена ​​в этом примере.

for (i=0; i<1000; i++) {
    $('testdiv').update("<script type='text/javascript'> new Tip('chips_tip', 'Your Chips', {style: 'creamy',stem: 'topLeft',hook: { mouse: true, tip: 'topLeft' },offset: { x: 10, y: 16 },delay: 0.04,width: 85}); <\/script>");
}

Вот как обычно выглядит JavaScript для всплывающей подсказки:

new Tip('element', "Description", {
    style: 'creamy',
    stem: 'topLeft',
    hook: { mouse: true, tip: 'topLeft' },
    offset: { x: 10, y: 16 },
    delay: 0.04,
    width: 85
});

Ответы [ 4 ]

1 голос
/ 01 июня 2009

Кажется, что новая конструкция Tip может принимать элемент вместо текста всплывающей подсказки в качестве параметра. Вы можете попытаться использовать это. Я этого не делал, поэтому вам придется попробовать это самостоятельно. Сначала создайте макет всплывающей подсказки (тег div, содержащий текст подсказки) и стилизуйте его как обычно. Установите атрибут стиля этого div на «display: none». Затем попробуйте создать подсказку так:

new Tip('source', $('tooltip_container'));

Затем вы можете изменить текст всплывающей подсказки, используя:

$('tooltip_container').update('new tooltip text');

Недостаточно присвоить конструкцию всплывающей подсказки переменной в глобальном пространстве, так как мне кажется, что прототип вставляет свои собственные всплывающие подсказки в HTML. Я предполагаю, что каждый раз, когда вы вызываете «новый совет», вы добавляете дополнительный HTML в DOM. Затем эти объекты ссылаются на dom-узлы, поэтому они никогда не собираются мусором. Вам должно быть легко проверить это, используя ваш тестовый код и firebug для проверки домена.

Последний вариант, который у вас есть, это посмотреть на исходный код прототипа, чтобы увидеть, имеет ли он какую-то функцию setTooltipText. Тогда вы можете сделать что-то вроде этого:

var tooltip = new Tip('element', 'text');
// snip
tooltip.setText('some new text');

Если это не поможет, просто напишите автору прототипа по электронной почте. Я уверен, что он будет рад помочь.

0 голосов
/ 31 мая 2009

Создавая экземпляр объекта «Совет», вы фактически выполняете вызов конструктора, например, простой вызов функции, который соответствующим образом обрабатывает и обновляет визуальный элемент, но как только на этот объект не ссылается ни одна переменная, он должен собираться сборщиком мусора. Если вы хотите быть уверенным в этом, вы можете сделать следующее:

var tip = new Tip( whatever);
// before next update do delete tip;
0 голосов
/ 31 мая 2009

Похоже, что это на самом деле утечка памяти в Prototype. Согласно этому утечка исправлена ​​в 1.6.1

0 голосов
/ 31 мая 2009

Как вы заметили, простое создание нового Tip будет означать, что новый объект Tip создается и сохраняется в памяти.

Чтобы обойти это, вам нужно назначить подсказку уникальной переменной в глобальной области видимости. т.е. создайте экземпляр переменной «tooltip», а затем используйте «tooltip = new Tip» в своей программе (это позволит использовать только 1 подсказку за раз, что, как я предполагаю, это то, что вы хотите, так как может отображаться только одна) ). Сборщик мусора должен позаботиться обо всем остальном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...