Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用我的GWT小部件替换元素?_Gwt_Widget - Fatal编程技术网

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

如何用我的GWT小部件替换元素?,gwt,widget,Gwt,Widget,是否可以用我的小部件组件替换已知的html元素?(强调“替换”一词,我不想将小部件放入该元素中。:) …但生成的DOM元素是“聋子”,即它们没有收到单击事件。(要实现这一点,我可能必须调用RootPanel.get().adopt(小部件),但该方法不可访问。) 有那么一秒钟,我认为这可能是答案,但只有当您的“占位符”元素是HTMLPanel小部件的(直接)子元素时,这才有效。这显然不是我的情况( 请注意,我只知道该元素的id,而不是创建它。简单地说:我需要问题所说的内容 至于“更高级别上的DO

是否可以用我的小部件组件替换已知的html元素?(强调“替换”一词,我不想将小部件放入该元素中。:)

…但生成的DOM元素是“聋子”,即它们没有收到单击事件。(要实现这一点,我可能必须调用RootPanel.get().adopt(小部件),但该方法不可访问。)

有那么一秒钟,我认为这可能是答案,但只有当您的“占位符”元素是HTMLPanel小部件的(直接)子元素时,这才有效。这显然不是我的情况(

请注意,我只知道该元素的id,而不是创建它。简单地说:我需要问题所说的内容


至于“更高级别上的DOM操纵”:如果允许我放置小部件而不是占位符元素,我会很高兴地在最高级别上操纵DOM。

我建议您尝试这样的操作

tmpEl.getParentElement().replaceChild(myPanel.getElement(), tmpEl);
<body>
  <a id="tmpEl" />
</body>
创建小部件后,可以使用tb.getElement()获取它的DOM对象(我不确定这是正确的方法名,但它肯定类似于getElement)

之后你可以使用

Element parent = Document.getElementById('tmpEl').getParent();
parent.removeChild(Document.getElementById('tmpEl'));
parent.appendChild(tb.getElement());
add()所做的另一件事是在要添加到面板的小部件上调用Widget.onAttach()。onAttach执行一些工作来注册小部件以接收事件

您可以尝试调用TB。on附件();也可能需要调用RooPosik.DeXiNoWiWORKORT(TB);(如前一篇文章中提到的)

我同意——您应该在“更高级别”上考虑DOM操作。例如,您需要的功能是通过接口实现的,它实现了:

FlowPanel mainPanel = new FlowPanel();
Hyperlink link = new Hyperlink("Something cool");
mainPanel.add(link);
mainPanel.add(new Label("Bla bla"));

// Now we want to replace the first element of the FlowPanel with a TextBox
// We can do that by its index...
mainPanel.remove(0);

// ...or Widget instance
mainPanel.remove(link);

// Now we add a TextBox at the beginning
mainPanel.add(new TextBox(), 0);
正如您所看到的,这段代码更具可读性(至少对我而言),您不需要直接操作DOM(通过ID等进行引用)。当然,有些地方直接操作DOM是有益的(最值得注意的是优化),但在大多数情况下,我会避免处理元素、ID等:)(至少在GWT中)

似乎在将小部件插入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();
安德烈的功劳


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

这个解决方案可能与Igor建议的没有太大区别。我会这样写:

RootPanel rootPanel = RootPanel.get();
Element anchorElement = DOM.getElementById("tmpEl");
Anchor anchor = Anchor.wrap(anchorElement);

rootPanel.remove(anchor);
rootPanel.insert(new HTML("<div class='gwt-panel'>...</div>", 0); 
RootPanel RootPanel=RootPanel.get();
元素anchoreElement=DOM.getElementById(“tmpEl”);
锚固=锚固包裹(锚固构件);
根面板。移除(锚);
插入(新的HTML(“…”,0);

我正在做类似的事情。我正在阅读
的内容;使用
中的元素构建动画菜单,然后替换原始内容。动画菜单是一个小部件

它似乎起作用了

// DisclosurePanel is a widget
DisclosurePanel accordion_panel = processAccordion(accordionElement);
// accordionElement is found in the DOM (it's a com.google.gwt.user.client.Element)
// clear what was there
accordionElement.setInnerText("");
// add the widget in
RootPanel.get(accordionElement.getId()).add(accordion_panel);

这基本上是我在原始问题中提到的解决方案,但它不起作用。只是使用removeChild+appendChild代替了replaceChild。另外,使用appendChild,您将元素放在其父元素的最末端,这不一定是占位符所在的位置。我必须说,我感觉您正在做一些事情g这里错了-它看起来不像gwt样式,至少对我来说不是。你将小部件附加到父小部件上了吗?这样小部件就不会自动附加。至于“非gwt样式”:gwt让我按id删除元素,gwt让我按id附加到元素中。因此,我真的想不出为什么我不被允许put我的小部件取代了我将要删除的元素。我看不到区别。至于附加小部件:当它的父项是根面板时,我如何附加小部件?(我是GWT的新手,如果这是显而易见的,请原谅。)我不需要创建链接,谢谢。我需要替换现有的链接。请阅读问题。我只是介绍了一个用例-您想要操作DOM的方式在“普通”中很常见JS框架,但GWT试图在底层DOM树和您想要添加的内容之间创建一个层。因此,在markovuksanovic的评论之后,我展示了如何通过“GWT方式”完成您在问题中描述的内容当然,在使用现有应用程序或尝试将GWT小部件/应用程序与现有网站集成时,直接操作DOM通常是必要的。这里就是这样:我正在为不了解GWT的网站编写小部件。我在网站所有者希望创建小部件的地方放置了文本。呈现时使用我需要的URL读取更多内容的小部件(“href”属性开始发挥作用),如果出现问题,锚元素将作为服务内容的另一种方式-良好的旧可点击链接。将小部件放置在锚元素中是不允许的,有几个明显的原因。感谢澄清-您应该将该信息放在问题中-I(可能还有markovuksanovic)我认为您只是不熟悉GWT,并试图以“错误”的方式使用该框架:)我认为这是根本不同的,因为这可能会起作用。用widget包装现有元素是GWT集团的AndréM从他的解决方案中获得灵感的地方。作品:)是的,这是同样的事情(正如在小组帖子中提到的),干杯!这是因为您没有替换元素,而是将小部件插入其中。
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();
RootPanel rootPanel = RootPanel.get();
Element anchorElement = DOM.getElementById("tmpEl");
Anchor anchor = Anchor.wrap(anchorElement);

rootPanel.remove(anchor);
rootPanel.insert(new HTML("<div class='gwt-panel'>...</div>", 0); 
// DisclosurePanel is a widget
DisclosurePanel accordion_panel = processAccordion(accordionElement);
// accordionElement is found in the DOM (it's a com.google.gwt.user.client.Element)
// clear what was there
accordionElement.setInnerText("");
// add the widget in
RootPanel.get(accordionElement.getId()).add(accordion_panel);