GWT RootPanel.get(“id”)不会返回嵌入HTML元素的div标记。
离。 &LT;身体GT; &LT;表&gt; &LT; TR&GT; &LT; TD&GT; &lt; div id =“x”/><td>...</table> ...
如何访问此div标签和“添加小部件”。
我尝试过的一件事是从widget或widget.getElement()中获取元素,并将此元素添加到从DOM.getElementById()获取的元素中。
小部件确实已添加,但是,所有鼠标点击都会丢失,小部件不再响应。小部件是菜单项的组合,因此鼠标单击会导致菜单项丢弃,但它只是选择文本。
答案 0 :(得分:13)
如果您的第一句中的“HTML元素”实际上是指“HTML小部件”,那么您应该使用HTMLPanel小部件,然后只需使用其add(Widget,String)
或add(Widget,Element)
方法添加您的现有子元素中的小部件。
如果您实际上在谈论“具有现有父窗口小部件的窗口小部件可能未添加到分离列表”断言错误,那么从GWT 2.3开始,您现在可以wrap an existing DOM element within an HTMLPanel,然后使用与上述相同的add
方法:
HTMLPanel container = HTMLPanel.wrap(Document.get().getElementById("container"));
答案 1 :(得分:3)
您使用DOM.getElementById()
的方法是正确的。 GWT Widgets创建一个与DOM并行的对象树,因此您必须另外将此对象树“附加”到DOM以接收事件。这是通过onAttach()
方法完成的。
不幸的是,此方法为protected
,因此您无法直接调用它。解决方法是创建一个简单的Widget包装类并将其公开:
public void onAttach() {
super.onAttach();
}
请注意,必须确保Widget在未显示时已分离,因为如果不这样做可能会泄漏内存。最简单的方法是拨打RootPanel.detachOnWindowClose(widget)
。
<强>更新强>
正如Thomas Broyer所说(并且他的话被视为“来源”) - 使用HTMLPanel.wrap(yourDivElement)
,因为这将正确地执行您需要它做的事情 - 将Widget附加到DOM树。
我建议的方法是hackish,只有当你实际编写一个新的Widget时我才会推荐它(因为我需要在我的一个项目中执行并在此处复制我的代码)。