我在GWT项目中有一个自定义小部件(OrderItem
)。此小部件有TextBox
。我将它的id设置为“Navid”。但是如果我在面板中创建OrderItem
的多个实例呢?然后将重复id。这会使html无效。
如何为TextBox分配唯一ID?
答案 0 :(得分:6)
通常,GWT小部件会生成自己的ID,这些ID会自动唯一,您通常不会担心ID是什么。当您说您正在设置TextBox的ID时,我假设您正在调用类似myTextBox.getElement().setId("Navid")
的内容。
根据您的使用情况,我可以考虑两种简单的方法。 HTMLPanel类上有一个静态createUniqueId()方法,您可以单独使用它,也可以轻松创建唯一ID。像myTextBox.getElemement().setId("Navid-" + HTMLPanel.createUniqueId())
一样。唯一的问题是生成的ID不是确定性的。
另一种常见方法是根据父窗口小部件的ID生成ID。 myTextBox.getElement().setId("Navid-" + myTextBox.getParent().getElement().getId())
。
但是,我将在这里猜测并假设你想要为这个小部件分配你自己的自定义ID的原因是你可以从你的GWT代码之外,从Javascript,例如,来自JQuery。在这种情况下,我建议您不要为它分配一个ID,它必须是唯一有用的,而是指定一个html类名称给widget的元素。然后,您将针对您的OrderItem的id或类的id或类来解决窗口小部件的元素。您可以在示例myTextBox.getElement().addStyleName("navid")
因此,假设您将orderItemWidget的html类分配给OrderItem小部件的根HTML元素,并将一个html类navid分配给TextBox,您可以使用选择器{{1}从JQuery引用文本框。 }
答案 1 :(得分:2)
这就是为什么GWT不会让在窗口小部件上设置ID变得容易。对于样式,它使得使用CSS类名更容易。实际上,开始使用ID的原因很少,而动态生成的东西(如小部件)几乎没有。
现在,为了回答您的问题,浏览器容忍多个元素共享相同ID的情况,并getElementById
is defined返回第一个元素(按文档顺序)