javascript - 如何制作 SVG :A elements clickable when using D3. js 平移和缩放行为?

标签 javascript jquery css svg d3.js

我有一个图表包含“svg:a”元素,并设置了 xlink:href 值。我需要缩放和平移图表,但我希望“svg:a”元素仍然可以点击。

一旦我添加了缩放行为,点击事件就不再到达“svg:a”元素。我该如何解决这个问题?

注意:右键单击“在新选项卡中打开”仍然有效。

这是一个 fiddle :http://jsfiddle.net/0kwudfhc/5/

这是运行版本:http://jsfiddle.net/0kwudfhc/5/embedded/result/

来源的相关部分:

<style>
   ...
          .overlay {
            fill: none;
            pointer-events: all;
          }
   ...
</style>
   <script type="text/javascript">
      (function() {
        function render(data){

          var svg = d3.select("#diagram")
            .append("svg:svg")
              .attr("width", data.diagram.width)
              .attr("height", data.diagram.height)
              .append("g")
                .attr("transform", "translate(0,"+data.diagram.height+")")
                .append("g")
                  .call(d3.behavior.zoom().scaleExtent([0.5, 8]).on("zoom", zoom))
                  .on("dblclick.zoom", null)
                  .append("g");

          svg.append("rect")
            .attr("class", "overlay")
            .attr("x", 0)
            .attr("y", -data.diagram.height)
            .attr("width", data.diagram.width)
            .attr("height", data.diagram.height);

          function zoom() {
            svg.attr("transform", "translate(" + d3.event.translate + ") scale(" + d3.event.scale + ")");
          }

          ...

          var docs = svg.append("g").attr("id", "docs")
          .data([d3.values(data.documents).sort(function(a,b){return a.order - b.order;})])
          .selectAll(".node")
            .data(function(d){return d;})
            .enter()
              .append("svg:a")
                .attr("class", "node")
                .attr("target", "_top")
                .attr("xlink:href", function(d){return d.url;})
                .append("g")
                  .attr("id", function(d){ return "node_"+d.id;})
                  .attr('transform', function(d) { return "translate("+d.x+","+d.y+")" })
                  .on('mouseover', function(d) { ... })
                  .on('mouseout', function(d) { ... });       

          ...
        };

最佳答案

我最后做的是..

关闭双击缩放。

 ...
 .append("g")
   .call(d3.behavior.zoom().scaleExtent([0.5, 8]).on("zoom", zoom))
   .on("dblclick.zoom", null) // <---- turn off double click zoom
   .append("g");

在添加新节点时,添加了一个“点击”处理程序

      ...
              var hrefs = svg.append("g").attr("id", "docs")
    .data([d3.values(data.documents)])
    .selectAll(".node")
      .data(function(d){return d;})
      .enter()
        .append("svg:a")
          .attr("class", "node")
          .attr("target", "_top")
          .attr("xlink:href", function(d){return d.url;})
          .on('click', clickit, true);  // <<<< added on click method

然后从“a”元素中提取 url 并告诉浏览器在新选项卡/窗口中打开它。

    function clickit(){
      window.open(this.href.animVal);
    }      

关于javascript - 如何制作 SVG :A elements clickable when using D3. js 平移和缩放行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28443754/

相关文章:

javascript - jQuery/JavaScript 日期表单验证

javascript - 删除 Pixi 应用程序中所有 child 的 child

javascript - 尝试在线加载 CSS 和 JS,如果失败则在本地加载

php - JQuery 预先准备崩溃

javascript - 根据浏览器缩放更改 css

html - 制作一个固定在特定高度的div

html - HTML 内衬问题中的元素

html - 允许元素出现在滚动条上

javascript - 使用 javascript/jquery 加载文件

javascript - 为什么在尝试更改链接属性时,即使控制台输出正确的结果,DOM 仍保持不变?