Вопрос

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

Решение

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

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top