如何强制传单地图重新加载包括可见的所有图块?

Mat*_*ham 3 javascript leaflet

我正在制作一个图形网络应用程序,我已经决定传单会产生一个不错的图表视图.我有它显示(有点)但我需要一种方法来强制它更新当用户输入一个新的公式图表.

我也在使用JQuery,但这不重要.这是相关代码:

function formulaChange(formula){
     //submits a request to the server to add a graph to display
     map.setView(map.getCenter(),map.getZoom(),true);//doesn't work
     //and neither does:
     //map.fire('viewreset');
     //tiles.redraw();
}

function enterHandler(event){
    if(event.keyCode==13){
        formulaChange(document.getElementById("formula").value);
    }

}

var map;
var tiles;
$(document).ready(function(){
    map=L.map('plot',{crs:L.CRS.Simple}).setView([0,0],10);
    //url is actually a servlet on the server that generates an image on the fly
    tiles = L.tileLayer('./GraphTile.png?x={x}&y={y}&z={z}&tilesize={tileSize}&{s}', 
    {
        maxZoom: 20,
        continuousWorld: true,
        tileSize: 128,
        //subdomains used as a random in the URL to prevent caching
        subdomains: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
    }
    ).addTo(map);
});
Run Code Online (Sandbox Code Playgroud)

这可以工作,但是当用户点击时不会刷新,事件肯定在运行(我省略了更新文本显示的其他代码).它显示正常,但是当用户添加一个函数来显示视图从不更新和小叶继续显示缓存图片,只是一个新的缩放级别或平移一个地区从来没有看到之前导致其更新的瓷砖.我的问题是:如何强制传单完全重新加载所有内容并删除并重新加载所有图像?

编辑增加了另一次失败的尝试

Mat*_*ham 11

我找到了答案.尽管没有缓存标头,我的浏览器仍在缓存图像.子域不是文档声称的"随机选择",它们是使用tile位置的哈希生成的.因此,我必须即兴创建一种方法,将"&RANDOM ##"添加到URL的末尾而不是子域.

新代码如下所示:

function enterHandler(event){
    if(event.keyCode==13){
        formulaChange(document.getElementById("formula").value);
    }
}
function formulaChange(formula){
    val.item=Math.random();
    tiles.redraw();
}
var map;
var tiles;
var val={
    item: Math.random(),
    toString: function(){
        return this.item;
    }
};
$(document).ready(function(){
    map=L.map('plot',{crs:L.CRS.Simple}).setView([0,0],10);
    tiles = L.tileLayer('./GraphTile.png?x={x}&y={y}&z={z}&tilesize={tileSize}&{test}', 
    {
        maxZoom: 20,
        continuousWorld: true,
        tileSize: 128,
        test: val
    }
    ).addTo(map);
});
Run Code Online (Sandbox Code Playgroud)

希望这有助于其他人.如果有更好的方法,请评论.


小智 6

您可以通过使用函数而不是缓存破坏器的全局来简化这一点。

在您的情况下,您可以删除 val 全局变量并将文档就绪函数调用更改为如下所示:

$(document).ready(function(){
    map=L.map('plot',{crs:L.CRS.Simple}).setView([0,0],10);
    tiles = L.tileLayer('./GraphTile.png?x={x}&y={y}&z={z}&tilesize={tileSize}&{test}', 
    {
        maxZoom: 20,
        continuousWorld: true,
        tileSize: 128,
        test: Math.random()
    }).addTo(map);
});
Run Code Online (Sandbox Code Playgroud)