4

GWT のバージョンを 2.5.0 にアップグレードした後、グラフ (SVG) にカーソルを合わせると問題が発生します。

この問題は IE でのみ発生します (Chrome と Firefox は影響を受けません)。

メッセージは

2 つの例外がキャッチされました: (TypeError) 説明: オブジェクトはプロパティまたはメソッド 'contains' をサポートしていません number: -2146827850: オブジェクトはプロパティまたはメソッド 'contains' をサポートしていません。

DOMImplTridentこの問題は、 というクラスの新しいメソッドが原因のようisOrHasChildImplです。

他の誰かがこの問題に遭遇したか、IEを使用しない以外の回避策を知っているのではないかと思っています;)

ありがとう

4

1 に答える 1

3

これは単なる推測ですが、問題は DOMImplTrident.isOrHasChildImpl メソッドの 53 行目にあると思われます。

return (parent === child) || parent.contains(child);

さらに、IE10 でエラーが発生していると思いますか? あなたが IE10 に対して実行していると私が思う理由は、GWT が別の DOM 実装で IE10 を正式にサポートしていないためです。IE10 で DOMImplIE9 実装を使用することになり、その 'isOrHasChild' 実装に DOMImplTrident の上記のメソッドが使用されます。47行目かどうか疑問に思っています

if (parent.nodeType == 9) {

実際にはドキュメント ノードに対して 9 を返さないため、ドキュメント ノードの「else」ステートメントにドロップされ、「contains」メソッドにアクセスしようとすると爆発します。おそらく、IE10 は以前のバージョンの IE と同じようにこれらのノード メソッドを実装していないのでしょうか? わからない。

この理論をテストするのに便利な IE10 はありませんが、始めるには良い場所かもしれません。同様のノード呼び出しを行う独自の JSNI メソッドを作成して理論をテストし、「document.nodeType」が実際に 9 を返すかどうか、または「node.contains」がさまざまなタイプのノードで爆発するかどうかを確認できます。

それが問題であることが判明した場合。問題を修正/回避するために、いくつかのことを試すことができます。

  1. エントリ ポイントで GWT.setUncaughtExceptionHandler() を接続してみて、エラーを完全に無視してください。

  2. 問題のコードを呼び出している「あなたの」メソッドの 1 つのコード ブロックの周りに try/catch を貼り付け、例外を無視します。

  3. 次のメタ タグを html ファイルに追加してみて、IE10 で IE9 としてレンダリングすると問題が解決するかどうかを確認してください。

    <meta http-equiv="X-UA-Compatible" content="IE=9" />
    
  4. DOMImplIE9 を拡張し、'isOrHasChild' メソッドを独自のカスタム メソッドでオーバーライドするカスタム DOMImpl を作成し、何が起こるかを制御します。例えば

    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 に答える