В вашей увеличенной функции проверьте, определено ли d3.event.sourceEvent
.Увеличение, вызванное selection.call(zoom.transform,someZoomTransform)
, имеет sourceEvent of null.Кроме того, sourceEvent.type
может предоставить дополнительную информацию о типе события (например, колесо, движение мыши).
Этот подход используется в примере кисти и масштабирования Bostock .Чистка вручную запускает программное обновление масштабирования, а ручное масштабирование запускает программное обновление кисти: в примере необходимо определить, что такое ручное или программное масштабирование / кисть, чтобы избежать бесконечного цикла.
Ниже программного масштабированияприменяется к SVG (охватывает окно предварительного просмотра фрагмента), но вы также можете панорамировать / масштабировать.Проверяя, имеет ли значение sourceEvent значение NULL, мы можем видеть, было ли масштабирование инициировано пользователем или программно:
var svg = d3.select("body")
.append("svg")
.attr("width", 600)
.attr("height", 500);
var zoom = d3.zoom()
.on("zoom", function() {
if(d3.event.sourceEvent) {
console.log("not programmatic zoom");
}
else {
console.log("programmatic zoom");
}
})
svg.call(zoom);
svg.call(zoom.transform,d3.zoomIdentity);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>