Leaflet: μ§€λ„λŠ” DOM의 map.remove()μ—μ„œ μ™„μ „νžˆ μ œκ±°λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2017λ…„ 09μ›” 13일  Β·  37μ½”λ©˜νŠΈ  Β·  좜처: Leaflet/Leaflet

λ²ˆμ‹ 방법

  • λ‚΄κ°€ μ‚¬μš©ν•˜λŠ” 전단지 버전: 1.2.0
  • μ‚¬μš© 쀑인 λΈŒλΌμš°μ €(버전 포함): Chrome 버전 60.0.3112.113
  • Firefox 및 Safariμ—μ„œ 잘 μž‘λ™ν•©λ‹ˆλ‹€(IE, Edgeμ—μ„œλŠ” ν…ŒμŠ€νŠΈλ˜μ§€ μ•ŠμŒ).
  • OS/ν”Œλž«νΌ(버전 포함) μ‚¬μš© 쀑인: macOS Sierra
  • div μš”μ†Œμ— 맡 μΆ”κ°€ 및 λ ˆμ΄μ–΄ μΆ”κ°€
this.leafletMap = new L.Map( <element> , {
            zoomControl: true, 
            dragging: this.isInDragMode, 
            touchZoom: false,
            scrollWheelZoom: false,
            doubleClickZoom: false,
            tap: false,
}
L.tileLayer( 'http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
            attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
                } ).addTo( this.leafletMap );
  • 일뢀 μ‚¬μš©μž μž‘μ—…μ—μ„œ 지도 제거
if (this.leafletMap ){
        this.leafletMap.eachLayer(function(layer){
            layer.remove();
        });
        this.leafletMap.remove();
        this.leafletMap = null;
    }

λ‚΄κ°€ κΈ°λŒ€ν•˜λŠ” 행동과 λ‚΄κ°€ 보고 μžˆλŠ” 행동

  • 지도λ₯Ό μ œκ±°ν•˜λ©΄ μš”μ†Œμ—μ„œ 지도가 μ œκ±°λ˜μ§€λ§Œ divλ₯Ό 두 번 ν΄λ¦­ν•˜λ©΄ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. Uncaught TypeError: Cannot read property '_leaflet_pos' of undefined
    지도와 λ ˆμ΄μ–΄κ°€ μ œκ±°λ˜μ—ˆμ§€λ§Œ DOM μš”μ†ŒλŠ” μ—¬μ „νžˆ 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό λ³΄μœ ν•˜κ³  μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

문제λ₯Ό μž¬ν˜„ν•˜λŠ” μ΅œμ†Œν•œμ˜ 예

  • [ ] 이 μ˜ˆλŠ” κ°€λŠ₯ν•œ ν•œ κ°„λ‹¨ν•©λ‹ˆλ‹€.
  • [ ] 이 μ˜ˆμ œλŠ” 타사 μ½”λ“œμ— μ˜μ‘΄ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

http://playground-leaflet.rhcloud.com/ λ˜λŠ” 기타 jsfiddleκ³Ό μœ μ‚¬ν•œ μ‚¬μ΄νŠΈ μ‚¬μš©.

needs more info

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@spydmobile이 여기에 μžˆμŠ΅λ‹ˆλ‹€. 이것은 λ‚΄κ°€ μ•½κ°„ μˆ˜μ •λœ ν˜•νƒœλ‘œ μˆ˜ν–‰ν•œ κ²ƒμž…λ‹ˆλ‹€.
이 λΉŒμ–΄λ¨Ήμ„ λŒ“κΈ€ ν•„λ“œμ— μ½”λ“œλ₯Ό μ œλŒ€λ‘œ κ²Œμ‹œν•˜λŠ” 방법을 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. μ£„μ†‘ν•©λ‹ˆλ‹€.
μ§€κΈˆ 제 λŒ“κΈ€μ„ 10λ²ˆμ •λ„ μˆ˜μ •ν–ˆμ–΄μš” γ…‹γ…‹γ…‹γ…‹

function removeMap()
{
    var leafletCtrl = get_your_own_leaflet_reference_from_somewhere(), 
    dom = leafletCtrl.getReferenceToContainerDomSomehow(); 

    //This removes most of the events
    leafletCtrl.off();

//After this, the dom element should be good to reuse, unfortunatly it is not
    leafletCtrl.remove(); 

    var removeDanglingEvents = function(inputObj, checkPrefix)
    {
        if(inputObj !== null)
        {
            //Taken from the leaflet sourcecode directly, you can search for these constants and see how those events are attached, why they are never fully removed i don't know
            var msPointer = L.Browser.msPointer,
            POINTER_DOWN =   msPointer ? 'MSPointerDown'   : 'pointerdown',
            POINTER_MOVE =   msPointer ? 'MSPointerMove'   : 'pointermove',
            POINTER_UP =     msPointer ? 'MSPointerUp'     : 'pointerup',
            POINTER_CANCEL = msPointer ? 'MSPointerCancel' : 'pointercancel';

            for(var prop in inputObj)
            {
                var prefixOk = checkPrefix ? prop.indexOf('_leaflet_') !== -1 : true, propVal; //if we are in the _leaflet_events state kill everything, else only stuff that contains the string '_leaflet_'
                if(inputObj.hasOwnProperty(prop) && prefixOk)
                {
                    //Map the names of the props to the events that were really attached => touchstart equals POINTER_DOWN etc
                    var evt = []; 
                    if(prop.indexOf('touchstart') !== -1) //indexOf because the prop names are really weird 'touchstarttouchstart36' etc
                    {
                        evt = [POINTER_DOWN];
                    }
                    else if(prop.indexOf('touchmove') !== -1)
                    {
                        evt = [POINTER_MOVE];
                    }
                    else if(prop.indexOf('touchend') !== -1)
                    {
                        evt = [POINTER_UP, POINTER_CANCEL];
                    }

                    propVal = inputObj[prop];
                    if(evt.length > 0 && typeof propVal === 'function')
                    {
                        evt.each(function(domEvent)
                        {
                            dom.removeEventListener(domEvent, propVal, false);
                        });                    
                    }

                    //Reference B-GONE, Garbage b collected.
                    inputObj[prop] = null;
                    delete inputObj[prop];
                }
            }
        }        
    };

    removeDanglingEvents(dom._leaflet_events, false);
    removeDanglingEvents(dom, true);
}

