首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传单:在For-循环内部创建单个事件侦听器。

传单:在For-循环内部创建单个事件侦听器。
EN

Stack Overflow用户
提问于 2016-10-20 12:09:06
回答 1查看 189关注 0票数 1

我想把几个标记放在地图上,这些标记由“父”标记和“子”标记组成。所有父标记应该同时在地图上可见,而如果单击特定的父标记,则应该打开/关闭特定父标记的子标记。

我创建了下面的工作示例来演示:

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>	
	<title>Test 1</title>
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<link rel="stylesheet" href="https://unpkg.com/leaflet@1.0.1/dist/leaflet.css" />
	<script src="https://unpkg.com/leaflet@1.0.1/dist/leaflet.js"></script>
    <style>
        body {padding: 0; margin: 0;}
        html, body, #map {height: 100%;}
    </style>
</head>

<body>
<div id='map'></div>

<script>
var thunder = L.tileLayer('https://{s}.tile.thunderforest.com/neighbourhood/{z}/{x}/{y}.png', {subdomains:'abc', attribution:'<a href="http://www.thunderforest.com">Thunderforest</a> | <a href="http://www.openstreetmap.org/copyright/">OpenStreetMap</a>' });
var map = L.map('map',{layers: [thunder]}).setView([50.08, 10.08], 12);
var parent1 = L.marker([50.0, 10.0]).bindPopup('Marker 1');
var parent2 = L.marker([50.1, 10.1]).bindPopup('Marker 2');;
var layergroupParents = L.layerGroup([parent1, parent2]);

layergroupParents.addTo(map);

var child1a = L.marker([50.02, 10.02],{title: 'Child 1a'});
var child1b = L.marker([50.04, 10.04],{title: 'Child 1b'});
var layergroupChilds1 = L.layerGroup([child1a, child1b]);
var child2a = L.marker([50.12, 10.12],{title: 'Child 2a'});
var child2b = L.marker([50.14, 10.14],{title: 'Child 2b'});
var layergroupChilds2 = L.layerGroup([child2a, child2b]);

parent1.on('click', function(){
    if (map.hasLayer(layergroupChilds1)) {
	    map.removeLayer(layergroupChilds1)
    } else {
        layergroupChilds1.addTo(map);
	}
});

parent2.on('click', function(){
    if (map.hasLayer(layergroupChilds2)) {
	    map.removeLayer(layergroupChilds2)
    } else {
        layergroupChilds2.addTo(map);
	}
});

</script>
</body>
</html>

由于我想显示相当多的标记,所以我希望将标记的属性放到数组("markerArray")中,并在For-Loops的帮助下处理其标记:

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>	
	<title>Test 2</title>
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<link rel="stylesheet" href="https://unpkg.com/leaflet@1.0.1/dist/leaflet.css" />
	<script src="https://unpkg.com/leaflet@1.0.1/dist/leaflet.js"></script>
    <style>
        body {padding: 0; margin: 0;}
        html, body, #map {height: 100%;}
    </style>
</head>

<body>
<div id='map'></div>

<script>
var thunder = L.tileLayer('https://{s}.tile.thunderforest.com/neighbourhood/{z}/{x}/{y}.png', {subdomains:'abc', attribution:'<a href="http://www.thunderforest.com">Thunderforest</a> | <a href="http://www.openstreetmap.org/copyright/">OpenStreetMap</a>' });
var map = L.map('map',{layers: [thunder]}).setView([50.08, 10.08], 12);

var markerArray = [
  ["Marker 1", 50.0, 10.0, [["Child 1a", 50.02, 10.02], ["Child 1b", 50.04, 10.04]]],
  ["Marker 2", 50.1, 10.1, [["Child 1a", 50.12, 10.12], ["Child 1b", 50.14, 10.14]]], 
];

var numberParents = markerArray.length;
var layergroupParents = L.layerGroup();
for (cnt1=0; cnt1<numberParents; cnt1++) {
    var parentObject = L.marker([markerArray[cnt1][1], markerArray[cnt1][2]]);
    parentObject.bindPopup(markerArray[cnt1][0]);
    layergroupParents.addLayer (parentObject);

    var numberChilds = markerArray[cnt1][3].length;        
    var layergroupChilds = L.layerGroup();

    for (cnt2=0; cnt2<numberChilds; cnt2++) {
        var childObject = L.marker([markerArray[cnt1][3][cnt2][1], markerArray[cnt1][3][cnt2][2]], {title: markerArray[cnt1][3][cnt2][0]});
        layergroupChilds.addLayer (childObject);
    }

    parentObject.on('click', function(){
        if (map.hasLayer(layergroupChilds)) {
		    map.removeLayer(layergroupChilds)
		} else {
            layergroupChilds.addTo(map);
		}
    }); 


}
layergroupParents.addTo(map);

</script>
</body>
</html>

如果执行这些脚本,就会发现将单个“单击”事件分配给每个父标记有一些问题。现在,即使我单击第一个父标记,也只打开/关闭上最后一个父标记的子标记。

你知道我如何解决这些问题吗?脚本2和脚本1一样工作吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-20 12:29:11

要使其工作,必须将子元素附加到父级(使用javascript属性)。

代码语言:javascript
复制
var layergroupChilds = L.layerGroup();
parentObject.layergroupChilds = layergroupChilds;

当父对象收到单击时,您可以在事件e中找到父对象,从而找到其子对象。

代码语言:javascript
复制
parentObject.on('click', function(e){
    if (map.hasLayer(e.target.layergroupChilds)) {
        map.removeLayer(e.target.layergroupChilds)
    } else {
        e.target.layergroupChilds.addTo(map);
    }
}); 

这是您的代码和更正

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40154020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档