提问人:TonyT 提问时间:11/13/2018 更新时间:11/13/2018 访问量:282
如何在我的 Javascript 中重写 onclick() 函数以调用函数
How to Rewrite an onclick() Function in my Javascript to Call a Function
问:
我使用带有集群的 Leaflet 创建了一个地图。我想在单击集群时添加一个弹出窗口,它将显示集群内标记名称的弹出列表。我找到了一个代码,它完全符合我的需求:一个列表弹出窗口,显示集群内标记的名称,当您单击弹出列表中的不同名称时,会出现相关的标记弹出窗口。但是当我将代码添加到我的项目中时,我收到错误,“未定义引用错误 onclick”,并且该函数不会运行。我研究了这个错误,我发现在我的javascript / HTML中以代码编写的方式使用onclick函数并不是一个好的做法。我的问题是,我如何重写脚本以按照我使用的示例的方式工作。这是我用来展示我试图完成的任务的示例的链接(当我下载并运行它时,这个示例有效......没有错误) - http://www.digital-geography.com/working-with-clusters-in-leaflet-increasing-useability/。我还附上了我的剧本。关于如何完成这项工作的任何帮助将不胜感激。或者,我愿意以不同的方式实现这一目标。提前致谢!
function openPopUp(id, clusterId){
map.closePopup(); //which will close all popups
map.eachLayer(function(layer){ //iterate over map layer
if (layer._leaflet_id == clusterId){ // if layer is markerCluster
layer.spiderfy(); //spiederfies our cluster
}
});
map.eachLayer(function(layer){//iterate over map rather than clusters
if (layer._leaflet_id == id){// if layer is marker
layer.openPopup();
}
});
markers.on('clusterclick', function(a){
if(a.layer._zoom == 6){
var myText = '<ul>';
for (feat in a.layer._markers){
myText += '<li><u onclick="openPopUp"(' + a.layer._markers[feat]._leaflet_id + ',' + a.layer._leaflet_id + ')>' + a.layer._markers[feat].feature.properties['cityName2'] + ',' + a.layer._markers[feat].feature.properties['cityName2'] + '</u></li>';
}
myText += '</u>';
var popup = L.popup().setLatLng([a.layer._cLatLng.lat,a.layer._cLatLng.lng]).setContent(myText).openOn(map);
}
})
答:
1赞
CertainPerformance
11/13/2018
#1
因为可以接受一个而不仅仅是一个 HTML 字符串,所以你需要做的就是传入一个附加了侦听器的元素,而不是 HTML 字符串 - 用 显式构造元素,并在要附加侦听器的元素上使用:.setContent
HTMLElement
createElement
addEventListener
markers.on('clusterclick', function(a) {
if (a.layer._zoom !== 6) return;
const ul = document.createElement('ul');
a.layer._markers.forEach(({ _leaflet_id, feature }) => {
const { cityName2 } = feature.properties;
const li = ul.appendChild(document.createElement('li'));
const u = li.appendChild(document.createElement('u'));
u.addEventListener('click', () => openPopUp(_leaflet_id, a.layer._leaflet_id));
u.textContent = cityName2 + ',' + cityName2;
});
const popup = L
.popup()
.setLatLng([a.layer._cLatLng.lat, a.layer._cLatLng.lng])
.setContent(ul)
.openOn(map);
})
评论
0赞
TonyT
11/13/2018
有一个快速的问题,我以为我可以解决它,但我无法弄清楚。当列表弹出时,它显示 undefined 表示 (cityName2) 的信息。有什么想法吗?其他一切都很完美。
0赞
TonyT
11/13/2018
对不起,不是未定义。它说,[object Object],。它从 csv 文件中读取数据。
0赞
CertainPerformance
11/13/2018
哎呀,看来你也必须经历子对象。,请参阅编辑properties
const { cityName2 } = feature.properties;
0赞
TonyT
11/18/2018
我想让你知道你的修复有效!很抱歉,我错过了添加该评论,让您知道。再次感谢您的帮助!
评论
"reference error onclick is not defined"
这真的是确切的错误文本吗?听起来很奇怪