如何将鼠标"点击"事件添加到传单 map 上绘制的每个多边形?我想这样做,这样我就可以根据功能中的数据过滤一个单独的小部件(在本例中是WD21CD).

leaflet.js map with polygons added

---
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)

library(tidyverse)
library(htmltools)
library(leaflet)

```
```{r cars, echo=FALSE}

url <- 'https://opendata.arcgis.com/api/v3/datasets/bf9d32b1aa9941af84e6c2bf0c54b1bb_0/downloads/data?format=geojson&spatialRefId=4326'
wardShapes <- sf::st_read(url) %>%
  filter(WD21CD >= "E05011175" & WD21CD <= "E05011181")

leaflet(wardShapes,elementId = "bhamMap",
        height = 550,# width = 10,
        options = leafletOptions(minZoom = 10, maxZoom = 14)) %>%
  addTiles() %>%
  setView(lng = -1.810, lat = 52.555, zoom = 12) %>%
  addPolygons(
    weight = 0.5, smoothFactor = 0.5,
    opacity = 1.0, fillOpacity = 0.2,
    highlightOptions = highlightOptions(color = "white", weight = 2, bringToFront = TRUE),
    label = ~as.character(WD21NM),
    labelOptions = (interactive = TRUE)
  )

```

```{js, class.source = "jsvis1", echo=FALSE}
  document.getElementById("bhamMap").addEventListener("click", function(e){
    console.log("hello");
  });

推荐答案

我们可以在传单htmlwidget中使用htmlwidgets::onRenderpass custom JS code.

借助eachLayer方法,我们可以 for each 多边形层添加一个点击功能:

---
  title: "leaflet polygons clicks"
  output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)

library(tidyverse)
library(htmltools)
library(leaflet)
library(sf)
library(htmlwidgets)

```

```{r cars, echo=FALSE}

url <- 'https://opendata.arcgis.com/api/v3/datasets/bf9d32b1aa9941af84e6c2bf0c54b1bb_0/downloads/data?format=geojson&spatialRefId=4326'
wardShapes <- sf::st_read(url) %>%
  filter(WD21CD >= "E05011175" & WD21CD <= "E05011181")

leaflet(wardShapes,elementId = "bhamMap",
        height = 550,# width = 10,
        options = leafletOptions(minZoom = 10, maxZoom = 14)) %>%
  addTiles() %>%
  setView(lng = -1.810, lat = 52.555, zoom = 12) %>%
  addPolygons(
    weight = 0.5, smoothFactor = 0.5,
    opacity = 1.0, fillOpacity = 0.2,
    highlightOptions = highlightOptions(color = "white", weight = 2, bringToFront = TRUE),
    label = ~ as.character(WD21NM),
    labelOptions = (interactive = TRUE),
    options = pathOptions(title = ~ WD21CD, customdata = ~ WD21NM)
  ) %>% htmlwidgets::onRender("
                            function(el, x) {
                              var map = this;
                              map.eachLayer(function(layer) {
                                if(layer instanceof L.Polygon){
                                  layer.on('click', function(e){
                                    alert('You clicked on layer._leaflet_id: ' + layer._leaflet_id + '\\nWD21CD: ' + layer.options.title + '\\ncustomdata: ' + layer.options.customdata);
                                  })
                                  .addTo(map)
                                }
                              });
                            }
                            ")

```

result

Javascript相关问答推荐

使用jQuery在 bootstrap 网格中添加/删除元素并防止删除第一个元素

JavaScript setSYS()是否有可能更早触发?

为什么(1 + Number.Min_UTE)等于1?

使用Apps Script缩短谷歌表中的URL?

Vue Quill css仅应用于我的第一个Quill Editor组件+如何自定义工具栏

我的glb文件没有加载到我的three.js文件中

React Native平面列表自动滚动

vscode扩展-webView Panel按钮不起任何作用

Spring boot JSON解析错误:意外字符错误

分层树视图

如何用拉威尔惯性Vue依赖下拉?

cypress中e2e测试上的Click()事件在Switch Element Plus组件上使用时不起作用

Websocket错误—有一个或多个保留位开启:reserved1 = 1,reserved2 = 0,reserved3 = 0

PDF工具包阿拉伯字体的反转数字

如果一个字符串前面有点、空格或无字符串,后面有空格、连字符或无字符串,则匹配正则表达式

有没有一种直接的方法可以深度嵌套在一个JavaScript对象中?

无法重定向到Next.js中的动态URL

是否可以将异步调用与useState(UnctionName)一起使用

如何在Java脚本中对数据进行签名,并在PHP中验证签名?

用另一个带有类名的div包装元素