Pergunta

Eu estou tentando atualizar dinamicamente uma dica de ferramenta feita com Prototip e Prototype. A maneira que eu estou tentando fazer isso não é provavelmente a melhor maneira (por isso, se você sabe uma maneira melhor que seria útil), mas a única maneira que eu poderia pensar em fazê-lo seria para segurar o javascript em um elemento div e atualização o javascript dentro do elemento div, a fim de atualizar a dica de ferramenta. No entanto, este parece ser um vazamento de memória, já que cada vez que o javascript é atualizado, um novo objeto Tip é criado e armazenado na memória. Se não houver uma maneira melhor de fazer isso, como posso apagar a memória?

Eu fiz este script simples para testar o vazamento de memória, agora eu preciso descobrir como fazer com que o vazamento de memória é corrigido neste exemplo.

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>");
}

Aqui está o que o javascript para a dica de ferramenta é normalmente:

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

Solução

Parece que a nova construção Tip pode tomar um elemento em vez do texto dica de ferramenta como um parâmetro. Você pode querer tentar usar isso. Eu não fiz isso para que você vai ter que experimentá-lo por si mesmo. Primeiro, crie o layout dica (div tag que contém o texto dica de ferramenta) e estilo-lo como de costume. Defina o atributo estilo deste div com "display: none". Em seguida, tentar criar a ponta como este:

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

Você pode então alterar o texto da dica de ferramenta usando:

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

Não é suficiente para atribuir a construção dica para uma variável no espaço global, uma vez que parece para mim que insere Prototip é próprio material dica html no DOM. Meu palpite é que cada vez que você chama de "nova ponta" você está adicionando html extra para o dom. Estes objeto é então referenciar nós dom, para que eles nunca são lixo coletado. Deve ser fácil para você verificar isso usando seu código de teste e Firebug para inspecionar o dom.

A última opção que você tem é de olhar para o código-fonte prototip para ver se ele tem algum tipo de uma função setTooltipText. Então você pode ser capaz de fazer algo parecido com isto:

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

Se isso não ajuda, basta enviar e-mail o autor de prototip. Tenho certeza que ele terá prazer em ajudar.

Outras dicas

Como você observou, simplesmente instanciar um novo Dica vai significar um novo objeto Tip é criado e armazenado na memória.

Para contornar esta situação, é necessário atribuir a ponta a uma única variável no escopo global. isto é instanciar a variável "dica", e então usar "dica = new Dica" em sua rotina (isto irá permitir apenas 1 dica para estar em uso por vez, o que eu diria é que você quer como apenas um pode ser exibida ). A coleta de lixo deve cuidar do resto.

Ao instanciar o objeto "Tip" você realmente execute chamada do construtor, por exemplo, chamada de função simples, que manipular e atualizar o elemento visual em conformidade, mas uma vez que esse objeto não é referenciado por qualquer variável que deveria ser recolhida pelo coletor de lixo. No caso de você querer ter certeza de que você pode fazer o seguinte:

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

Parece que este é realmente um vazamento de memória no Prototype. De acordo com este , o vazamento é fixado em 1,6 .1

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top