Question

Je suis en train de mettre à jour dynamiquement une info-bulle faite avec Prototip et Prototype. La façon dont je suis en train de faire est sans doute pas la meilleure façon (donc si vous connaissez une meilleure façon qui serait utile), mais la seule façon que je pouvais penser à le faire serait de tenir le javascript dans un élément div et mise à jour le javascript à l'intérieur de l'élément div afin de mettre à jour l'info-bulle. Cependant, cela semble être une fuite de mémoire car chaque fois que le javascript est mis à jour, un nouvel objet Conseil est créé et stocké dans la mémoire. S'il n'y a pas une meilleure façon de le faire, comment puis-je effacer la mémoire?

J'ai fait ce script simple pour tester la fuite de mémoire, maintenant je dois savoir comment faire en sorte que la fuite de mémoire est patché dans cet exemple.

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

Voici ce que le javascript pour l'info-bulle est normalement:

new Tip('element', "Description", {
    style: 'creamy',
    stem: 'topLeft',
    hook: { mouse: true, tip: 'topLeft' },
    offset: { x: 10, y: 16 },
    delay: 0.04,
    width: 85
});
Était-ce utile?

La solution

Il semble que la nouvelle construction de pointe peut prendre un élément au lieu du texte de l'infobulle en tant que paramètre. Vous pouvez essayer d'utiliser. Je ne l'ai pas fait cela pour que vous devrez essayer par vous-même. Tout d'abord, créer la mise en page d'info-bulle (balise div contenant du texte info-bulle) et le style comme d'habitude. Définissez l'attribut de style de cette div à « display: none ». Ensuite, essayez de créer la pointe comme ceci:

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

Vous pouvez ensuite modifier le texte de l'info-bulle en utilisant:

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

Il ne suffit pas d'attribuer l'info-bulle construire à une variable dans l'espace mondial, car il me semble que prototip insère son propre truc html infobulle dans le Royaume. Je pense que chaque fois que vous appelez « nouveau Conseil », vous ajoutez html supplémentaire dans le Royaume. Ceux-ci est fait référence alors objet nœuds dom, ils ne sont jamais les déchets ramassés. Devrait être facile pour vous de vérifier que l'aide de votre code de test et Firebug pour inspecter le dom.

La dernière option que vous avez est de regarder le code source de prototip pour voir si elle a une sorte de fonction de setTooltipText. Ensuite, vous pourriez être en mesure de faire quelque chose comme ceci:

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

Si cela ne fonctionne pas, tout e-mail l'auteur de prototip. Je suis sûr qu'il sera heureux de vous aider.

Autres conseils

Comme vous l'avez remarqué, instanciation simplement un nouveau Conseil se traduira par un nouvel objet Conseil est créé et stocké dans la mémoire.

Pour contourner ce problème, vous devez attribuer la pointe à une variable unique dans la portée globale. à-dire instancier la variable « infobulle », puis utilisez « infobulle = new Tip » dans votre routine (cela permettra seulement 1 infobulle d'être utilisé à un moment, que je suppose est ce que vous voulez que seul peut être affiché ). Collecte des ordures ménagères devrait prendre en charge le reste.

Par instanciation de l'objet « Tip » vous effectuez réellement appel du constructeur, par exemple simple appel de fonction, qui gère et met à jour l'élément visuel en conséquence, mais une fois que cet objet n'est pas référencé par une variable censé être recueillie par le collecteur des ordures. Si vous voulez être sûr de ce que vous pouvez faire le suivant:

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

Il ressemble à ceci est en fait une fuite de mémoire dans Prototype. Selon cette , la fuite est fixé à 1,6 .1

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top