我猜测您的问题可能来自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”语句并在尝试访问“contains”方法时崩溃。也许IE10不像之前的IE版本一样实现这些节点方法?不确定。
我手头没有IE10来测试这个理论,但这可能是一个好的起点。您可以创建自己的JSNI方法,进行类似的节点调用以测试该理论,并查看“document.nodeType”是否确实返回9,或者“node.contains”是否在各种类型的节点上崩溃。
如果确实是这个问题,您可以尝试一些方法来修复/避免问题。
Try hooking up an GWT.setUncaughtExceptionHandler() in your entry point and just ignore the error altogether.
Stick a try/catch around the block of code in one of 'your' methods that is invoking the problem code and ignore the exception.
Try adding the following meta tag to your html file and see if rendering in IE10 as IE9 solves the problem.
<meta http-equiv="X-UA-Compatible" content="IE=9" />
Create a custom DOMImpl that extends DOMImplIE9 and overrides the 'isOrHasChild' method with your own custom method where you have control over what happens. For example
package com.google.gwt.dom.client;
public class DOMImplIE9Custom extends DOMImplIE9 {
@Override
public boolean isOrHasChild(Node parent, Node child) {
}
}
然后,您可以使用延迟绑定来切换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,并避免多个小时的压力。希望这能帮助您找到正确的解决方案。