Domanda

Sto cercando di aggiornare dinamicamente un tooltip fatto con Prototip e Prototype. Il modo in cui sto cercando di fare questo non è probabilmente il modo migliore (quindi se si conosce un modo migliore che sarebbe utile), ma l'unico modo ho potuto pensare di farlo sarebbe quello di tenere il javascript in un elemento div e aggiornamento il javascript all'interno dell'elemento div per aggiornare il suggerimento. Tuttavia, questo sembra essere una perdita di memoria in quanto ogni volta che il javascript è aggiornato, un nuovo oggetto punta viene creato e memorizzato nella memoria. Se non c'è un modo migliore di fare questo, come posso cancellare la memoria?

Ho fatto questo semplice script per testare la perdita di memoria, ora ho bisogno di capire come fare in modo che la perdita di memoria è patchato in questo esempio.

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

Ecco ciò che il javascript per il tooltip è normalmente:

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

Soluzione

Sembra che il nuovo costrutto punta può prendere un elemento invece del testo tooltip come parametro. Si potrebbe desiderare di provare ad usare quella. Non ho fatto questo in modo dovrete provare da soli. In primo luogo, creare il layout tooltip (tag div che contiene il testo tooltip) e lo stile, come al solito. Impostare l'attributo di stile di questo div a "display: none". Quindi provare a creare la punta in questo modo:

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

È quindi possibile modificare il testo del tooltip utilizzando:

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

Non è sufficiente per assegnare il tooltip costruire ad una variabile nello spazio globale, dal momento che sembra a me che prototip inserisce il proprio roba tooltip html nel DOM. La mia ipotesi è che ogni volta che si chiama "nuova Tip" si sta aggiungendo html in più nel DOM. Questi oggetti di poi riferimento nodi DOM, in modo che siano mai garbage collection. Dovrebbe essere facile per voi per controllare che utilizzando il codice di test e Firebug per ispezionare il dom.

L'ultima opzione che hai è di guardare il codice sorgente prototip per vedere se ha una sorta di una funzione setTooltipText. Allora si potrebbe essere in grado di fare qualcosa di simile a questo:

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

Se questo non aiuta, solo e-mail l'autore di prototip. Sono sicuro che sarà lieto di aiutarvi.

Altri suggerimenti

Come avete notato, semplicemente istanziare una nuova punta significherà un nuovo oggetto punta viene creato e memorizzato nella memoria.

Per aggirare il problema, è necessario assegnare la punta ad una variabile unica in ambito globale. cioè istanziare la variabile "tooltip", e quindi usare "tooltip = new Tip" nella vostra routine (questo permetterà solo per 1 tooltip ad essere in uso in un momento, che vorrei assumere è ciò che si vuole come si può solo visibile ). raccolta dei rifiuti dovrebbe prendersi cura di tutto il resto.

Per istanziare la "punta" oggetto si esegue realmente chiamata al costruttore, per esempio semplice chiamata di funzione, che gestiscono e aggiornare l'elemento visivo di conseguenza, ma una volta che l'oggetto non fa riferimento a qualsiasi variabile si suppone essere raccolti da garbage collection. Nel caso in cui si vuole essere sicuri di che si può fare il prossimo:

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

Sembra che questo è in realtà una perdita di memoria in Prototype. Secondo questa , la perdita è fissato in 1,6 .1

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top