2013-08-07 55 views
0

我正在嘗試將自定義JavaScript庫與我的SmartGWT項目集成。通過javascript在構造函數中創建的SmartGWT/GWT訪問div

我有一個通過點擊按鈕,因此在Java代碼中動態加載我有類似如下的僞代碼我的網頁方面:

button . onClick { 
    contextArea = new contextAreaTypeA() 
} 

所以我contextAreaTypeA創建並在構造函數中我想創建一系列div元素,爲它們分配ID,然後在自定義庫中調用一個函數,該函數將內容加載到這些div中。

SmartGWT擺脫了在頁面中的任何元素上獲取ID或設置ID的任何方式,以創建元素上的ID,您可以創建自己的小部件並覆蓋getInnerHtml或創建類似HTMLFlow和添加內容像myflow.setContent('<div id="myID" ></div>');這是我這樣做的方式。

我的問題是,在構造函數中這樣做意味着,當我來調用我的自定義JavaScript函數,它需要一個ID,我創建這個div似乎並沒有附加到DOM,所以我總是得到一個空指針。

由於我的模塊和文檔已經加載,並且這個內容被動態添加,所以我無法調用文檔就緒或onModuleLoad,那麼如何以及何時應該檢測我的div的負載以及何時可以安全訪問來自JSNI調用的div?我已經嘗試了添加附加處理程序(他們似乎從未被調用),我已經嘗試添加繪製處理程序到HTMLFlow,但它們似乎被調用後,其繪製的htmlflow股利但之前它實際上是繪製的內容。我曾嘗試調用HTMLFlow()上的重繪,但這甚至不會調用onDraw方法。

我不知道如何將這個庫與我的SmartGWT集成在一起,如果任何人都可以提出更好的(或任何)方法來做到這一點,那就太棒了。

回答

0

所以事實證明,我認爲我的問題根本不是問題,實際上它是完全不同的問題。

onAttach()仍然不會觸發,因爲我似乎無法解決問題,但是在drawHandler中執行所有操作都可以正常工作。

的原因,我提到了出來空的是,當我試圖訪問元素,而我一直在使用

$wnd.document.getElementById("myDiv"); 

在JavaScript中我使用

document.getElementById("myDiv"); 

這倒我相信GWT在iframe中包裝腳本的方式(我的理解是腳本可以在運行時動態注入,但我可能是錯的)。

0

在純GWT ovverriding Widget.onAttach()爲我做的伎倆:

public class MyWidget extends Widget { 

    @Override 
    protected void onAttach() { 
     super.onAttach(); 
     // Call your JSNI code 
    } 

} 

重要的事情:

  • 注重super.onAttach()通話。必須在之前將您的JSNI電話撥打
  • 圖像將被加載onAttach()。所以如果你的JS代碼使用圖像做一些技巧(例如檢查它們的高度),那麼它會提前。
+0

問題在於onAttach似乎從未被SmartGWT小部件解僱。例如,當附加HTMLFlow時,onAttach方法不會被觸發。我不知道爲什麼。其次,附加意味着它將被附加,但不一定是它的內容。 –

+0

奇怪。對於GWT調用'super.onAttach()'意味着附加我和所有的孩子。 –

+0

你有沒有嘗試重寫'onDraw()'? –

相關問題