如何用我的GWT小部件替换元素?

Jar*_*uba 11 gwt widget

是否可以用我的widget组件替换已知的html元素?(强调"替换"这个词,我不想把小部件放在那个元素中.:)

<body>
  <img />
  <div />
  <a id="tmpEl" />
  ...
  <img />
</body>
Run Code Online (Sandbox Code Playgroud)

会成为

<body>
  <img />
  <div />
  <div class="gwt-panel">...</div>
  ...
  <img />
</body>
Run Code Online (Sandbox Code Playgroud)

我试过这样的事......

tmpEl.getParentElement().replaceChild(myPanel.getElement(), tmpEl);
Run Code Online (Sandbox Code Playgroud)

...但是由此产生的DOM元素是'聋',即他们没有收到点击事件.(为了完成这项工作,我可能不得不调用RootPanel.get().采用(widget),但该方法无法访问.)

有一段时间我认为HTMLPanel.addAndReplaceElement可能是答案,但这只适用于你的'placeholder'元素是HTMLPanel小部件的(直接)子元素.这显然不是我的情况.:(

请注意,我只知道该元素的id,我不是在创建它.简单地说:我完全需要问题.

至于"更高级别的DOM操作":如果它允许我放置小部件而不是那个占位符元素,我将很乐意以最高级别操作DOM.

Jar*_*uba 5

似乎在将widget插入DOM之后调用widget.onAttach()可以解决问题.

class MyWidget extends Composite
{
  ...

  public void attach()
  {
    /* Widget.onAttach() is protected
     */
    onAttach();

    /* mandatory for all widgets without parent widget
     */
    RootPanel.detachOnWindowClose(this);
  }
}

tmpEl.getParentElement().replaceChild(myWidget.getElement(), tmpEl);
myWidget.attach();
Run Code Online (Sandbox Code Playgroud)

感谢Google Web Toolkit小组的 André .

我仍然想知道为什么没有RootPanel.addAndReplaceElement(Widget,Element),类似于HTMLPanel.addAndReplaceElement(Widget,Element).


mar*_*vic -1

我建议你尝试这样的事情......

<body>
  <a id="tmpEl" />
</body>
Run Code Online (Sandbox Code Playgroud)

然后在某处创建一个小部件(例如文本框小部件)

TextBox tb = new TextBox();
Run Code Online (Sandbox Code Playgroud)

创建小部件后,您可以使用 tb.getElement() 获取它的 DOM 对象(我不确定这是正确的方法名称,但它肯定类似于 getElement)

之后你可以使用

Element parent = Document.getElementById('tmpEl').getParent();
parent.removeChild(Document.getElementById('tmpEl'));
parent.appendChild(tb.getElement());
Run Code Online (Sandbox Code Playgroud)

add() 所做的另一件事是在要添加到面板的小部件上调用 Widget.onAttach()。onAttach 做了一些工作来注册小部件以接收事件。

您可以尝试调用 tb.onAttach(); 可能还需要调用 RootPanel.detachOnWindowClose(tb); (如上一篇文章中提到的)