2009-05-31 21 views
0

PrototipとPrototypeで作成されたツールチップを動的に更新しようとしています。私がこれをやろうとしている方法は、おそらく最良の方法ではない(あなたが役に立つより良い方法を知っているなら)。しかし、div要素にjavascriptを保持して、ツールチップを更新するためにdiv要素内のjavascriptを使用します。しかし、これは、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のstyle属性を "display:none"に設定します。そして、このように先端を作成しよう:

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

あなたはその後、使ってツールチップのテキストを変更することができます。

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

それはそれ以来、グローバル空間内の変数に構築ツールチップを割り当てるには十分ではありませんprototipはそれが自分のツールチップのhtmlのものをdomに挿入すると私には思われます。私の推測では、あなたが "新しいヒント"と呼ぶたびに、あなたは特別なhtmlをdomに追加しているということです。これらのオブジェクトは、参照domノードであるため、ガベージコレクションされることはありません。あなたのテストコードと火薬爆弾を使ってdomを調べることが簡単にできるはずです。

最後に、prototipのソースコードを見て、何らかのsetTooltipText関数があるかどうかを確認してください。それでも解決しない場合は、単にprototipの作者に電子メールを送り、

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

:次に、あなたはこのような何かを行うことができるかもしれません。彼が喜んで助けてくれると確信しています。

+0

ありがとう、私はこれを試して、これが動作すれば報告します。 –

0

、単に新しいヒントをインスタンス化することは、新たなヒントオブジェクトがメモリ内に作成し、保存されている意味します。

この問題を回避するには、グローバルスコープの一意の変数にヒントを割り当てる必要があります。 つまり、変数 "tooltip"をインスタンス化し、あなたのルーチンで "tooltip = new tip"を使用してください(これは一度に1つのツールチップしか使用できません。表示される)。ガベージコレクションは残りの部分を処理する必要があります。

0

"Tip"オブジェクトをインスタンス化することで、実際にコンストラクタ呼び出しを実行します。それに応じてビジュアル要素を処理して更新するシンプルな関数呼び出しですが、このオブジェクトはガベージコレクタによって収集されるはずの変数によって参照されません。あなたが次のことができることを確信したい場合:

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

これは実際にはPrototypeのメモリリークのようです。 According to thisでは、リークは1.6.1に固定されています

+0

プロトタイプ1.6を使用しています。1 –

関連する問題