λͺ¨λ“  37 λŒ“κΈ€

μ•ˆλ…•ν•˜μ„Έμš”. μ‹œκ°„μ„ λ‚΄μ–΄ 이 버그λ₯Ό μ‹ κ³ ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 문제λ₯Ό μž¬ν˜„ν•˜κΈ° μœ„ν•΄ μ„€λͺ…ν•˜λŠ” λ‹¨κ³„μ—μ„œ λˆ„λ½λœ 뢀뢄이 μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. μœ„μ˜ 단계λ₯Ό 따라 ν•  수 μžˆλŠ” κ²ƒμ²˜λŸΌ 놀이터 예제λ₯Ό μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€. http://playground-leaflet.rhcloud.com/rezop/edit?html ,output

이 μ˜ˆμ—μ„œλŠ” 지도가 제거된 ν›„ 였λ₯˜λ₯Ό λ³Ό 수 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ ν˜„μž¬ 보고 μžˆλŠ” 문제λ₯Ό μΌμœΌν‚€λŠ” 더 λ§Žμ€ μž‘μ—…μ΄ μ§„ν–‰λ˜κ³  μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 좔적할 수 μžˆλ„λ‘ 더 μžμ„Έν•œ 정보λ₯Ό μ œκ³΅ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ?

@perliedman λΉ λ₯Έ 응닡과 놀이터 예제λ₯Ό ν•¨κ»˜

map.remove() ν•˜λŠ” 경우 λͺ…μ‹œμ μΈ λ ˆμ΄μ–΄ μ œκ±°κ°€ ν•„μš”ν•©λ‹ˆκΉŒ? λ‚΄ μƒκ°μ—λŠ” λ ˆμ΄μ–΄ μ œκ±°λ„ μ²˜λ¦¬ν•˜μ§€λ§Œ 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ?

그리고 timeout μ•„λž˜μ— map.remove()κ°€ μžˆλŠ” μ΄μœ λŠ” μ˜ˆμ œμ—μ„œ 생성 직후 맡을 νŒŒκ΄΄ν•˜κ³  있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ νƒ€μž„μ•„μ›ƒμœΌλ‘œ 묢을 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. μ˜³μ€?

μ˜€ν”ˆ μ†ŒμŠ€λ‘œ μž‘μ—…ν•  λ•Œ μ†ŒμŠ€λ₯Ό _μ‚¬μš©_ν•œλ‹€λŠ” 것을 κΈ°μ–΅ν•˜μ‹­μ‹œμ˜€! :wink: 첫 번째 μ§ˆλ¬Έμ— λ‹΅ν•˜κΈ° μœ„ν•΄ _yes_, remove κ°€ λ ˆμ΄μ–΄λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€: https://github.com/Leaflet/Leaflet/blob/master/src/map/Map.js#L731

νƒ€μž„μ•„μ›ƒμ— 넣은 μ΄μœ λŠ” 타일 λ ˆμ΄μ–΄κ°€ μ‹€μ œλ‘œ λ‘œλ“œλœ 타일 λ“±μœΌλ‘œ μ œλŒ€λ‘œ μ΄ˆκΈ°ν™”λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜μ—¬ λ‚΄ 예제λ₯Ό μ’€ 더 ν˜„μ‹€μ μœΌλ‘œ λ§Œλ“€κΈ° μœ„ν•¨μ΄μ—ˆμŠ΅λ‹ˆλ‹€. μ˜ˆμ œλŠ” remove ν˜ΈμΆœμ„ 넣지 μ•Šκ³ λ„ 잘 μž‘λ™ν•©λ‹ˆλ‹€. μ‹œκ°„ μ΄ˆκ³Όμ΄μ§€λ§Œ μ•½κ°„μ˜ 인곡 ν…ŒμŠ€νŠΈμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš”. 저도 이 문제λ₯Ό κ²ͺκ³  μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. λ‚΄ κΈ°λ³Έ μ‚¬μš© μ‚¬λ‘€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μ‹€μ œ 지도λ₯Ό ν‘œμ‹œν•˜λŠ” κ²ƒκ³ΌλŠ” λŒ€μ‘°μ μœΌλ‘œ μ—¬λŸ¬ νŽ˜μ΄μ§€/ν‘œλ©΄μ΄ μžˆλŠ” κ°œμ²΄μ— λŒ€ν•œ λ·°μ–΄ ꡬ성 μš”μ†Œ( Leaflet-IIIF ν”ŒλŸ¬κ·ΈμΈμ„ μ‚¬μš©ν•˜μ§€λ§Œ μ—¬κΈ°μ„œλŠ” 아무 영ν–₯도 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€)λ₯Ό λ§Œλ“€κ³  μžˆμŠ΅λ‹ˆλ‹€. λ·°μ–΄κ°€ λ‘œλ“œλ˜λ©΄ μ‚¬μš©μžκ°€ ν΄λ¦­ν•˜μ—¬ UI의 쀑앙 μ˜μ—­μ— ν‘œμ‹œλ˜λŠ” 개체 보기λ₯Ό μ—…λ°μ΄νŠΈν•  수 μžˆλŠ” 일련의 μΆ•μ†ŒνŒμ΄ μžˆμŠ΅λ‹ˆλ‹€.

μ‚¬μš©μžκ°€ 보기λ₯Ό λ³€κ²½ν•  λ•Œ μƒˆ 보기에 λŒ€ν•œ μƒˆ 지도λ₯Ό μ„€μ •ν•˜κΈ° 전에 map.remove() λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. μƒˆ 맡은 이전 맡과 λ™μΌν•œ DOM μš”μ†Œ(IDκ°€ μžˆλŠ” div)에 μƒμ„±λ˜λ©°, μ €λŠ” Leaflet μ™ΈλΆ€μ—μ„œ DOM을 μˆ˜μ •ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

