2017-03-15 64 views
0

我有一个基于JSON文件生成的d3概念地图。我修改了一些我在网上找到的其他代码,但我很难浏览它并找出在哪里放置东西。看到我的版本的Live去这里:svg元素内的音频d3地图不能播放

http://melijimenez.com/fdm177/public/index.php

如果你点击你,要么对应于某个项目或类别的圆节点的项目。我想如果该项目是一个ditem,有一个播放按钮,用户可以点击播放音频。 “不要忘记我的社区”会有一个播放按钮,我可以点击该按钮播放与该节点相对应的剪辑。

enter image description here

我已成功加入HTML5音频元素到每个ditem节点通过修改该函数

function b(X) { 
    var X = E.selectAll(".node").data(X, u); 
    var Y = X.enter().append("g").attr("transform", function(aa) { 
     var Z = aa.parent ? aa.parent : { 
      xOffset: 0, 
      x: 0, 
      y: 0 
     }; 
     return "translate(" + Z.xOffset + ",0)rotate(" + (Z.x - 90) + ")translate(" + Z.y + ")" 
    }).attr("class", "node").on("mouseover", g).on("mouseout", n).on("click", G); 
    Y.append("circle").attr("r", 0).attr("fill", "#fff"); 
    Y.append("text").attr("font-size", 0).attr("class", "label"); 
    Y.append("audio").attr("id", "clip").attr("type","audio/mpeg").attr("src", function(jsonItem) { 
     return jsonItem.audio_loc 
    }); 

    /**Y.append("audio").attr("id","clip").append("source").attr("src", function(jsonItem) { 
     return jsonItem.audio_loc 
    });**/ 
    X.transition().duration(w).ease(F).attr("transform", function(Z) { 
     if (Z === L.node) { 
      return null 
     } 
     var aa = Z.isGroup ? Z.y + (7 + Z.count) : Z.y; 
     return "translate(" + Z.xOffset + ",0)rotate(" + (Z.x - 90) + ")translate(" + aa + ")" 
    }); 
    X.selectAll("circle").transition().duration(w).ease(F).attr("r", function(Z) { 
     if (Z == L.node) { 
      return 100 
     } else { 
      if (Z.isGroup) { 
       return 7 + Z.count 
      } else { 
       return 4.5 
      } 
     } 
    }); 
    X.selectAll("text").transition().duration(w).ease(F).attr("dy", ".3em").attr("font-size", function(Z) { 
     if (Z.depth === 0) { 
      return 10 
     } else { 
      return 15 
     } 
    }).text(function(Z) { 
     return Z.name 
    }).attr("text-anchor", function(Z) { 
     if (Z === L.node || Z.isGroup) { 
      return "middle" 
     } 
     return Z.x < 180 ? "start" : "end" 
    }).attr("transform", function(Z) { 
     if (Z === L.node) { 
      return null 
     } else { 
      if (Z.isGroup) { 
       return Z.x > 180 ? "rotate(180)" : null 
      } 
     } 
     return Z.x < 180 ? "translate(" + t + ")" : "rotate(180)translate(-" + t + ")" 
    }); 
    X.selectAll("text.label-stroke").attr("display", function(Z) { 
     return Z.depth === 1 ? "block" : "none" 
    }); 
    X.exit().remove() 
} 

我还修改的onclick功能播放音频被点击节点时:

if (Y.type === "ditem") { 
      clip = $("#clip")[0]; 
      console.log("node has been clicked") 
      if (clip.paused == false) { 
       clip.pause(); 
       alert('clip paused'); 
      } else { 
       clip.play(); 
       alert('clip playing'); 
      } 
      //window.location.href = "/" + Y.slug; 
      return 
     } 

单击该节点时,会生成控制台消息“节点已被单击”。然而,对于音频开始播放我得到:

concept-map.js:595 Uncaught TypeError: clip.play is not a function 
    at SVGGElement.G (concept-map.js:595) 
    at SVGGElement.__onclick (d3.js:1) 

下面是完整的代码:http://melijimenez.com/fdm177/public/js/concept-map.js

太感谢你了!

PS:我已经发布了关于这张地图的另一个问题,但由于我发布的问题是不同的和不相关的,我想我会为这个特定的查询做一个单独的帖子。

回答

0

play()不是jQuery函数,而是DOM元素的函数。因此您需要在DOM元素上调用它。因此,尝试以下操作:

clip = document.getElementById('clip')

,然后调用play()clip

在这里使用非JQuery方式会简单得多。