Umieszczać elementy sterujące poza pojemnikiem na mapę za pomocą Ulotki?

13

Czy ktoś może mi powiedzieć, jak mogę umieścić kontrolki poza zawartością mapy za pomocą Ulotki?

W tym przypadku chcę po prostu umieścić przełącznik zmiany warstwy poza obiektem mapy.

wprowadź opis zdjęcia tutaj

Mauricio Santos
źródło

Odpowiedzi:

19

Ulotka często wymachuje ręką, aby ukryć wdrożenie portalu z mapami, ale na szczęście wymyślili rozwiązanie!

Ta getContainerfunkcja jest dokładnie tym, czego potrzebujesz. Zwraca to rzeczywisty węzeł HTML, a nie tylko znaczniki.

Jest to wtedy tak proste, jak usunięcie potomka (?) Węzła i przypisanie go do nowego elementu nadrzędnego za pomocą kilku wierszy kodu JavaScript.

Przykład roboczy i komentarze (oraz kafelek typu kick-ass)!

http://codepen.io/romahicks/pen/ONmPmp

Kod

//Create Layer
var baseMap = new    L.TileLayer('http://{s}.tiles.mapbox.com/v3/gvenech.m13knc8e/{z}/{x}/{y}.png'   );

var baseMapIndex = {
  "Map": baseMap
};

// Create the map
var map = new L.map('map', {
  center: new L.LatLng(41.019829, 28.989864),
  zoom: 14,
  maxZoom: 18,
  zoomControl: false, // Disable the default zoom controls.
  layers: baseMap
});

// Create the control and add it to the map;
var control = L.control.layers(baseMapIndex);
control.addTo(map);

 // Call the getContainer routine.
 var htmlObject = control.getContainer();
 // Get the desired parent node.
 var a = document.getElementById('new-parent');

 // Finally append that node to the new parent, recursively searching out and re-parenting nodes.
 function setParent(el, newParent)
 {
    newParent.appendChild(el);
 }
 setParent(htmlObject, a);

Musisz rekurencyjnie przejść przez wszystkie dzieci i przypisać je rodzicom. Zobacz drugą odpowiedź na prostą pętlę rekurencyjną.

/programming/20910147/how-to-move-all-html-element-children-to-another-parent-using-javascript

RomaH
źródło
Dobra robota. Już cię głosowałeś, ale czy mógłbyś dodać odpowiedni JavaScript do swojej odpowiedzi?
elrobis
a.appendChild(control.onAdd(map))powinno wystarczyć. Zobacz także stackoverflow.com/questions/36041651/…
ghybs
Działa dobrze z rozwiązaniem getContainer. Ale kiedy próbowałem z a.appendChild (control.onAdd (mapa)), wszystkie warstwy wms i kontrola warstw znikają.
Mauricio Santos
Przepraszam, aktualizuję swoją odpowiedź za pomocą pętli rekurencyjnej. Daj mi znać, jeśli to nie zadziała.
RomaH
@ Mauriciosantos Mój zły, to nie działa tak prosto dla L.control.layers.
ghybs
1

Prosty możliwy sposób, w jaki użyłem:

Dodaj poniżej tag HTML, w którym chcesz przenieść kontrolki ulotki:

<div id="custom-map-controls"></div>

Kod JavaScript:

$(document).ready(function () {

var newParent = document.getElementById('custom-map-controls');
        var oldParent = document.getElementsByClassName("leaflet-top leaflet-right")

        while (oldParent[0].childNodes.length > 0) {
            newParent.appendChild(oldParent[0].childNodes[0]);
        }
 });
Rahul Mahadik
źródło