초기 λ³΄κΈ°μ—μ„œλŠ” λͺ¨λ“  것이 잘 μž‘λ™ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ map.remove() ν˜ΈμΆœν•˜κ³  μƒˆ 보기λ₯Ό ν‘œμ‹œν•œ ν›„ μ½˜μ†”μ€ 지도λ₯Ό λŒκ±°λ‚˜ ν™•λŒ€/μΆ•μ†Œν•  λ•Œλ§ˆλ‹€ Cannot read property '_leaflet_pos' of undefined ν•©λ‹ˆλ‹€.

μ–΄λŠ μ‹œμ μ—μ„œ μ΅œμ†Œν•œμ˜ 예λ₯Ό κ²Œμ‹œν•˜λ €κ³  ν•  수 μžˆμ§€λ§Œ 이것은 λ™μΌν•œ 문제인 것 κ°™μŠ΅λ‹ˆλ‹€. 이 였λ₯˜λŠ” Chromeμ—μ„œλŠ” λ‚˜νƒ€λ‚˜μ§€λ§Œ Firefoxμ—μ„œλŠ” λ‚˜νƒ€λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

@egardner λ„€, 이것을 μž¬ν˜„ν•˜λŠ” 예제λ₯Ό λ§Œλ“€μ–΄ λ³΄μ„Έμš”!

@egardner 이전에 μ•ˆμ •μ μΈ μ „μž(크둬 + λ…Έλ“œ) μ•±μ—μ„œ λ™μΌν•œ 문제둜 λ˜λŒλ €μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.
"λ¦¬ν”Œλ¦Ώ": "1.0.0",
"leaflet.markercluster": "1.0.0-rc.1.0"
1.2.0μ—μ„œ 였λ₯˜λ₯Ό μ œκ±°ν•˜λ €λ©΄ μ •μ˜λ˜μ§€ μ•Šμ€ 속성 '_leaflet_pos'λ₯Ό 읽을 수 μ—†μŠ΅λ‹ˆλ‹€.
이것은 λ™μΌν•œ DOM μš”μ†Œμ—μ„œ 지도λ₯Ό λ‹€μ‹œ λ§Œλ“€κΈ° 전에 map.remove() 이후에도 λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. μ§€κΈˆ λ‹Ήμž₯은 λ‹¨κΈ°μ μœΌλ‘œ λ§Œλ“€κ³  μ˜ˆμ‹œν•  μ‹œκ°„μ΄ μ—†μŠ΅λ‹ˆλ‹€.

μš°λ¦¬λŠ” λ˜ν•œ 지도λ₯Ό νŒŒκ΄΄ν•˜λ €κ³  μ‹œλ„ν•˜λŠ” μœ μ‚¬ν•œ 문제λ₯Ό κ²½ν—˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€, 그것은 μ°Έμ‘°λ₯Ό μœ μ§€ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€

μœ„μ—μ„œ λ§ν•œ 것을 λ°˜λ³΅ν•˜κ² μŠ΅λ‹ˆλ‹€. 이 λ¬Έμ œμ— λŒ€ν•΄ 무엇이든 ν•  수 μžˆλ„λ‘ 문제λ₯Ό μž¬ν˜„ν•˜λŠ” 예λ₯Ό μ œκ³΅ν•˜μ‹­μ‹œμ˜€.

μ•ˆλ…•ν•˜μ„Έμš”. λ‚˜λŠ” λ°”μ΄μ˜¬λ¦°μ—μ„œμ΄ 였λ₯˜λ₯Ό μž¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€. κ°„λ‹¨νžˆ λ§ν•΄μ„œ div μš”μ†Œ 내뢀에 맡을 λ§Œλ“  λ‹€μŒ remove λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œ λ‹€μŒ λ™μΌν•œ div에 맡을 λ‹€μ‹œ μ±„μš°λ©΄ λͺ¨λ“  맡 이동이 였λ₯˜λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
μž‘νžˆμ§€ μ•Šμ€ TypeError: μ •μ˜λ˜μ§€ μ•Šμ€ '_leaflet_pos' 속성을 읽을 수 μ—†μŠ΅λ‹ˆλ‹€.

μž¬ν˜„ν•˜λ €λ©΄ λ‚΄ λ°”μ΄μ˜¬λ¦°μ„ μ—΄κ³  지도 제거λ₯Ό ν΄λ¦­ν•˜κ³  지도 μœ„μΉ˜λ₯Ό ν΄λ¦­ν•œ λ‹€μŒ μ½˜μ†”μ„ μ—΄κ³  지도λ₯Ό μ΄λ™ν•©λ‹ˆλ‹€.
http://jsfiddle.net/spydmobile/5hmadjnk/

FFκ°€ μ•„λ‹Œ Chormeμ—μ„œλ§Œ λ°œμƒν•©λ‹ˆλ‹€.

예 spydmobile 예λ₯Ό λ“€μ–΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. μœ„μ—μ„œ λ³΄κ³ ν•œ 것과 λ™μΌν•œ 였λ₯˜κ°€ Chromeμ—μ„œ ν‘œμ‹œλ©λ‹ˆλ‹€.

λ™μΌν•œ 였λ₯˜κ°€ ν‘œμ‹œλ˜μ§€λ§Œ μ‚¬μš© 사둀가 μ•½κ°„ λ‹€λ¦…λ‹ˆλ‹€. invalidateSize 호좜둜 인해 크기 μ‘°μ • μ‹œ λ™μΌν•œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

Uncaught TypeError: Cannot read property '_leaflet_pos' of undefined
    at getPosition (leaflet-src.js:2765)
    at NewClass._getMapPanePos (leaflet-src.js:4378)
    at NewClass._rawPanBy (leaflet-src.js:4180)
    at NewClass.invalidateSize (leaflet-src.js:3509)
    at NewClass.<anonymous> (leaflet-src.js:4244)

