Frage

Ich versuche, dynamisch einen Tooltip mit Prototip und Prototype gemacht zu aktualisieren. Die Art, wie ich versuche, dies zu tun, ist wahrscheinlich nicht die beste Art und Weise (also, wenn Sie eine bessere Art und Weise kennen, die hilfreich sein würden), aber die einzige Art, wie ich es wäre, denken könnte das Javascript in einem div-Elemente und Aktualisierung zu halten das Javascript innerhalb des div-Element, um den Tooltip zu aktualisieren. Dies scheint jedoch, da jedes Mal, wenn ein Speicherleck zu sein das Javascript aktualisiert wird, ein neuer Tipp Objekt wird im Speicher erstellt und gespeichert werden. Wenn es nicht ein besserer Weg, dies zu tun ist, wie kann ich Speicher löschen?

Ich habe diesen einfachen Skript den Speicherverlust zu testen, jetzt muß ich herausfinden, wie es zu machen, so dass der Speicherverlust in diesem Beispiel ausgebessert wird.

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

Hier ist, was für den Tooltip die Javascript ist in der Regel:

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

Lösung

Es scheint, dass das neue Tip-Konstrukt kann ein Element nehmen, anstatt den Tooltip-Text als Parameter. Sie könnten versuchen wollen, dass zu verwenden. Ich habe dies nicht getan, so dass Sie es selbst versuchen müssen. Erstellen Sie zunächst das Tooltip-Layout (div-Tag enthält Tooltiptext) und Stil wie gewohnt. Stellen Sie den Stil-Attribut dieses DIV zu „display: none“. Dann versuchen, die Spitze wie diese zu erstellen:

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

Sie können dann den Text des Tooltip ändern mit:

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

Es ist nicht genug, um die Tooltip Konstrukt auf eine Variable im globalen Raum zuzuordnen, da es mir scheint, dass prototip fügt sie eigenes Tooltip html Zeug in den dom ist. Meine Vermutung ist, dass jedes Mal, wenn „neuer Tip“ rufen Sie zusätzlichen HTML-Code in den dom hinzufügen. Dieses Objekt dann Referenz dom Knoten, so dass sie nie Müll gesammelt. Sollte einfach für Sie, dass überprüfen Sie Ihren Testcode und Firebug mit dem dom zu überprüfen.

Die letzte Option, die Sie haben, ist an der prototip Quellcode, um zu sehen, ob es irgendeine Art von setTooltipText Funktion hat. Dann könnten Sie in der Lage sein, so etwas zu tun:

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

Wenn das nicht hilft, nur E-Mail an den Autor von prototip. Ich bin sicher, dass er froh sein, zu helfen.

Andere Tipps

Wie Sie bemerkt haben, einfach einen neuen Tipp Instanziierung bedeutet ein neues Tipp Objekt erstellt wird und im Speicher gespeichert.

Um dies zu umgehen, müssen Sie die Spitze auf eine eindeutige Variable im globalen Bereich zuzuordnen. dh die Variable „Tooltip“, instanziieren und verwenden Sie dann „Tooltip = new Tip“ in Ihrer Routine (dies ist für nur 1 Tooltip ermöglichen wird zu einer Zeit, in Gebrauch zu sein, was ich davon ausgehen würde, ist, was Sie wollen als nur einer kann angezeigt werden ). Garbage Collection sollten sich um den Rest.

den „Tips“ Durch Instanziierung Objekt, das Sie tatsächlich Konstruktoraufruf ausführen, zum Beispiel einfacher Funktionsaufruf, der Griff und das visuelle Element entsprechend aktualisieren, aber wenn dieses Objekt nicht durch eine Variable verwiesen wird angenommen, von der Garbage Collector gesammelt werden. Falls Sie sicher sein, dass Sie in den nächsten tun können:

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

Es sieht aus wie das ist eigentlich ein Speicherleck in Prototype ist. Nach dieser wird das Leck in 1,6 fixiert 0,1

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top