2017-10-30 2 views
0

gwt 코드에 캔버스 요소를 만들고 싶습니다. 그런 다음 새로 만든 캔버스 DOM 요소에 페인트하기 위해 제 3 자 자바 스크립트 라이브러리를 적용하고 싶습니다.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(); 

위의 코드 조각은 새로운 캔버스 요소를 만들고 내 현재 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의 문서 또는 이점을 이해하지 못합니다. 이 루이지 녀석이 추천 한 튜토리얼도 아닙니다. 내 말은 타사 라이브러리의 기능에 액세스하려고합니다. – toom

+2

당신의 경우, elemental2는 이미 console.log와 document.getElementById 두 개의 호출을 가지고 있습니다. 세 번째 파트 라이브러리를 호출하기 위해 JSNI를 작성하는 것은 JSNI가 gwt 3에서 작동을 멈추고 JsInterop처럼 형식이 안전하지 않다는 점을 제외하면 JsInterop을 호출하여 JSNI를 호출하는 것만 큼 어렵습니다. –

관련 문제