SmartGWT/GWT通过javascript访问构造函数中创建的div
我正在尝试将自定义javascript库与SmartGWT项目集成 我的页面中有一些区域是通过点击按钮动态加载的,因此在Java代码中,我有一些类似于以下伪代码的内容:SmartGWT/GWT通过javascript访问构造函数中创建的div,javascript,html,gwt,smartgwt,Javascript,Html,Gwt,Smartgwt,我正在尝试将自定义javascript库与SmartGWT项目集成 我的页面中有一些区域是通过点击按钮动态加载的,因此在Java代码中,我有一些类似于以下伪代码的内容: button . onClick { contextArea = new contextAreaTypeA() } 因此,我创建了contextAreaTypeA,在构造函数中,我想创建一系列div元素,为它们分配ID,然后调用自定义库中的一个函数,将内容加载到这些div中 SmartGWT摆脱了在页面中的任何元素上获
button . onClick {
contextArea = new contextAreaTypeA()
}
因此,我创建了contextAreaTypeA,在构造函数中,我想创建一系列div元素,为它们分配ID,然后调用自定义库中的一个函数,将内容加载到这些div中
SmartGWT摆脱了在页面中的任何元素上获取ID或设置ID的任何方式,要在元素上创建ID,您必须创建自己的小部件并覆盖getInnerHtml
,或者创建类似HTMLFlow的内容并添加类似myflow.setContent(“”)的内容代码>我就是这样做的
我的问题是,在构造函数中这样做意味着当我调用带有ID的自定义javascript函数时,我创建的这个div似乎还没有连接到dom,所以我总是得到一个空指针
由于我的模块和文档已经加载,并且正在动态添加此内容,因此我无法调用document ready或onModuleLoad,因此我应该如何以及何时检测我的div的负载,以及何时从JSNI调用中访问div是安全的
我尝试过多种方法,例如添加附加处理程序(它们似乎从未被调用),我尝试过向HTMLFlow添加绘制处理程序,但它们似乎在绘制HTMLFlow div之后,但在实际绘制内容之前被调用。我尝试在HTMLFlow()上调用redraw,但这似乎根本没有调用onDraw方法
我不知道如何将这个库与我的SmartGWT集成,如果有人能建议一种更好(或任何)的方法,那就太好了。在一个普通的GWT ovverridingWidget.onAttach()
为我做点小动作:
public class MyWidget extends Widget {
@Override
protected void onAttach() {
super.onAttach();
// Call your JSNI code
}
}
重要事项:
- 注意
super.onAttach()
调用。必须在调用JSNI之前触发它
- 图像将在
onAttach()之后加载。因此,如果您的JS代码对图像做了一些技巧(例如检查它们的高度),那么就太早了
所以我原来以为自己遇到的问题根本不是问题,事实上是完全不同的问题
OnAtach()仍然没有启动,原因我似乎无法理解,但是在drawHandler中执行所有操作都很好
我的引用出现空值的原因是,当我试图访问javascript中的元素时,我正在使用
document.getElementById("myDiv");
而我应该用
$wnd.document.getElementById("myDiv");
这取决于我相信GWT在iFrame中封装脚本的方式(我的理解是,脚本可以在运行时动态注入?但我可能错了)。问题是,似乎从来没有为SmartGWT小部件启动过onAttach。例如,当连接HTMLFlow时,不会触发onAttach方法。我不知道为什么。第二,被附加意味着它将被附加,但不一定是它的内容。奇怪。对于GWT调用super.onAttach()
意味着附加我和所有孩子。是的,在绘制元素时会触发onDraw,但似乎在绘制HTMLFlow的内容之前,所以它仍然存在相同的问题。我可以尝试重写getInnerHTML并以这种方式执行,而不是在HTMLFlow中嵌入div