4

将我的 GWT 版本升级到 2.5.0 后,当我将鼠标悬停在图表 (SVG) 上时遇到问题。

该问题仅出现在 IE 中(Chrome 和 Firefox 不受影响)。

消息是

捕获 2 个异常:(TypeError)描述:对象不支持属性或方法“包含”编号:-2146827850:对象不支持属性或方法“包含”;

该问题似乎是由DOMImplTrident名为isOrHasChildImpl.

我想知道有没有其他人遇到过这个问题或知道除了不使用 IE 的解决方法;)

谢谢

4

1 回答 1

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 并因此进入文档节点的“else”语句并在它尝试访问“包含”方法时爆炸。也许 IE10 没有像以前版本的 IE 那样实现那些节点方法?没有把握。

我没有方便的 IE10 来测试这个理论,但这可能是一个很好的起点。您可以创建自己的 JSNI 方法,该方法进行类似的节点调用以测试理论,并查看“document.nodeType”是否确实返回 9 或“node.contains”是否在各种类型的节点上爆炸。

如果这确实是问题所在。您可以尝试一些方法来解决/避免该问题。

  1. 尝试在您的入口点连接 GWT.setUncaughtExceptionHandler() 并完全忽略错误。

  2. 在调用问题代码并忽略异常的“您的”方法之一中围绕代码块粘贴 try/catch。

  3. 尝试将以下元标记添加到您的 html 文件中,看看在 IE10 中呈现为 IE9 是否可以解决问题。

    <meta http-equiv="X-UA-Compatible" content="IE=9" />
    
  4. 创建一个扩展 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,避免数小时的压力 :) 希望至少能帮助你走上正轨。

于 2013-07-31T07:05:10.827 回答