【发布时间】:2019-06-14 10:53:48
【问题描述】:
我正在开发一个以交互式地图为中心的 Angular 应用程序,该地图已作为 SVG 图像提供。地图的某些区域会有热点,我可以点击这些热点来触发某些事件,例如当我点击位置标记时放大某个部分。
但是,没有鼠标事件起作用。我可以在 TypeScript 中更改 SVG 的属性(例如,更改 SVG 视图框以进行平移和缩放,或在事件发生时以红色突出显示标签),但我无法触发 SVG 本身内的任何单击、滚动、悬停等事件.
到目前为止我已经尝试过:
- 向 SVG 添加角度事件属性,这显然不是有效的 XML,因此浏览器无法解析它以进行渲染,并且;
- 通过它的 ID 查找元素(我可以),然后将匿名
onclick函数附加到它 - 但它永远不会被触发
SVG 通过object 标签包含在内。
<!--map.component.html-->
<object id="svg-object" #svgObject type="image/svg+xml" data="../../../assets/img/map_large.svg"></object>
在 SVG 加载后的组件中,我执行以下操作,但没有任何反应。它甚至没有进入函数。
// map.component.ts
this.svgDocument = this.svgObject.nativeElement.contentDocument.documentElement;
let el = this.svgDocument.getElementById("zoomToThis");
// this never gets triggered
el.addEventListener("click", function(event)
{
event.currentTarget.style.opacity = "1";
}
);
但是,这很好用。所以很明显,访问文档元素不是问题。
// map.component.ts
this.svgDocument = this.svgObject.nativeElement.contentDocument.documentElement;
let el = this.svgDocument.getElementById("zoomToThis");
el.style.opacity = "1";
我该如何解决这个问题?我正在玩弄把它全部撕掉并在 iFrame 中使用 vanilla JavaScript 的想法,但我被告知领导拒绝这样做。鉴于地图的庞大规模,我们也拒绝将其内联。
【问题讨论】:
-
您能否提供一个简化的演示 (minimal reproducible example) 来演示该问题?
-
经过反复试验,我自己找到了解决方案。 stackoverflow.com/a/56610864/9208795
标签: javascript angular typescript svg