D3.js的mouseover事件在Leaflet中不起作用 [英] The mouseover event for D3.js does not work in Leaflet

查看:258
本文介绍了D3.js的mouseover事件在Leaflet中不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

1.我用Leaflet绘制了GeoJSON地图.

1.I used a Leaflet to draw a GeoJSON map.

2.使用D3在svg中创建一个节点

2.Create a node in svg using D3

3.将mouseover事件绑定到该节点,但没有生效

3.Bind the mouseover event to the node, but it does not take effect

传单版本:1.5.1 D3.js v5 浏览器(带有版本):Chrome 75.0.3770.80 操作系统/平台(带有版本):Windows 10

Leaflet version:1.5.1 D3.js v5 Browser (with version):Chrome 75.0.3770.80 OS/Platform (with version):Windows 10

  <div id="mapDiv"></div>
 <script>
    var style = {
      color: "#586a77",
      opacity: 1,
      weight: 1.5,
      fillColor: "#323c48",
      fillOpacity: .8
    }
    var mymap = L.map("mapDiv", {
      center: [33.027088, 109.467773],
      zoom: 4,
      zoomControl: false,
      attributionControl: false,
      minZoom: 1,
      maxZoom: 18
    })

    // 用d3读取地图geojson数据
    d3.json("data/geojson/world.json")
      .then((data) => {
        L.geoJSON(data, {
          style: style
        }).addTo(mymap);
        var svg = d3.select("#mapDiv").select("svg");

        var d_plane =
          "M59.79,12.92C62.42,9.4,64,5.75,64,3.15a3.62,3.62,0,0,0-.49-2,1.6,1.6,0,0,0-.29-.37,1.68,1.68,0,0,0-.34-.27,3.56,3.56,0,0,0-2-.51c-2.6,0-6.25,1.58-9.77,4.21-2.84,2.13-5.69,5.12-9.62,9.27L39.34,15.7l-7.62-2.28,0,0a1.71,1.71,0,0,0,0-2.41L30.36,9.61a1.71,1.71,0,0,0-1.21-.5,1.68,1.68,0,0,0-1.21.5l-2.06,2.06-1.09-.33a1.71,1.71,0,0,0-.14-2.25L23.27,7.7a1.71,1.71,0,0,0-1.21-.5,1.67,1.67,0,0,0-1.2.5L19,9.59,11.21,7.27a1.94,1.94,0,0,0-.55-.08,2.05,2.05,0,0,0-1.43.58L6.5,10.5A1.61,1.61,0,0,0,6,11.62,1.56,1.56,0,0,0,6.85,13l16.3,9.11a2.84,2.84,0,0,1,.4.3l4.65,4.65C23.85,31.66,20,36.09,17,40L16.15,41,3.54,39.86H3.32a2.33,2.33,0,0,0-1.56.65L.49,41.76A1.58,1.58,0,0,0,0,42.89a1.55,1.55,0,0,0,.92,1.43l8.87,4.21a2.07,2.07,0,0,1,.34.24l.74.73a5.38,5.38,0,0,0-.35,1.71,2.24,2.24,0,0,0,.62,1.63l0,0h0a2.25,2.25,0,0,0,1.63.61,5.43,5.43,0,0,0,1.69-.35l.75.75a2,2,0,0,1,.23.33l4.2,8.85a1.57,1.57,0,0,0,1.41.93h0a1.58,1.58,0,0,0,1.12-.47l1.3-1.31a2.32,2.32,0,0,0,.62-1.56c0-.07,0-.13,0-.16L23,47.85,24,47c3.86-3,8.3-6.9,12.87-11.24l4.65,4.66a2.49,2.49,0,0,1,.3.4L51,57.13a1.58,1.58,0,0,0,2.54.37l2.74-2.74a2.08,2.08,0,0,0,.56-1.43,2,2,0,0,0-.07-.54L54.41,45l1.89-1.89a1.71,1.71,0,0,0,0-2.41l-1.39-1.38a1.71,1.71,0,0,0-2.25-.14l-.32-1.09,2.06-2.06a1.72,1.72,0,0,0,.5-1.21,1.69,1.69,0,0,0-.5-1.2L53,32.27a1.71,1.71,0,0,0-2.42,0h0L48.3,24.65l2.25-2.14C54.68,18.59,57.67,15.76,59.79,12.92Z"

        var plane = svg.append("g").attr("id", "plane").attr("fill", "#108ee9").attr("stroke-width", 1).attr('height',
          10).attr('width', 10)

        plane.append("path").attr("d", d_plane)

        function mouseOver(d) {
          console.log("mouseOver");
        }

        function mouseOut() {
          console.log("mouseOut");
        }

        d3.select("#plane").on("mouseover", mouseOver).on("mouseout", mouseOut);
      })
  </script>

我完整的示例代码为 https://github.com/liruifengv/leaflet/blob/master/test.html

推荐答案

此问题中所述,Leaflet设置了<在HTML上将href ="https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events" rel ="nofollow noreferrer"> pointer-events CSS属性转换为none不应接收鼠标/触摸/指针事件的元素. Leaflet专门针对SVG容器这样做:

As explained in this question, Leaflet sets the pointer-events CSS property to none on HTML elements that should not receive mouse/touch/pointer events. Leaflet does so explicitly for the SVG containers:

    // makes it possible to click through svg root; we'll reset it back in individual paths
    this._container.setAttribute('pointer-events', 'none');

为了让特定的path接收鼠标/触摸/指针事件,请

In order for specific paths to receive mouse/touch/pointer events, Leaflet resets that CSS properties in specific paths by adding a CSS class:

    if (layer.options.interactive) {
        DomUtil.addClass(path, 'leaflet-interactive');
    }

当然还有传单中的匹配位CSS规则:

.leaflet-pane > svg path.leaflet-interactive,
svg.leaflet-image-layer.leaflet-interactive path {
    pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
    pointer-events: auto;
}

解决问题的一种方法是重置路径的pointer-events CSS属性,例如:

So one approach to your problem would be to reset the pointer-events CSS property of your path like:

    plane.append("path").attr("d", d_plane).attr("style", "pointer-events: auto;");

或设置其CSS类,例如:

Or set its CSS class, like:

    plane.append("path").attr("d", d_plane).attr("class", "leaflet-interactive");


重要说明: pointer-events CSS属性 不同于 pointer-events SVG属性 .将pointer-events CSS属性设置为none的SVG路径将忽略其pointer-events SVG属性的值.


Important note: The pointer-events CSS property is different than the pointer-events SVG attribute. A SVG path with its pointer-events CSS property set to none will ignore the value of its pointer-events SVG attribute.

这篇关于D3.js的mouseover事件在Leaflet中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