【问题标题】:Find Leaflet map objects present on page, without a variable reference查找页面上存在的传单地图对象,没有变量引用
【发布时间】:2014-12-08 03:42:01
【问题描述】:

我有一个浏览器插件的想法,它可以在第三方网站上操作 Leaflet 地图。但我被困在一个简单的事情上:我不确定如何在页面上发现 Leaflet 映射 DOM 元素,然后访问关联的 Leaflet map 对象。

  1. $('.leaflet-container') 是查找所有地图对象的可靠方法吗?

  2. 如何从该对象实际访问map 对象,因此我可以执行以下操作:$('.leaflet-container').eachLayer(...),这不起作用。

这个问题与How can I get a leaflet.js instance using only a DOM object? 基本相同,但答案是有一个无济于事的解决方法。

【问题讨论】:

    标签: javascript dom leaflet introspection


    【解决方案1】:
    1. 是的,这应该足够了,尽管它不是记录在案的行为,并且至少在理论上可能会在 Leaflet 的未来版本中发生变化
    2. 没有办法做到这一点。对地图的引用归创建地图的代码所有,它可能已将其丢弃或可能将其存储在您无权访问的位置。 Leaflet 本身不会在您可以访问它的任何地方存储对地图的引用

    附带说明,我认为您应该让您的代码的用户明确地将引用传递给您,而不是您尝试自动查找引用。例如,参见inversion of control principle,调用者提供依赖项; Law of Demeter 也有点适用 - 不要窥探其他代码内部(除非你真的,真的必须)。

    【讨论】:

    • 是否有任何可能的方法来追踪对象引用而不被传递?我的想法是一个工具,它可以让你在任何基于 Leaflet 的网站上替换你自己喜欢的基础层。为了让它在任何网站上工作,显然它不能要求该网站的开发人员做任何特别的事情......
    • 我不知道,如果可以的话,我会感到惊讶。至少不是没有一些非常讨厌的技巧。
    【解决方案2】:

    好的,所以这是一个可行的解决方案,但它很脆弱且有限。如果您有办法更直接地找到参考,那是理想的。

    我想在我确实不想要修改上游代码的地方获得地图参考;这是一次性的,脆性是可以的。

    我知道我的地图将在 window.FOO 范围内定义(即它是一个全局参考),并且它将采用 map0000 的格式,其中 0000 是一个随机数。所以我构建了一个快速函数来扫描全局window 对象的属性以查找与此模式匹配的变量。

    window[Object.keys(window).find(key => key.substr(0,3) === "map")];
    

    这会返回一个 Leaflet 地图参考,但如果页面上有多个地图,则可能会中断。您还可以通过测试其属性来验证它是真实的传单地图。

    同样,这并不理想,但是,如果您的用例足够有限,这是实现这一目标的一种方法。谢谢!

    【讨论】:

      猜你喜欢
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 2016-01-19
      • 2015-04-11
      相关资源
      最近更新 更多