动态更改传单ImageLayer Url
Changing Leaflet ImageLayer Url Dynamically
由于我的Javascript/Jquery知识不好,我现在在使用传单时遇到了麻烦:)
我想通过将照片上传到服务器来更改我的传单ImageLayer url。我搜索了很多图片文件上传到WCF服务,我做到了。但我不能给我的ImageLayer那个URL。
<div>
<button id="btnBrowse" class="button primary on-right" onclick="openFileOption();">Browse</button>
</div>
<div class="custom-file">
<input type="file" id="file" style="display:none" onchange="uploadPhoto();" />
</div>
<div id="base" style="display:none"></div>
<div id="map" style="width: 100%; height: 400px"></div>
在我的HTML文件内容上方。我在LoadMap()函数中加载了一次地图。然后在ChangeMap()函数中更改它的URL。
<script>
var mapLoadCount = 0;
var map;
var overlay;
var bounds;
function LoadMap() {
mapLoadCount = mapLoadCount + 1;
if (mapLoadCount == 1) {
map = L.map('map', {
minZoom: 1,
maxZoom: 5,
center: [0, 0],
zoom: 3,
crs: L.CRS.Simple
}).setView([50.4333, 30.5167], 3);
var w = 1526,
h = 626,
url = '';
var southWest = map.unproject([0, h], map.getMaxZoom() - 1);
var northEast = map.unproject([w, 0], map.getMaxZoom() - 1);
bounds = new L.LatLngBounds(southWest, northEast);
overlay = L.imageOverlay(url, bounds);
overlay.addTo(map);
map.setMaxBounds(bounds);
}
}
function onMapClick(e) {
var newPosition = e.latlng;
if (imageBounds.contains(newPosition)) {
var newMarker = L.marker(newPosition).addTo(map);
}
}
function ChangeMap(_url) {
LoadMap();
overlay.setUrl(_url)
var popup = L.popup();
var imageBounds = bounds;
function onMapClick(e) {
var newPosition = e.latlng;
if (imageBounds.contains(newPosition)) {
var newMarker = L.marker(newPosition).addTo(map);
}
}
newMarkerGroup = new L.LayerGroup();
map.on('click', onMapClick);
map.on('drag', function () {
map.panInsideBounds(bounds, { animate: false });
});
}
</script>
在下面的代码中,我正在读取图像文件并将其加载到服务器,然后用服务器上的图像url调用ChangeMap()函数。
<script type="text/javascript">
function readImage(input) {
if (input.files && input.files[0]) {
var FR = new FileReader();
FR.onload = function (e) {
$('#base').text(e.target.result);
};
FR.readAsDataURL(input.files[0]);
}
}
function openFileOption() {
document.getElementById("file").click();
}
function uploadPhoto() {
var path = document.getElementById("file").value;
var fileExtension = path.substring(path.lastIndexOf(".") + 1, path.length);
var file = document.getElementById("file");
readImage(file);
var check = function () {
if ($('#base').text() != "") {
var base64 = $('#base').text();
UploadToServer(base64);
}
else {
setTimeout(check, 1000); // check again in a second
}
}
check();
if (result == "true")
{
ChangeMap("..''" + imageUrl);
}
}
var result;
var dataArr;
var imageUrl;
function UploadToServer(base64) {
var url = $(location).attr('href');
var baseURL = url.substring(0, url.indexOf('/', 8));
var path = document.getElementById('file').value;
var fileName = path.substring(path.lastIndexOf("''") + 1, path.length);
fileName = fileName.substring(0, fileName.lastIndexOf("."));
var fileExtension = path.substring(path.lastIndexOf(".") + 1, path.length);
var jData = {};
jData.base64 = base64;
jData.fileName = fileName;
jData.fileExtension = fileExtension;
var Path = 'http://localhost/ImageUploaderService/FileUploader.svc/UploadPhotoToServer';
var imagePath = "localhost''ImageUploaderService''";
$.ajax({
type: "POST",
url: Path,
data: JSON.stringify(jData),
dataType: 'json',
async: false,
contentType: "application/json",
beforeSend: function () {
},
complete: function () {
},
success: function (data) {
if (data.indexOf('|')!= -1)
{
dataArr = data.split('|');
result = dataArr[0];
imageUrl = dataArr[1];
}
if (result != "true") {
alert('Error while loading image to server. ' + data);
}
},
error: function (responseData, textStatus, errorThrown) {
alert('Error while loading image to server. ' + responseData + textStatus + errorThrown);
}
});
}
</script>
我的实际问题是在第一次之后加载图像。当我第一次加载图像时,我的代码是将图像加载到服务器,获取图像的路径并将其加载到我的地图。但在第二次并没有改变我的传单图像图层的图像。之后,当我第三次加载时,它会加载第二个要映射的图像。在第四个图像中,它加载第三个图像,依此类推
我对FileReader.onload事件有疑问。因为当我调试我的代码时,我看到我的代码在调用ChangeMap()函数后将加载FileReader的事件。我无法理解我的代码中发生了什么:)
编辑:这是我的代码的工作版本>http://jsfiddle.net/v905xhre/
您似乎对异步进程感到困惑。UploadToServer
函数创建一个AJAX(第一个"A"表示异步)请求,并仅在该请求成功完成后将数据分配给result
和imageUrl
变量。
AJAX发送到服务器后(但尚未完成),脚本将继续执行,因此接下来的几行将测试result
。第一次上传时,它是undefined
。在第二次上传时,它是true
,因为它从未重置为false
,并且您的图像URL将更改为当前imageUrl
中的URL,即第一次上传的URL,因为第二次上载仍在服务器上处理。等等。
check(); // calls UploadToServer
if (result == "true") // executes while the AJAX is sent
{
ChangeMap("..''" + imageUrl);
}
您可以非常简单地将对ChangeMap
的调用移动到AJAX请求的成功回调中。
编辑:关于如何正确使用异步/AAJAX进程,也可以参考如何从异步调用返回响应?
- 如何使用url加载程序在webpack中导入多个图像
- 使用php或javascript从facebook相册URL中删除多余的部分
- Angular JS IE9 Hashbang url rewriting
- JavaScript下拉菜单-点击按钮并根据所选值重定向到url
- 直接下载文件,而不是从window.open(url)
- 动态地改变“”的URL;添加新项目”;链接使用javascript/jquery
- 通过js在新选项卡中有条件地打开url
- CKFinder 3为所选文件返回错误的URL
- 如何获取不属于我项目的上一页的URL
- ReactJS映射:如何仅在url变量不为空时呈现html链接
- 在URL中传递JS对象
- 将纯文本URL转换为可单击链接
- Javascript html每点击一次就会更改url
- 以角度管理动态URL
- Mathias URL shortener
- 如何有效地将游戏数据存储在URL查询字符串中
- 使用带括号的图像URL作为jQuery的背景
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 传递包含'%的参数'在URL中
- 动态更改传单ImageLayer Url