Sto usando jquery-ui Tabs e sto riscontrando un problema che si verifica quando una scheda è stata rimossa. La scheda sembra essere rimossa, insieme al suo content div, ma quando dai un'occhiata all'heap in Chrome DevTools Profiles (dopo che una scheda è stata rimossa) vedrai che gli elementi tab li e div sono ancora presenti, ma distaccati . Nel tempo, l'aggiunta/rimozione ripetuta delle schede causa l'accumulo di questi elementi. Ad esempio, se si aggiunge una scheda di 10 volte, ci saranno 10 elementi div unifamiliari e 10 elementi li staccati mostrando nell'istantanea mucchio:Non riesco a ripulire elementi DOM distaccati
ho le seguenti viste:
TabLabel = Marionette.ItemView.extend({
template: "#tab-label",
tagName: "li",
events: {
"click .ui-icon-close": "closeTab"
},
closeTab: function(e) {
this.$el.contents().remove();
this.model.collection.remove(this.model);
$("#main-container").tabs("refresh");
this.close();
}
});
TabContainer = Marionette.ItemView.extend({
template: "#tab-container",
tagName: "div",
onBeforeRender: function() {
this.$el.attr("id", "div-" + this.id);
},
onClose: function() {
// This removes the region that contains the container
App.layout.removeRegion(this.containerRegion);
}
});
TabLabels = Marionette.CollectionView.extend({
tagName: "ul"
});
TabContainers = Marionette.CollectionView.extend({
tagName: "div"
});
le viste sono istanziati in questo modo:
tabs = new TabsCollection(); // Create a new collection instance
var tabLabelView = new TabLabels({
itemView: TabLabel,
collection: tabs
});
var tabContainerView = new TabContainers({
itemView: TabContainer,
collection: tabs
});
come si può vedere, i punti di vista sia riferiscono alla stessa collezione; ogni modello della collezione può essere detto che rappresenta una singola scheda (solo così accade che il modello contenga le informazioni necessarie per soddisfare le schede jquery-ui). Le viste sono mostrate in una regione tramite Marionette.Layout ... piuttosto standard. L'aggiunta di una scheda si ottiene facendo clic su un collegamento nel contenitore della scheda; tutto ciò non fa altro che aggiungere un altro modello alla raccolta e quindi chiamare le schede ("aggiorna") sul contenitore principale, che mostra la nuova scheda. Rimozione di una scheda si ottiene facendo clic su un'icona "X" nell'angolo in alto a destra della scheda.
Ho passato molto tempo a cercare di rintracciare questa perdita e non riesco a capire se si tratta di un problema nel mio codice (il modo in cui sto chiudendo viste/modelli/ecc. Forse?) O se è un problema nel plugin jquery-ui tabs.
Pensieri? Grazie in anticipo!
Update # 1 Come richiesto, ecco un jsfiddle dimostrando il problema - basta chiudere le schede e vedrete che gli elementi staccati sono lasciati alle spalle.
Inoltre, uno screenshot:
Aggiornamento # 2 Questo sembra essere una perdita nelle schede jquery-ui widget. Lo stesso comportamento si verifica nello widget demonstration sul sito Web jquery-ui. Ho aggiunto un paio di schede e poi ha chiuso e abbastanza sicuro, hanno insistito:
Ho provato questo con l'ultima (al momento della stesura di questo) versione di jQuery UI (1.10.3) e la versione precedente (1.10.2).
Puoi pubblicare un jsfiddle dimostrando questo? – Rooster
Mi chiedo se il problema è che il gestore eventi che non viene rimosso –
@JaniHartikainen ho pensato che potrebbe essere il problema, ma ho provato a chiamare più permutazioni di unbind() nella funzione close e i risultati sono gli stessi. – musashiXXX