Я пытаюсь запустить функцию, которая оттеняет отдельные состояния карты TOPOJSON D3 на основе данных.Как запустить функцию после D3 TOPOJSON загрузить карту
Однако функция продолжает работать до того, как состояния загрузятся/появятся в SVG. Функция, которая строит карту, вызывается в функции готовности документа. Я попытался добавить прослушиватель событий к состояниям. Атрибут .on вызывает функцию, которая должна затенять состояния и использовала window.load. Но функция, которая оттеняет состояния продолжает работать до того состояния появляются на экране, и, таким образом, возвращает значение NULL, при попытке найти каждое состояние их идентификатор
.background {
fill: none;
pointer-events: all;
}
#states {
fill: #aaa;
}
#states .active {
fill: orange;
}
#state-borders {
fill: none;
stroke: #fff;
stroke-width: 1.5px;
stroke-linejoin: round;
stroke-linecap: round;
pointer-events: none;
}
</style>
<body>
<script src="//d3js.org/d3.v3.min.js"></script>
<script src="//d3js.org/topojson.v1.min.js"></script>
<script>
function buildmap(){
var width = 960,
height = 500,
centered;
var projection = d3.geo.albersUsa()
.scale(1070)
.translate([width/2, height/2]);
var path = d3.geo.path()
.projection(projection);
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
svg.append("rect")
.attr("class", "background")
.attr("width", width)
.attr("height", height)
.on("click", clicked);
var g = svg.append("g");
d3.json("/mbostock/raw/4090846/us.json", function(error, us) {
if (error) throw error;
g.append("g")
.attr("id", "states")
.selectAll("path")
.data(topojson.feature(us, us.objects.states).features)
.enter().append("path")
.attr("d", path);
g.append("path")
.datum(topojson.mesh(us, us.objects.states, function(a, b) { return a !== b; }))
.attr("id", "state-borders")
.attr("d", path);
});
};
function colorstates(){
var mainstate = document.getElementById("texas")
mainstate.style.fill="blue"
}
$(document).ready(function((){
buildmap()
colorstates() //I have also used window.load and adding .on attribute to svg/d3
Это все равно возвращает mainstate как null. Я переместил вызов colorstates() на d3.json до и после определения функции. Оба возвращают mainstate как null. – auto
Итак, у вас есть * другая * проблема: нет элемента с ID = "texas". Как вы устанавливаете идентификаторы? –
«texas» создается, когда функции создаются в d3 из topojson. Я добавил предупреждение в colorstates(), и предупреждение запускается до того, как карта появится в браузере. – auto