是的!您可以使用 JavaScript 执行此操作,也可以添加事件侦听器并执行与普通 HTML 页面类似的其他 DOM 操作。 (请参阅此答案的底部,了解如何在给定两点的情况下在 SVG 上画一条线。)
我正在做一个正是这样做的项目。用户可以输入他们的起始房间号和目的地房间号,并在 SVG 上绘制路线。
这有点乏味,但我们所做的是在 SVG 上放置圆形元素。每个门口外面都有元素,走廊交叉口也有。
一个典型的元素如下。
<circle
id="route3287-1"
style="fill:#000000;stroke:none"
cx="2014.0000"
cy="239.6"
r=".05"
data-neighbors="route3296-1,06-07" />
请注意,radius 属性足够小,以至于在 SVG 上看不到它(除非用户决定放大很多)。我们还手动将相邻点的 ID 输入到 data-neighbors 属性中。这是因为我们的后端解析 SVG 文件,使用这些点构建图形,并使用 Dijkstra 算法生成路线。我们使用 cx 和 cy 属性来计算图上节点之间的距离。
这是点的特写(当半径大到可以看到它们时)
现在,当生成路线时,我们只是在 SVG 上的每个点之间画线。我们将每条线放在一个组中,以便稍后通过 id 引用它,并在决定绘制新线时删除整个路线。
这是一个例子。其中“svg”是对 SVG 元素的引用,这是我们如何在两点 (x1,y1,x2,y2) 之间绘制一条线,您可以轻松地遍历点列表并以类似的方式绘制所有线.
var newElement = svg.createElementNS('http://www.w3.org/2000/svg', 'path');
newElement.setAttribute('d', 'M' + x1 + ',' + y1 + 'L' + x2 + ',' + y2);
newElement.style.stroke = '#000000';
newElement.style.strokeWidth = '15px';
svg.appendChild(newElement);