我有以下代码使用D3.js加载json数据:
this.clickCountry = function(d) {
"use strict"
var time_for_remove = 500,
time_for_zoom = 900
d3.selectAll("svg g").transition().delay(time_for_remove + time_for_zoom - 200).remove()
self.svg.append("g")
.attr("id", "country")
self.regionsGroup = self.svg.select("#country")
var adm1_key = d.id+"_adm1"
try {
var adm1_path = "../topo/"+d.id+"_adm1.json"
} catch (e) {
console.log(e) // "MyError"
}
var adm1_path = "../topo/"+d.id+"_adm1.json"
d3.json(adm1_path, function(error, topology) {
var regions = topology.objects
for(var adm1_key in regions) {
var o = regions[adm1_key]
}
self.regionsGroup.selectAll("path")
.data(topojson.object(topology, o).geometries)
.enter().append("path")
.attr("d", self.projection)
.attr("id", function(d) {
return d.properties.name
})
.classed("country", true)
.attr("class", "country")
.on("mouseover", function(d) {
d3.select(this)
.style("fill", "#6C0")
.append("svg:title")
.text(d.properties.name)
})
.on("mouseout", function(d) {
d3.select(this)
.style("fill", "#000000")
})
.on("click", function(d) {
console.log('clicked on country')
var p = d3.mouse(this)
console.log(p+" "+self.map.invert(p))
self.map.center(self.map.invert(p))
})
})
}
在实际绘制地图之前检查文件是否存在adm1_path = "../topo/"+d.id+"_adm1.json"
的正确方法是什么?
答案 0 :(得分:4)
您可以添加如下函数:
function fileExists(url)
{
var http = new XMLHttpRequest();
http.open('HEAD', url, false);
http.send();
return http.status!=404;
}
然后像这样修改你的代码:
var adm1_path = "../topo/"+d.id+"_adm1.json"
if (!fileExists(adm1_path)) {
alert('We couldn't find that country!') //or some other suitable error/display mechanism
return;
}
d3.json(adm1_path, function(error, topology) {