전체 호좜 μŠ€νƒμ€ _onResize ν•Έλ“€λŸ¬μ—μ„œ μ‹œμž‘λ©λ‹ˆλ‹€. react-leaflet μžˆμ§€λ§Œ μŠ€νƒ μΆ”μ μ˜ μ–΄λ–€ 뢀뢄도 λ¬Έμ œκ°€ λ˜λŠ” 둜컬 μ½”λ“œλ‚˜ ν•΄λ‹Ή μ½”λ“œλ₯Ό 가리킀지 μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” λͺ‡ 가지 이전 버전(예: 1.0.3 및 1.2.0 )을 μ‹œλ„ν–ˆμ§€λ§Œ νŠΉμ • 1.x.x λ²„μ „μœΌλ‘œ μž κΈ€ 수 μžˆμ„ 것이라고 μƒκ°ν–ˆμ§€λ§Œ 운이 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

이에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ? λ‚΄ μ‘μš© ν”„λ‘œκ·Έλž¨μ— 전단지λ₯Ό ν†΅ν•©ν•˜λŠ” 것과 λ™μΌν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 지도가 파괴된 후에도 dom μš”μ†Œμ—λŠ” μ—¬μ „νžˆ _leaflet_events 속성이 μžˆμ§€λ§Œ 이 개체λ₯Ό μ œκ±°ν•˜λŠ” 것도 도움이 λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

처리기 ν•¨μˆ˜μ˜ μ»¨ν…μŠ€νŠΈκ°€ 였래된 것 κ°™μŠ΅λ‹ˆλ‹€(처리기 인수의 _mapPane 개인 속성이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μš”μ†Œλ₯Ό 가리킴).

저도 이것을 κ²ͺκ³  μžˆμŠ΅λ‹ˆλ‹€. 이것은 λ‚΄κ°€λ³΄κ³ μžˆλŠ” μ˜ˆμ™Έ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

https://sentry.io/share/issue/b414c58ea85c44ee9e0e40ad0781883a/

이것은 μ‚¬μš©μžκ°€ λΈŒλΌμš°μ € λ’€λ‘œ λ²„νŠΌμ„ μ‚¬μš©ν•˜μ—¬ 지도λ₯Ό λ– λ‚  λ•Œ 주둜 λ°œμƒν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

해결책을 μ°Ύμ•˜μ„ μˆ˜λ„ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

Map μ»¨ν…Œμ΄λ„ˆ divμ—λŠ” map.off 및 map.remove 이후에도 λ°œμƒν•˜λŠ” 일뢀 μ΄λ²€νŠΈκ°€ μ—¬μ „νžˆ μžˆμŠ΅λ‹ˆλ‹€.

제 κ²½μš°μ—λŠ” 지도에 _leaflet_ μ‹œμž‘ν•˜λŠ” 속성이 있고 ν•΄λ‹Ή κΈ°λŠ₯ 쀑 μΌλΆ€λŠ” "map._leaflet_events". μ†μ„±μ˜ 지도 μžμ²΄μ— μžˆλŠ” κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬μŠ΅λ‹ˆλ‹€.

pointerdown , pointermove λ“±μœΌλ‘œ μ²¨λΆ€λœ 것 κ°™μ§€λ§Œ μ†μ„±μ˜ 이름은 map._leaflet_touchstarttouchstart32 λ“±κ³Ό κ°™μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 그것듀을 λ°˜λ³΅ν•˜κ³  μˆ˜λ™μœΌλ‘œ μ œκ±°ν•˜λ©΄( removeEventListener λ‹€μŒ 쒋은 츑정을 μœ„ν•΄ 속성 자체λ₯Ό null둜 λ§Œλ“€κ³  μ‚­μ œ), λ‹€λ₯Έ 맡에 divλ₯Ό μž¬μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.
이것은 λ˜ν•œ 내가보고 있던 λ©”λͺ¨λ¦¬ λˆ„μˆ˜μ— 쒅지뢀λ₯Ό μ°μ—ˆμŠ΅λ‹ˆλ‹€.

여기에 μ½”λ“œλ₯Ό κ²Œμ‹œν•  μˆ˜λŠ” μ—†μ§€λ§Œ POINTER_DOWN λŒ€ν•œ 전단지 μ†ŒμŠ€λ₯Ό κ²€μƒ‰ν•˜λ©΄ μ²¨λΆ€λœ 이벀트λ₯Ό λ³Ό 수 있고 이λ₯Ό λΆ„λ¦¬ν•˜λŠ” 방법을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

Chromeμ—μ„œλΏλ§Œ μ•„λ‹ˆλΌ FFμ—μ„œλ„ μž¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€(λ‚΄ ν”„λ‘œμ νŠΈμ™€ @spydmobileμ—μ„œ μ œκ³΅ν•˜λŠ” jsfiddle λͺ¨λ‘ μ‚¬μš©)

@FLoibl μ•„λ§ˆλ„ ν•΄κ²° 방법에 μ„±κ³΅μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” κΈ°μˆ μ„ 보여주기 μœ„ν•΄ λ‹€λ₯Έ 곳에 κ²Œμ‹œλœ μš”μ , λ°”μ΄μ˜¬λ¦° λ˜λŠ” 일뢀 μŠ€λ‹ˆνŽ«μ΄ μžˆμŠ΅λ‹ˆκΉŒ?

@spydmobile이 여기에 μžˆμŠ΅λ‹ˆλ‹€. 이것은 λ‚΄κ°€ μ•½κ°„ μˆ˜μ •λœ ν˜•νƒœλ‘œ μˆ˜ν–‰ν•œ κ²ƒμž…λ‹ˆλ‹€.
이 λΉŒμ–΄λ¨Ήμ„ λŒ“κΈ€ ν•„λ“œμ— μ½”λ“œλ₯Ό μ œλŒ€λ‘œ κ²Œμ‹œν•˜λŠ” 방법을 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. μ£„μ†‘ν•©λ‹ˆλ‹€.
μ§€κΈˆ 제 λŒ“κΈ€μ„ 10λ²ˆμ •λ„ μˆ˜μ •ν–ˆμ–΄μš” γ…‹γ…‹γ…‹γ…‹

