将我的GWT版本升级到2.5.0后,当我将鼠标悬停在图表(SVG)上时出现问题。
此问题仅出现在IE中(Chrome和Firefox不受影响)。
消息是
捕获的2个异常:(TypeError)描述:对象不支持 属性或方法'包含'编号:-2146827850:对象没有 支持属性或方法'包含';
此问题似乎是由名为DOMImplTrident
的{{1}}类中的新方法引起的。
我想知道是否有其他人遇到此问题或知道除了不使用IE之外的其他工作;)
由于
答案 0 :(得分:3)
这只是猜测,但我怀疑你的问题来自DOMImplTrident.isOrHasChildImpl方法的第53行。
return (parent === child) || parent.contains(child);
我进一步猜测你在IE10上遇到了你的错误?我认为你是针对IE10运行的原因是因为GWT没有正式支持带有单独DOM实现的IE10。它最终会在IE10上使用DOMImplIE9实现,后者又使用DOMImplTrident的上述方法实现其'isOrHasChild'。我想知道是否第47行
if (parent.nodeType == 9) {
实际上并没有为文档节点返回9,因此当它尝试访问'contains'方法时,它会进入文档节点的'else'语句并被炸毁。也许IE10没有实现那些与以前版本的IE相同的节点方法?不确定。
我没有IE10方便测试这个理论,但这可能是一个很好的起点。您可以创建自己的JSNI方法,进行类似的节点调用以测试理论,看看'document.nodeType'是否确实返回9,或者'node.contains'是否在各种类型的节点上爆炸。
如果这确实是问题所在。您可以尝试一些方法来解决/避免问题。
尝试在入口点连接GWT.setUncaughtExceptionHandler()并完全忽略错误。
在调用问题代码的“你的”方法之一的代码块周围粘贴一个try / catch并忽略异常。
尝试将以下元标记添加到您的html文件中,看看IE10中的渲染是否能解决问题。
<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并避免长时间的压力:)希望这有助于让你至少走上正确的轨道。