0

PrototipとPrototypeで作成されたツールチップを動的に更新しようとしています。私がこれを行おうとしている方法はおそらく最善の方法ではありません(したがって、役立つより良い方法を知っている場合)が、私が考えることができる唯一の方法は、javascriptをdiv要素に保持して更新することですツールチップを更新するための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
});
4

4 に答える 4

1

新しいTip構成は、ツールチップテキストの代わりに要素をパラメーターとして使用できるようです。あなたはそれを使ってみたくなるかもしれません。私はこれを行っていないので、自分で試してみる必要があります。まず、ツールチップレイアウト(ツールチップテキストを含むdivタグ)を作成し、通常どおりにスタイルを設定します。このdivのstyle属性を"display:none"に設定します。次に、次のようなヒントを作成してみてください。

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

次に、以下を使用してツールチップのテキストを変更できます。

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

ツールチップ構造をグローバル空間の変数に割り当てるだけでは不十分です。これは、prototipが独自のツールチップhtmlをdomに挿入しているように見えるためです。私の推測では、「新しいヒント」を呼び出すたびに、domにHTMLを追加していると思います。これらのオブジェクトはdomノードを参照するため、ガベージコレクションされることはありません。テストコードとfirebugを使用してdomを検査することで、簡単に確認できるはずです。

最後のオプションは、prototipソースコードを調べて、ある種のsetTooltipText関数があるかどうかを確認することです。次に、次のようなことができる場合があります。

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

それでも問題が解決しない場合は、prototipの作成者にメールを送信してください。彼は喜んで手伝ってくれると確信しています。

于 2009-05-31T20:05:38.330 に答える
0

お気づきのとおり、新しいTipをインスタンス化するだけで、新しいTipオブジェクトが作成され、メモリに保存されます。

これを回避するには、グローバルスコープ内の一意の変数にヒントを割り当てる必要があります。つまり、変数「tooltip」をインスタンス化してから、ルーチンで「tooltip = newTip」を使用します(これにより、一度に1つのツールチップしか使用できなくなります。これは、1つしか表示できないため、必要なツールチップであると思います。 )。ガベージコレクションは残りの面倒を見る必要があります。

于 2009-05-31T19:50:44.817 に答える
0

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

var tip = new Tip( whatever);
// before next update do delete tip;
于 2009-05-31T19:51:04.363 に答える
0

これは実際にはPrototypeのメモリリークのようです。 これによると、リークは1.6.1で修正されています

于 2009-05-31T19:58:27.143 に答える