function removeMap()
{
    var leafletCtrl = get_your_own_leaflet_reference_from_somewhere(), 
    dom = leafletCtrl.getReferenceToContainerDomSomehow(); 

    //This removes most of the events
    leafletCtrl.off();

//After this, the dom element should be good to reuse, unfortunatly it is not
    leafletCtrl.remove(); 

    var removeDanglingEvents = function(inputObj, checkPrefix)
    {
        if(inputObj !== null)
        {
            //Taken from the leaflet sourcecode directly, you can search for these constants and see how those events are attached, why they are never fully removed i don't know
            var msPointer = L.Browser.msPointer,
            POINTER_DOWN =   msPointer ? 'MSPointerDown'   : 'pointerdown',
            POINTER_MOVE =   msPointer ? 'MSPointerMove'   : 'pointermove',
            POINTER_UP =     msPointer ? 'MSPointerUp'     : 'pointerup',
            POINTER_CANCEL = msPointer ? 'MSPointerCancel' : 'pointercancel';

            for(var prop in inputObj)
            {
                var prefixOk = checkPrefix ? prop.indexOf('_leaflet_') !== -1 : true, propVal; //if we are in the _leaflet_events state kill everything, else only stuff that contains the string '_leaflet_'
                if(inputObj.hasOwnProperty(prop) && prefixOk)
                {
                    //Map the names of the props to the events that were really attached => touchstart equals POINTER_DOWN etc
                    var evt = []; 
                    if(prop.indexOf('touchstart') !== -1) //indexOf because the prop names are really weird 'touchstarttouchstart36' etc
                    {
                        evt = [POINTER_DOWN];
                    }
                    else if(prop.indexOf('touchmove') !== -1)
                    {
                        evt = [POINTER_MOVE];
                    }
                    else if(prop.indexOf('touchend') !== -1)
                    {
                        evt = [POINTER_UP, POINTER_CANCEL];
                    }

                    propVal = inputObj[prop];
                    if(evt.length > 0 && typeof propVal === 'function')
                    {
                        evt.each(function(domEvent)
                        {
                            dom.removeEventListener(domEvent, propVal, false);
                        });                    
                    }

                    //Reference B-GONE, Garbage b collected.
                    inputObj[prop] = null;
                    delete inputObj[prop];
                }
            }
        }        
    };

    removeDanglingEvents(dom._leaflet_events, false);
    removeDanglingEvents(dom, true);
}

μ•„, νŠΈλ¦¬ν”Œ λ°±ν‹±, μ•Œκ² μŠ΅λ‹ˆλ‹€.

@FLoibl 이것은 μ•„μ£Ό 쒋은 μ‘°μ‚¬μž…λ‹ˆλ‹€ :+1:

λ‘œκΉ…μ„ μΆ”κ°€ν•΄ μ£Όμ‹œκ² μŠ΅λ‹ˆκΉŒ...? https://github.com/Leaflet/Leaflet/blob/5161140e952969c5da27751b79154a2c93f53bfa/src/dom/DomEvent.Pointer.js#L39/DomEvent.Pointer.js#L39 및 https://github.com/Leaflet/Leaflet/blob/fe9380 js#L133

그것듀 은 L.Map κ°€ 파괴될 λ•Œ λͺ¨λ“  μ΄λ²€νŠΈμ— λŒ€ν•΄ μ‹€ν–‰ λ˜μ–΄μ•Ό ν•˜κ³ , 당신이 ν•˜κ³  μžˆλŠ” 것과 같은 일을 ν•΄μ•Ό ν•˜μ§€λ§Œ, μ™œ 그것이 μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

예, λ‚˜λŠ” κ·Έ κΈ°λŠ₯을 μ•Œκ³  있고 그것이 ν˜ΈμΆœλœλ‹€λŠ” 것을 μ•Œμ§€λ§Œ λͺ¨λ“  μ΄λ²€νŠΈμ— λŒ€ν•΄ κ·Έλ ‡μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

λ¬Έμ œλŠ” μ½”λ“œκ°€ dom에 "pointermove" λ“±μœΌλ‘œ μ²¨λΆ€ν•˜μ§€λ§Œ 속성 이름은 "touchstart" λ“±μ΄λΌλŠ” κ²ƒμž…λ‹ˆλ‹€. λ˜ν•œ "touchstart"λΌλŠ” 단어가 속성 이름에 두 번 ν‘œμ‹œλ©λ‹ˆλ‹€. 아이디와 이벀트λͺ…?

