2009-05-31 1 views
0

Я пытаюсь динамически обновлять всплывающую подсказку, выполненную с помощью 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 
}); 

ответ

1

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

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

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

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

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

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

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

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

+0

Спасибо, я попробую это и отчитаю, если это сработает. –

0

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

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

0

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

var tip = new Tip(whatever); 
// before next update do delete tip; 
0

Похоже, что это на самом деле утечка памяти в Prototype. According to this, утечка зафиксирована в 1.6.1

+0

Я использую Prototype 1.6.1 –