Object不支持此属性或方法

时间:2013-07-30 10:05:44

标签: internet-explorer gwt svg typeerror

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

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

消息是

  

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

此问题似乎是由名为DOMImplTrident的{​​{1}}类中的新方法引起的。

我想知道是否有其他人遇到此问题或知道除了不使用IE之外的其他工作;)

由于

1 个答案:

答案 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'是否在各种类型的节点上爆炸。

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

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

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

  3. 尝试将以下元标记添加到您的html文件中,看看IE10中的渲染是否能解决问题。

    <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
        }
    }
    
  5. 然后使用延迟绑定将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并避免长时间的压力:)希望这有助于让你至少走上正确的轨道。