Найти объекты карты Leaflet, представленные на странице, без ссылки на переменную
У меня есть идея для плагина браузера, который будет манипулировать картами Leaflet на сторонних сайтах. Но я застрял на простой вещи: я не уверен, как обнаружить элементы DOM карты Leaflet на странице, а затем получить доступ к связанному Leaflet map
объект.
Является
$('.leaflet-container')
надежный способ найти все объекты карты?Как на самом деле получить доступ к
map
объект из этого объекта, поэтому я могу сделать что-то вроде:$('.leaflet-container').eachLayer(...)
, который не работает.
Этот вопрос по сути такой же, как Как получить экземпляр leaflet.js, используя только объект DOM?, но ответ был обходной путь, который не помогает.
1 ответ
- Да, этого должно быть достаточно, хотя это не задокументированное поведение и, по крайней мере, теоретически может измениться в будущих версиях Leaflet
- Там нет никакого способа сделать это. Ссылка на карту принадлежит коду, создающему карту, и он мог удалить ее или хранить в месте, к которому у вас нет доступа. Сама брошюра не хранит ссылку на карту в любом месте, где вы можете получить к ней доступ
Кстати, по моему мнению, вы должны позволить пользователям вашего кода явно передавать вам ссылки, а не пытаться автоматически находить ссылки. См., Например, принцип инверсии управления, когда вызывающий абонент предоставляет зависимости; Закон Деметры также в некоторой степени применим - не пытайтесь проникнуть в другие внутренние коды (если вам действительно не нужно).
Хорошо, это решение, которое может работать, но оно хрупкое и ограниченное. Если у вас есть способ более прямого поиска ссылки, это идеально.
Я хотел получить ссылку на карту, в которой я не хочу изменять исходный код; это одноразовый продукт, где хрупкость - это нормально.
Я знаю, что моя карта будет определена на window.FOO
область видимости (т.е. это глобальная ссылка) и что она будет в формате map0000
где 0000
- случайное число. Поэтому я создал быструю функцию для сканирования глобальногоwindow
свойства объекта для переменных, соответствующих этому шаблону.
window[Object.keys(window).find(key => key.substr(0,3) === "map")];
Это возвращает ссылку на карту Leaflet, но может сломаться, если на странице больше одной карты. Вы также можете добавить подтверждение того, что это настоящая карта Leaflet, проверив ее свойства.
Опять же, это не идеально, но, если ваш вариант использования достаточно ограничен, это один из способов добиться этого. Спасибо!