为什么Wicket会改变HTML元素的ID?

10
如果我写下

<form wicket:id="form" id="form>
甚至更多
<form wicket:id="form>...

每当页面刷新时,渲染的HTML都会显示附加有不同数字的'id'形如 'form'。

   <form id="form7"....
有没有一种方法可以禁用 Wicket 框架的这种行为?
5个回答

21

我们在项目中大量手动设置标记ID,以便于使用Selenium测试框架进行自动化测试。这确实有效。

Component.setOutputMarkupId(true); // write id attribute of element to html
Component.setMarkupId("someid"); // id attribute of element is "someid"

7
这是在使用wicket时大多数情况下需要的行为。动态id旨在防止组件添加Ajax行为或添加到用于刷新的ajax响应时发生id冲突。对于任何这些情况,您确实需要客户端响应和服务器端状态相互合作。如果有外部js资源需要组件的id进行dom查找,则建议添加自定义wicket组件行为,然后生成js调用函数并传递生成的id。
我知道我要描述的内容会让您更深入地了解Wicket。但我已经非常满意Wicket提供的ajaxy功能。

在Wicket中,将JavaScript代码写在Java文件中是一种常规做法吗? - Monis Iqbal
像其他一切一样,这取决于具体情况。有些例子是JS库(例如wicket-ajax.js),还有从Java中生成的JS。Wicket源代码应该包含两者的示例。最终,任何标准的ajax行为在某个时候都会包括一个标准的头文件贡献者,以包括wicket-ajax.js文件。查看一些ajax组件以查看生成的JS,许多组件将具有获取生成的js方法或类似的内容,以附加到其添加的组件上。 - Matt
@Monis:我更喜欢在Java代码中放置最少量的JS,通常只是调用单独的.js文件中的函数。一个例子 - Jonik

4
这是Wicket的设计特色。您可以使用类来链接样式和组件。
<form wicket:id="form" id="form>

另外,你可以尝试(我从未尝试过)setMarkupId。我不确定它是否是一个好的方法。


1
setMarkupId 是实现该功能的方法,请参见下面的答案。 - Michal Bernhard
哦,抱歉。我误读为setOutputMarkupId(true)了。对不起@leonidv。感谢@Michal。 - Monis Iqbal

0

我已经有一段时间没有用 Wicket 了,但我记得当 wicket 使用 ajax 元素时,它的 ids 是自动生成的(标记的 id,而不是 wicket:id)。如果不使用 ajax 元素,则可以控制标记的 id。在你的情况下,由于没有代码,我猜想你将不得不更改表单中的任何 AjaxButtonAjax*


我面临的问题与这些变化的ID有关,主要是客户端的东西,例如我的CSS无法使用这些ID来映射样式,我也无法编写可以操作元素ID的JavaScript代码。 - Monis Iqbal
1
@Monis Iqbal 你应该直接使用Wicket的Ajax hooks等功能。 - Esko
这是指我不能编写自定义JavaScript吗?这不违反了Wicket支持的SOC原则吗?因为JavaScript应该是客户端的。 - Monis Iqbal
@MonisIqbal 你可以使用 target.appendJavaScript(..) 等其他工具。 - Hendy Irawan

0

是的,您可以编写自定义JavaScript代码...只需按照“Wicket方式”实现即可。您可以使用自定义JavaScript装饰组件、Ajax调用等,然后它们都可以很好地协同工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接