Сброс масштабирования: только обновления при панорамировании?

#javascript #d3.js

#javascript #d3.js

Вопрос:

Я озадачен тем, что блокирует сброс здесь. После выполнения resetZoom() функции ничего не происходит, пока я не панорамирую svg, затем он возвращается к исходной точке. Есть идеи, почему это может произойти?

Скрипка здесь: https://jsfiddle.net/84d596go/2 /

 var svg = d3.select("div#nodegraph")
                    .append("svg")
                        .attr("width", "100%")
                        .attr("height", "100%")
                        .call(d3.zoom()
                                .scaleExtent([0.25, 5])
                                .on("zoom", function() {
                                    root.attr('transform', d3.event.transform)
                                })
                        );


var root = svg.append('g');


root.append('circle')
                .attr("cx", 10)
                .attr("cy", 10)
                .attr("r", 10)
                .attr("fill", "red");


var resetZoom = function() {
    var zoom = d3.zoom();
    svg.call(zoom.transform, d3.zoomIdentity);
}

document.getElementById("resetZoomButton").onclick = resetZoom;
  

Ответ №1:

Вместо того чтобы создавать другое поведение масштабирования внутри resetZoom , просто используйте то же самое, которое вы передали при выборе. Сначала объявите это:

 const zoom = d3.zoom()
  .scaleExtent([0.25, 5])
  .on("zoom", function() {
    root.attr('transform', d3.event.transform)
  });
  

И тогда:

 var svg = d3.select("div#nodegraph")
  .call(zoom);

var resetZoom = function() {
  svg.call(zoom.transform, d3.zoomIdentity);
}
  

Вот ваш код с этим изменением:

 const zoom = d3.zoom()
  .scaleExtent([0.25, 5])
  .on("zoom", function() {
    root.attr('transform', d3.event.transform)
  });

var svg = d3.select("div#nodegraph")
  .append("svg")
  .attr("width", "100%")
  .attr("height", "100%")
  .call(zoom);

var root = svg.append('g');

root.append('circle').attr("cx", 10).attr("cy", 10).attr("r", 10).attr("fill", "red");

var resetZoom = function() {
  svg.call(zoom.transform, d3.zoomIdentity);
}

document.getElementById("resetZoomButton").onclick = resetZoom;  
 #nodegraph {
  width: 300px;
  height: 300px;
  border: 1px solid #999;
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<div id="nodegraph">
</div>
<button id="resetZoomButton" onClick="resetZoom()">RESET</button>  

Что касается вашего вопроса…

Есть какие-нибудь идеи, почему это может произойти?

… это происходит потому, что только поведение масштабирования внутри call имеет on слушателя, который что-то меняет.

Комментарии:

1. Это не только точно исправляет мою проблему ( jsfiddle.net/84d596go/3 ), это очень подробный ответ, и теперь я понимаю его намного лучше! Спасибо, спасибо!