将我的 GWT 版本升级到 2.5.0 后,当我将鼠标悬停在图表 (SVG) 上时遇到问题。
该问题仅出现在 IE 中(Chrome 和 Firefox 不受影响)。
消息是
捕获 2 个异常:(TypeError)描述:对象不支持属性或方法“包含”编号:-2146827850:对象不支持属性或方法“包含”;
该问题似乎是由DOMImplTrident
名为isOrHasChildImpl
.
我想知道有没有其他人遇到过这个问题或知道除了不使用 IE 的解决方法;)
谢谢
将我的 GWT 版本升级到 2.5.0 后,当我将鼠标悬停在图表 (SVG) 上时遇到问题。
该问题仅出现在 IE 中(Chrome 和 Firefox 不受影响)。
消息是
捕获 2 个异常:(TypeError)描述:对象不支持属性或方法“包含”编号:-2146827850:对象不支持属性或方法“包含”;
该问题似乎是由DOMImplTrident
名为isOrHasChildImpl
.
我想知道有没有其他人遇到过这个问题或知道除了不使用 IE 的解决方法;)
谢谢
这只是一个猜测,但我怀疑您的问题来自 DOMImplTrident.isOrHasChildImpl 方法的第 53 行。
return (parent === child) || parent.contains(child);
我进一步猜测您在 IE10 上遇到错误?我认为您针对 IE10 运行的原因是因为 GWT 没有通过单独的 DOM 实现正式支持 IE10。它最终会在 IE10 上使用 DOMImplIE9 实现,而后者又使用来自 DOMImplTrident 的上述方法来实现其“isOrHasChild”。我想知道第47行是否
if (parent.nodeType == 9) {
实际上并没有为文档节点返回 9 并因此进入文档节点的“else”语句并在它尝试访问“包含”方法时爆炸。也许 IE10 没有像以前版本的 IE 那样实现那些节点方法?没有把握。
我没有方便的 IE10 来测试这个理论,但这可能是一个很好的起点。您可以创建自己的 JSNI 方法,该方法进行类似的节点调用以测试理论,并查看“document.nodeType”是否确实返回 9 或“node.contains”是否在各种类型的节点上爆炸。
如果这确实是问题所在。您可以尝试一些方法来解决/避免该问题。
尝试在您的入口点连接 GWT.setUncaughtExceptionHandler() 并完全忽略错误。
在调用问题代码并忽略异常的“您的”方法之一中围绕代码块粘贴 try/catch。
尝试将以下元标记添加到您的 html 文件中,看看在 IE10 中呈现为 IE9 是否可以解决问题。
<meta http-equiv="X-UA-Compatible" content="IE=9" />
创建一个扩展 DOMImplIE9 的自定义 DOMImpl 并使用您自己的自定义方法覆盖“isOrHasChild”方法,您可以控制发生的情况。例如
package com.google.gwt.dom.client;
public class DOMImplIE9Custom extends DOMImplIE9 {
@Override
public boolean isOrHasChild(Node parent, Node child) {
// Do your own thing
}
}
然后,您使用延迟绑定通过您的自定义实现来切换 DOMImplIE9,如下所示:
<replace-with class="com.google.gwt.dom.client.DOMImplIE9Custom">
<when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
<when-property-is name="user.agent" value="ie9"/>
</replace-with>
即使我偏离了基础并且您没有使用 IE10,您仍然可以尝试上述想法来解决该问题。要么这样做,要么进行最终修复并完全停止使用 IE,避免数小时的压力 :) 希望至少能帮助你走上正轨。