@@ -76,6 +76,7 @@ class MapService {
7676 _id ; // map id
7777 _config ; // configuration
7878 _map = null ; // map leaflet object
79+ _resizeObserver = null ; // observe le conteneur pour ne recalculer la taille que si elle change réellement
7980
8081 baseModel = { } ;
8182
@@ -95,6 +96,10 @@ class MapService {
9596 * qui s'accumulent au fil des navigations et finissent par saturer la mémoire du navigateur.
9697 */
9798 destroy = function ( ) {
99+ if ( this . _resizeObserver ) {
100+ this . _resizeObserver . disconnect ( ) ;
101+ this . _resizeObserver = null ;
102+ }
98103 if ( this . _map ) {
99104 this . _map . remove ( ) ;
100105 this . _map = null ;
@@ -117,7 +122,7 @@ class MapService {
117122 * 6. Initialise les fonds de tuiles (tiles) de la carte.
118123 * 7. Initialise les couches supplémentaires (layers).
119124 * 8. Initialise les marqueurs sur la carte.
120- * 9. Corrige la taille de la carte à différents intervalles pour éviter les bugs d'affichage liés aux animations ou aux requêtes asynchrones .
125+ * 9. Observe le conteneur et corrige la taille de la carte quand elle change réellement .
121126 *
122127 * @returns {boolean } true si l'initialisation a réussi, false sinon.
123128 */
@@ -127,6 +132,13 @@ class MapService {
127132 return ;
128133 }
129134
135+ // init() peut être rappelé sans destroy() (ex: watch height dans base-map.vue) ;
136+ // on coupe l'éventuel observer précédent pour ne pas en empiler plusieurs.
137+ if ( this . _resizeObserver ) {
138+ this . _resizeObserver . disconnect ( ) ;
139+ this . _resizeObserver = null ;
140+ }
141+
130142 // 2. Crée l'objet carte Leaflet avec des options de zoom personnalisées.
131143 this . _map = L . map ( this . _id , {
132144 zoomSnap : 0.1 , // Précision du zoom (fraction de niveau de zoom)
@@ -151,12 +163,22 @@ class MapService {
151163 // 8. Initialise les marqueurs sur la carte.
152164 this . initMarkers ( ) ;
153165
154- // 9. Corrige la taille de la carte à différents intervalles pour éviter les bugs d'affichage
155- // (utile lors d'animations ou de chargements asynchrones).
156- for ( const delay of [ 100 , 1000 , 2000 , 5000 , 10000 ] ) {
157- setTimeout ( ( ) => {
158- this . _map . invalidateSize ( ) ;
159- } , delay ) ;
166+ // 9. Corrige la taille de la carte quand son conteneur change réellement de dimensions
167+ // (layout Vuetify qui se stabilise, panneau qui s'ouvre/ferme, etc.), au lieu de
168+ // la deviner via une salve de setTimeout qui rechargeait les tuiles en aveugle et
169+ // provoquait des annulations de requêtes (NS_BINDING_ABORTED) visibles dans Firefox.
170+ const container = document . getElementById ( this . _id ) ;
171+ if ( container && typeof ResizeObserver !== 'undefined' ) {
172+ let debounce ;
173+ this . _resizeObserver = new ResizeObserver ( ( ) => {
174+ clearTimeout ( debounce ) ;
175+ debounce = setTimeout ( ( ) => {
176+ if ( this . _map ) {
177+ this . _map . invalidateSize ( ) ;
178+ }
179+ } , 100 ) ;
180+ } ) ;
181+ this . _resizeObserver . observe ( container ) ;
160182 }
161183
162184 // Retourne true si l'initialisation s'est déroulée correctement.
0 commit comments