λ˜ν•œ μ΄λŸ¬ν•œ "포인터" μ΄λ²€νŠΈλŠ” ν„°μΉ˜μŠ€ν¬λ¦°μ΄ μ—†λŠ” Windows 10 및 Chrome에도 μ²¨λΆ€λ˜μ–΄μ•Ό ν•©λ‹ˆκΉŒ?
λΆˆν–‰νžˆλ„, λ‚˜λŠ” μ‹€μ œ μˆ˜μ •μ„ μ œκ³΅ν•˜κΈ° μœ„ν•΄ 전단지 λ‚΄λΆ€ μž‘λ™μ— λŒ€ν•΄ μΆ©λΆ„νžˆ μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€ :-(

λ‚˜λŠ” κ·Έ κΈ°λŠ₯을 μ•Œκ³  있고 그것이 ν˜ΈμΆœλœλ‹€λŠ” 것을 μ•Œμ§€λ§Œ λͺ¨λ“  μ΄λ²€νŠΈμ— λŒ€ν•΄ κ·Έλ ‡μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

이제 μ§ˆλ¬Έμ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. removePointerListener κ°€ 호좜 λ˜μ§€ μ•Šμ€ μ΄λ²€νŠΈλŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? μ—¬κΈ° 저기에 ν•¨μˆ˜ 호좜이 λˆ„λ½λ˜μ—ˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ μ΄λŸ¬ν•œ "포인터" μ΄λ²€νŠΈλŠ” ν„°μΉ˜μŠ€ν¬λ¦°μ΄ μ—†λŠ” Windows 10 및 Chrome에도 μ²¨λΆ€λ˜μ–΄μ•Ό ν•©λ‹ˆκΉŒ?

예. μ‹œμŠ€ν…œμ— ν„°μΉ˜μŠ€ν¬λ¦°μ΄ μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό κ°μ§€ν•˜λŠ” 것은 거의 λΆˆκ°€λŠ₯ν•˜λ―€λ‘œ λΈŒλΌμš°μ €κ°€ 포인터 이벀트λ₯Ό μ§€μ›ν•˜λŠ” 경우 포인터 μ΄λ²€νŠΈκ°€ μ‚¬μš©λ  것이라고 κ°€μ • ν•©λ‹ˆλ‹€.

λ‚˜λŠ” μ‹€μ œ μˆ˜μ •μ„ μ œκ³΅ν•˜κΈ° μœ„ν•΄ 전단지 λ‚΄λΆ€ μž‘λ™μ— λŒ€ν•΄ μΆ©λΆ„νžˆ μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€ :-(

이봐, μ ˆλ§ν•˜μ§€ 마, 이것은 ν›Œλ₯­ν•œ 쑰사 μž‘μ—…μ΄μ•Ό! :웃닀:

이 λ²„κ·ΈλŠ” 버전 1.0.3μ—λŠ” μ—†μŠ΅λ‹ˆλ‹€. @spydmobile jsfiddle을 μ„ νƒν•˜κ³  전단지 버전을 λ³€κ²½ν•˜λ©΄ 였λ₯˜κ°€ μ‚¬λΌμ§‘λ‹ˆλ‹€ http://jsfiddle.net/5hmadjnk/47/ . 버전 1.1.0μ—μ„œλŠ” 이미 μžˆμŠ΅λ‹ˆλ‹€.

@benru89 이 λ²„κ·ΈλŠ” μ‹€μ œλ‘œ https://github.com/Leaflet/Leaflet/issues/5263 의 ν˜•νƒœλ‘œ 1.0.3에 μ‘΄μž¬ν–ˆμŠ΅λ‹ˆλ‹€(λŒ€λΆ€λΆ„ https://github.com/Leaflet/Leaflet/pull/에 μ˜ν•΄ μˆ˜μ •λ¨). 5265).

1.1.0에 1.0.3μ—μ„œμ˜ λ³€ν™”λŠ” λ˜ν•œ ν˜„μž¬ μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 영ν–₯을 L.Mixin.Events λ‚˜λŠ”μ΄λ˜μ§€λ„ ν•¨κ»˜ 잘 μ•„λž˜λ‘œ 좔적 ν•  수 μžˆλ‹€κ³  μƒκ°ν•˜μ§€ μ•Šλ„λ‘ν•˜κ³ , rollupJS λΉŒλ“œλ₯Ό git bisect .

@IvanSanchez 1.0.3κ³Ό 1.1.0의 제거 κΈ°λŠ₯을 비ꡐ

for (i in this._panes) {
    remove(this._panes[i]);
}
this._layers = [];
this._panes = [];
delete this._mapPane;
delete this._renderer;

μ—¬μ„― 번째 쀄을 μ œκ±°ν•˜λ©΄ mapPane을 μ‚­μ œν•˜λŠ” 였λ₯˜κ°€ μ‚¬λΌμ§‘λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이것을 μ œκ±°ν•˜λŠ” κ²ƒμ˜ 영ν–₯은 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. mapPane이 μ‚­μ œλ˜μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•˜μ§€λ§Œ 이 λ²„κ·ΈλŠ” ν•΄λ‹Ή 쀄이 μΆ”κ°€λ˜μ—ˆμ„ λ•Œ ν™•μ‹€νžˆ λ„μž…λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

@benru89 와, 그것도 쒋은 정보

μ§€κΈˆμ€ 지도 창에 μ–΄λ–€ 포인터 이벀트 ν•Έλ“€λŸ¬κ°€ μžˆλŠ”μ§€ μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.

지도 창을 μ œκ±°ν•˜μ§€ μ•ŠμŒμœΌλ‘œμ¨ 문제λ₯Ό 가릴 뿐이라고 μƒκ°ν•©λ‹ˆλ‹€. 호좜 μŠ€νƒμ„ μΆ”μ ν–ˆμ„ λ•Œ λ¬Έμ œλŠ” 일뢀 _mapPane κ°œμ²΄κ°€ 파괴된 dom μš”μ†Œλ₯Ό 가리킀고 μžˆμœΌλ―€λ‘œ μ •μ˜λ˜μ§€ μ•Šμ€ μœ„μΉ˜μ—μ„œ μΊμ‹œλœ μœ„μΉ˜λ₯Ό μ–»μœΌλ €κ³  ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 창이 νŒŒκ΄΄λ˜μ§€ μ•ŠμœΌλ©΄ 고슀트 μ΄λ²€νŠΈκ°€ μ˜ˆμ™Έλ₯Ό νŠΈλ¦¬κ±°ν•˜μ§€ μ•Šκ³  진행될 수 μžˆμŠ΅λ‹ˆλ‹€.

@Floibl λ‚˜λŠ” λ‹Ήμ‹ μ—κ²Œ λ™μ˜ν•©λ‹ˆλ‹€. λ‚˜λŠ” 그것이 해결책이 μ•„λ‹ˆλΌκ³  μƒκ°ν•˜μ§€λ§Œ 호좜 μŠ€νƒμ„ 확인할 λ•Œ null _mapPane을 λ°œκ²¬ν–ˆκΈ° λ•Œλ¬Έμ— κ·Έ 쀄을 μ œκ±°ν•˜μ§€ μ•ŠμœΌλ €κ³  μ‹œλ„ν–ˆμŠ΅λ‹ˆλ‹€. μ†”λ£¨μ…˜μ€ λ‚΄κ°€ μΆ”μΈ‘ν•˜λŠ” 이벀트 ν•Έλ“€λŸ¬λ₯Ό μ μ ˆν•˜κ²Œ μ œκ±°ν•˜λŠ” 츑면에 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.

λ‚˜λŠ” 이것을 μΌμœΌν‚€λŠ” 이벀트 ν•Έλ“€λŸ¬(적어도 λ‚΄ κ²½μš°μ—λŠ” @spydmobile )λ₯Ό "touchExtend"라고 ν•˜λ―€λ‘œ leaflet.draw ν•Έλ“€λŸ¬μž…λ‹ˆλ‹€. λ‚˜λŠ” leaflet.draw에 λŒ€ν•œ κ°€μ Έμ˜€κΈ°λ₯Ό μ œκ±°ν•˜λ©΄ μ˜ˆμ™Έλ„ μ€‘μ§€λœλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€.

λ‹€λ₯Έ ν•΄κ²° 방법을 μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. λ¬Έμ„œν™”λ˜μ§€ μ•Šμ€ μ˜΅μ…˜ touchExtend : false 지도λ₯Ό μ΄ˆκΈ°ν™”ν•˜λ©΄ λ¬Έμ œκ°€ μžˆλŠ” ν•Έλ“€λŸ¬κ°€ λΉ„ν™œμ„±ν™”λ˜λ―€λ‘œ 더 이상 μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” κ·Έλ ‡κ²Œν•¨μœΌλ‘œμ¨ μ–΄λ–€ κΈ°λŠ₯을 μžƒμ–΄ λ²„λ ΈλŠ”μ§€ μ •λ§λ‘œ λͺ¨λ₯΄μ§€λ§Œ μ½”λ“œλ₯Ό 보면 λͺ¨λ°”일 λ˜λŠ” ν„°μΉ˜ μŠ€ν¬λ¦°μ„ μœ„ν•œ ν™•μž₯ μ œμŠ€μ²˜κ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€. μ–΄μ¨Œλ“  λ‚΄ μ•±μ˜ λͺ¨λ“  것이 잘 μž‘λ™ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

@IvanSanchez λ™μΌν•œ λ¬Έμ œμΈμ§€ ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ 관련될 수 μžˆμŠ΅λ‹ˆλ‹€.
ν™•λŒ€/μΆ•μ†Œ μ• λ‹ˆλ©”μ΄μ…˜μ΄ 진행 쀑일 λ•Œ 지도λ₯Ό νŒŒκ΄΄ν•˜λ©΄ Uncaught TypeError: Cannot read property '_leaflet_pos' of undefined 같은 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

λ‚΄κ°€ μ½”λ“œ 내뢀보고 μ‹œλ„ν•˜κ³  발견 κ·Έ μ•ˆμ— Map._animateZoom() 선이 : setTimeout(Util.bind(this._onZoomTransitionEnd, this), 250);
μΆ©λΆ„νžˆ μ΄ν•΄ν•˜λ©΄ 이 νƒ€μž„μ•„μ›ƒμ€ 맡이 제거될 λ•Œ μ†Œλ©Έλ˜μ§€ μ•ŠμœΌλ―€λ‘œ Map._onZoomTransitionEnd ν•¨μˆ˜κ°€ 항상 ν˜ΈμΆœλ©λ‹ˆλ‹€. 그것은 λ‹Ήμ‹ μ˜ _"μ—¬κΈ°μ„œ λ˜λŠ” μ €κΈ°μ„œ ν•¨μˆ˜ ν˜ΈμΆœμ„ λ†“μΉ˜λŠ” 것"_일 수 μžˆμŠ΅λ‹ˆλ‹€.

그리고 λ‹¨μˆœν™”λœ 호좜 트리 this._onZoomTransitionEnd -> this._move -> this._getNewPixelOrigin -> this._getMapPanePos -> getPosition(this._mapPane) -> return el._leaflet_pos this._mapPane κ°€ _undefined_이기 λ•Œλ¬Έμ— return el._leaflet_pos κ°€ μ‹€νŒ¨ν•©λ‹ˆλ‹€.

this._move 및 this._moveEnd ν˜ΈμΆœμ„ if (this._mapPane) {} 쑰건으둜 λž˜ν•‘ν•˜λ©΄ 이 κ²½μš°κ°€ μˆ˜μ •λ  수 μžˆμ§€λ§Œ λ‹€λ₯Έ κ²°κ³Όκ°€ μžˆλŠ”μ§€ ν…ŒμŠ€νŠΈν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

이것을 κ΅μ²΄ν•˜μ‹­μ‹œμ˜€:

_onZoomTransitionEnd: function () {
    if (!this._animatingZoom) { return; }

    if (this._mapPane) {
        removeClass(this._mapPane, 'leaflet-zoom-anim');
    }

    this._animatingZoom = false;

    this._move(this._animateToCenter, this._animateToZoom);

    // This anim frame should prevent an obscure iOS webkit tile loading race condition.
    requestAnimFrame(function () {
        this._moveEnd(true);
    }, this);
}

μ΄κ²ƒμœΌλ‘œ:

_onZoomTransitionEnd: function () {
    if (!this._animatingZoom) { return; }

    this._animatingZoom = false;

    if (this._mapPane) {
        removeClass(this._mapPane, 'leaflet-zoom-anim');
        this._move(this._animateToCenter, this._animateToZoom);

        // This anim frame should prevent an obscure iOS webkit tile loading race condition.
        requestAnimFrame(function () {
            this._moveEnd(true);
        }, this);
    }
}

이에 λŒ€ν•œ μ—…λ°μ΄νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ? 같은 λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. touchExtend : false λŠ” 도움이 λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 λ¬Έμ œλŠ” 지도가 μžˆλŠ” λ·°μ—μ„œ 멀리 νƒμƒ‰ν•œ λ‹€μŒ(이 μ‹œμ μ—μ„œ map.remove()λ₯Ό ν˜ΈμΆœν•˜μ—¬ 파괴됨) 이 뷰둜 λ‹€μ‹œ 탐색할 λ•Œ λ°œμƒν•©λ‹ˆλ‹€. μƒˆ 지도λ₯Ό λ§Œλ“€κ³  μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•˜μ§€λ§Œ setMaxBounds λ©”μ„œλ“œμ˜ getPosition μ—μ„œ '_leaflet_pos' 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

Uncaught (in promise) TypeError: Cannot read property '_leaflet_pos' of undefined
    at getPosition (webpack-internal:///./node_modules/leaflet/dist/leaflet-src.js:2445)
    at NewClass._getMapPanePos (webpack-internal:///./node_modules/leaflet/dist/leaflet-src.js:4409)
    at NewClass._moved (webpack-internal:///./node_modules/leaflet/dist/leaflet-src.js:4413)
    at NewClass.getCenter (webpack-internal:///./node_modules/leaflet/dist/leaflet-src.js:3774)
    at NewClass.panInsideBounds (webpack-internal:///./node_modules/leaflet/dist/leaflet-src.js:3488)
    at NewClass._panInsideMaxBounds (webpack-internal:///./node_modules/leaflet/dist/leaflet-src.js:4220)
    at NewClass.setMaxBounds (webpack-internal:///./node_modules/leaflet/dist/leaflet-src.js:3444)

λ˜ν•œ setView λ©”μ„œλ“œμ—μ„œ:

Uncaught (in promise) TypeError: Cannot read property '_leaflet_pos' of undefined at getPosition (leaflet-src.js?9eb7:2445) at NewClass._getMapPanePos (leaflet-src.js?9eb7:4409) at NewClass.containerPointToLayerPoint (leaflet-src.js?9eb7:3989) at NewClass._getCenterLayerPoint (leaflet-src.js?9eb7:4446) at NewClass._getCenterOffset (leaflet-src.js?9eb7:4451) at NewClass._tryAnimatedPan (leaflet-src.js?9eb7:4526) at NewClass.setView (leaflet-src.js?9eb7:3181)

map.remove() ν›„ λ™μΌν•œ 문제, λ‚΄ 지도λ₯Ό λ‹€μ‹œ μ΄ˆκΈ°ν™”ν•˜κ³  이 μ •ν™•ν•œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

v1.6.0κ³Ό λ™μΌν•œ λ¬Έμ œμž…λ‹ˆλ‹€. λ³΅μž‘ν•œ λ¬Έμ œλ‹€

λ‹€μŒμ€ SSCCEμž…λ‹ˆλ‹€. https://jsfiddle.net/0oafw694/1/

기본적으둜 λ‹€μŒ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ©΄ ...

map = L.map('map');
map.setView(...);
map.setMaxBounds(...);
map.remove();

... 두 개의 이벀트 λ¦¬μŠ€λ„ˆκ°€ μ—°κ²°λœ μƒνƒœλ‘œ λ‘‘λ‹ˆλ‹€.

moveend: (1) […]
0: Object { fn: _panInsideMaxBounds(), ctx: undefined } // from setMaxBounds

unload: (2) […]
0: Object { fn: _destroy() , ctx: {…} }
1: Object { fn: _destroyAnimProxy(), ctx: undefined }

zoomanim: (1) […]
0: Object { fn: _createAnimProxy(), ctx: undefined }

zoomanim/_createAnimProxy λŠ” unload/_destroyAnimProxy λ₯Ό 톡해 μ²˜λ¦¬λ˜λ―€λ‘œ λ¬Έμ œκ°€ μ—†λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ moveend/_panInsideMaxBounds λŠ” 등둝을 μ·¨μ†Œν•΄μ•Ό ν•©λ‹ˆλ‹€. 홍보λ₯Ό μ€€λΉ„ν•˜κ² μŠ΅λ‹ˆλ‹€...

방금 동적 IDκ°€ μžˆλŠ” 맡에 λŒ€ν•œ divλ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ divλ₯Ό μž¬μ‚¬μš©ν•΄μ•Ό ν•  λ•Œ λ©”λͺ¨λ¦¬λ₯Ό ν•΄μ œν•˜κΈ° μœ„ν•΄ κΈ°μ‘΄ 맡을 제거()ν•œ λ‹€μŒ(일뢀 μ΄λ²€νŠΈκ°€ μ—¬μ „νžˆ 진행 쀑이더라도) 그런 λ‹€μŒ λ‹€λ₯Έ ID둜 divλ₯Ό λ‹€μ‹œ κ·Έλ €μ„œ μƒˆ 맡을 λ§Œλ“­λ‹ˆλ‹€.

λ˜ν•œ λͺ¨λ“  지도λ₯Ό κ°œμ²΄μ— μ €μž₯ν•˜λ―€λ‘œ ν•΄λ‹Ή ID에 따라 μ‘°μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€(동적 IDλ₯Ό μ‚¬μš©ν•˜μ—¬ 두 개 μ΄μƒμ˜ 지도λ₯Ό 가끔 λ³Ό 수 있음).

전단지에 λŒ€ν•œ λ‚΄ μ‹€ν—˜μ— λ”°λ₯΄λ©΄ κ°œλ°œμžκ°€ μ‘°μž‘ν•˜λŠ” λͺ¨λ“  이벀트(예: moveend, movestart λ“±)λŠ” κΈ°λ³Έ λ™μž‘μ„ λ³€κ²½ν•˜κ³  domμ—μ„œ 전단지λ₯Ό μ–Έλ‘œλ“œν•˜λŠ” λ™μ•ˆ λ©”λͺ¨λ¦¬μ— 남아 μžˆμŠ΅λ‹ˆλ‹€.
λ‚˜λŠ” 이것을 @moveend="()=>{enableRecenter = true}" ν–ˆμœΌλ―€λ‘œ 지도λ₯Ό μ–Έλ‘œλ“œ/μ œκ±°ν•˜λŠ” λ™μ•ˆ 'moveend' ν•Έλ“€λŸ¬κ°€ λ©”λͺ¨λ¦¬μ— 남아 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
지도 ꡬ성 μš”μ†Œ μžμ²΄μ—μ„œ μ΄λŸ¬ν•œ λ©”μ„œλ“œμ˜ μ‘°μž‘(λ‚΄ 자체 κ΅¬ν˜„)을 μ œκ±°ν–ˆλŠ”λ° 이제 이 였λ₯˜κ°€ ν‘œμ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ 기본적으둜 지도 방법을 λ§Œμ§€μ§€ λ§ˆμ‹­μ‹œμ˜€!!! λ¬Όλ‘  λΌμ΄λΈŒλŸ¬λ¦¬κ°€ 이 λ™μž‘μ„ κ°μ§€ν•˜κ³  이 버그λ₯Ό μˆ˜μ •ν•˜μ§€ μ•ŠλŠ” ν•œ.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