Internet explorer SVG';s node.getScreenCTM()方法在IE 9中失败
我在SVG中使用了一些javascript来观察鼠标事件,需要将鼠标坐标转换为SVG空间中的实际坐标(使用viewBox和其他转换) 此代码适用于WebKit/Gecko浏览器:Internet explorer SVG';s node.getScreenCTM()方法在IE 9中失败,internet-explorer,exception,svg,Internet Explorer,Exception,Svg,我在SVG中使用了一些javascript来观察鼠标事件,需要将鼠标坐标转换为SVG空间中的实际坐标(使用viewBox和其他转换) 此代码适用于WebKit/Gecko浏览器: function transformEventCoordsToNodeCoords(evt,node) { var point = document.documentElement.createSVGPoint(); point.x = evt.clientX; point.y = evt.clientY;
function transformEventCoordsToNodeCoords(evt,node)
{
var point = document.documentElement.createSVGPoint();
point.x = evt.clientX;
point.y = evt.clientY;
var ctm = node.getScreenCTM();
return point.matrixTransform(ctm.inverse());
}
在IE 9中,getScreenCTM()引发异常:
Unexpected call to method or property access.
我在网上找到的示例代码表明我的代码是正确的,我甚至发现一个SVG似乎使用了完全相同的技术,它在IE 9中工作:
节点
变量是一个
:
PS:将此SVG上载到可公开访问的服务器是很困难的。我发现了问题
在IE 9中,您不能在父节点为display:none的节点上调用getScreenCTM()
代码>
如果查询节点为显示:无
那么可以调用getScreenCTM()
,但不能在隐藏元素的子节点上调用它
我的解决方法是从display:none切换代码>至<代码>不透明度:0调用getScreenCTM()
,然后立即将其更改回display:none代码>是否检查了节点变量是否真的是IE9中SVGRCTELEMENT类型的对象?是的,我通过console.log()来确定。IE 9给出了:LOG:[object SVGRectElement]
。另外,console.log(node.getScreenCTM)
显示该方法确实存在(函数{internal code})或其他东西。您还可以设置可见性:hidden
,它应该可以工作(至少根据规范)。
<rect id="tooltip_box" x="698.7705078125" y="278.19676208496094" rx="20" ry="20" width="310" height="165" class="tooltip_box_region_level_1"></rect>