2017-10-30 14 views
0

私のgwtコードにキャンバス要素を作成します。その後、新たに作成されたキャンバスDOM要素をペイントするために、サードパーティ製のJavaScriptライブラリを適用したいと考えています。だからここに私がやりたいものの目安です:GWT JSNIで最近作成された要素が見つかりません

public void onModuleLoad() { 
     Canvas canvas = Canvas.createIfSupported(); 
     canvas.getElement().setId("canvas"); 
     canvas.setWidth("800px"); 
     canvas.setHeight("500px"); 
     canvas.getElement().getStyle().setProperty("border", "black solid 1px"); 

     RootPanel.get("rootDiv").clear(); 
     RootPanel.get("rootDiv").add(canvas); 

     getCanvas(); 

上記のコード部分は、新しいcanvas要素を作成し、私の現在のDOMに追加します。新しいキャンバスを追加した後、このキャンバス要素を取得するためにJSNIを適用したいと思います。

public static native void getCanvas() /*-{ 
    console.log("Canvas? = " + document.getElementById("canvas")); 
}-*/; 

ここで私はこのキャンバス要素を見つけたと思います。しかし、代わりにコンソールに次の出力が表示されます。

Canvas? = null 

なぜ新しい要素にアクセスできないのですか?

BTW:ChromeのインスペクタでDOMを確認すると、割り当てられたIDで追加されたキャンバス要素が表示されます。

答えて

2

それは次のようになります。

public static native void getCanvas() /*-{ 
    console.log("Canvas? = " + $wnd.document.getElementById("canvas")); 
}-*/; 

document$wndを追加します。

JSNIの代わりにJsInteropを使用することを検討してください。

+0

ありがとう、それが問題を解決しました。 JsInteropについて:私は私のケースでそれをどのように適用すべきかわかりません。少なくとも私はJsInteropのドキュメントや利点を理解していません。このluigi男のおすすめチュートリアルもありません。つまり、サードパーティのライブラリの機能にアクセスしたいのです。 – toom

+2

あなたのケースでは、elemental2にはすでにconsole.logとdocument.getElementByIdの2つの呼び出しがあります。 JSNIを記述することは、JSNIがgwt 3で動作しなくなることを除いてJsInteropを呼び出すことと同じくらい難しく、JsInteropのように型安全ではありません。 –

関連する問題