我目前正在尝试使它,以便我的JavaScript文件将运行一个<input>
按钮,当用户在传单Map上放置标记(或开始放置它的过程)时,该按钮将被隐藏。我遵循示例found here来帮助实现这一点。不幸的是,我添加的代码在运行时似乎没有做任何事情。
**我想发生的事情:**用户点击放置标记和文件资源管理器打开,让他们选择一个图像文件。
**实际发生的情况:**用户单击Map放置标记,由于文件资源管理器未打开,因此此代码似乎被忽略。
我是相当新的HTML和JavaScript,所以我道歉,如果这是很容易解决的问题。我的代码可以在下面找到:
var map = L.map('map').setView([0, 0], 3);
var markersArray = new Array();
var marker
var counter = 0;
var markerLayer = L.layerGroup([]);
var buttons = [];
L.tileLayer('https://api.maptiler.com/maps/streets-v2/{z}/{x}/{y}.png?key=TUHtC4pfxR178kXfCmqg', {
attribution: '<a href="https://www.maptiler.com/copyright/" target="_blank">© MapTiler</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">© OpenStreetMap contributors</a>'
}).addTo(map)
var markerOptions = {
draggable: false
}
function createMarkerOnClick(evt) {
document.getElementById('imgUpload').click;
img = document.getElementById('imgUpload').value;
let description = prompt("Please add your description for this marker below");
if (description == null) {
description = "No desceiption added.";
}
marker = new L.Marker([evt.latlng.lat, evt.latlng.lng], markerOptions).addTo(map);
marker.bindPopup(description);
markersArray[counter] = marker;
marker.addTo(markerLayer);
markerLayer.addTo(map);
counter++;
toggleMarker.state('disable-markers');
}
//Delete options
function delAllMarkers() {
for (i = 0; i < markersArray.length; i++) {
map.removeLayer(markersArray[i]);
}
}
function delLastMarker() {
map.removeLayer(markersArray[counter - 1])
}
//Buttons
var toggleMarker = L.easyButton({
states: [{
stateName: 'enable-markers',
icon: '<center><img src="I:\\maps\\leafmap\\location-pin.png" style="width:26px"></center>',
title: 'Enable markers on click',
onClick: function(control) {
control.state('disable-markers');
map.on('click', createMarkerOnClick);
}
}, {
icon: '<center><img src="I:\\maps\\leafmap\\location-pin.png" style="width:26px"></center>',
stateName: 'disable-markers',
title: 'Disable markers on click',
onClick: function(control) {
control.state('enable-markers');
map.off('click', createMarkerOnClick)
}
}]
})
buttons.push(toggleMarker);
var removeAllMarkers = L.easyButton('del-all-markers', function(btn, map) {
delAllMarkers();
})
buttons.push(removeAllMarkers);
var removeLastMarker = L.easyButton('del-last-marker', function(btn, map) {
delLastMarker();
})
buttons.push(removeLastMarker);
var toolbar = L.easyBar(buttons, {
id: 'toolbar'
}).addTo(map);
.disable-markers-active {
background-color: #FFFF99 !important;
}
#map {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
#imgUpload {
position: absolute;
top: 20px;
right: 20px;
padding: 10px;
z-index: 400;
}
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.3/dist/leaflet.css" integrity="sha256-kLaT2GOSpHechhsozzB+flnD+zUyjE2LlfWPgU04xyI=" crossorigin="" />
<link rel="stylesheet" link href="https://cdn.jsdelivr.net/npm/leaflet-easybutton@2.4.0/src/easy-button.min.css" />
<div id="map">
<input type="file" accept="image/*" name="imgUpload" id="imgUpload" onchange="loadFile(event)" hidden/>
</div>
<script src="https://unpkg.com/leaflet@1.9.3/dist/leaflet.js" integrity="sha256-WBkoXOwTeyKclOHuWtc+i2uENFpDZ9YPdf5Hf+D7ewM=" crossorigin=""></script>
<script src="https://cdn.jsdelivr.net/npm/leaflet-easybutton@2.4.0/src/easy-button.min.js"></script>
1条答案
按热度按时间ao218c7q1#
你的代码有一些问题。一个完整的解决方案,满足你的既定目标“用户点击放置标记和文件浏览器打开,让他们选择一个图像文件”是在这篇文章末尾的代码片段。
解决方案的一般分解:
您的代码遇到的第一个问题是此错误:
您需要将
<img>
标签上的src
属性设置为Web服务器上文件的相对路径(例如“/images/location-pin.png”)或Web URL的绝对路径,如下所示。Map上
click
事件的侦听器函数(当处于添加标记模式时,由Map右侧的工具栏切换)需要首先触发输入文件对话框。在文件输入
change
事件的监听函数中,需要读取选中的图片文件的文件内容,阅读完后调用create marker函数,将选中的图片文件添加为图标。在调用create marker函数之前,还需要一段数据:选定图像的尺寸。这些尺寸用于使图标的比例等于原始图像。
上面的一切放在一起:
将选中的图片显示为Map标记图标
在弹出窗口中显示选中的图片
以下代码片段是根据注解线程添加的:选择的图像应显示在弹出窗口内,与描述文本内联,而不是设置用户选择的图像来代替默认的Map标记图标。