问题:有时你会想从javascript访问一个组件 getElementById
,但是 id 是在 JSF 中动态生成的,所以你需要一种获取对象 ID 的方法。 我在下面回答如何做到这一点。
原始问题:我想使用如下所示的代码。 如何在我的 Javascript 中引用 inputText JSF 组件?
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<head>
<title>Input Name Page</title>
<script type="javascript" >
function myFunc() {
// how can I get the contents of the inputText component below
alert("Your email address is: " + document.getElementById("emailAddress").value);
}
</script>
</head>
<h:body>
<f:view>
<h:form>
Please enter your email address:<br/>
<h:inputText id="emailAddresses" value="#{emailAddresses.emailAddressesStr}"/>
<h:commandButton onclick="myFunc()" action="results" value="Next"/>
</h:form>
</f:view>
</h:body>
</html>
更新:这篇文章 JSF2.0 中的客户端标识符讨论了使用如下技术:
<script type="javascript" >
function myFunc() {
alert("Your email address is: " + document.getElementById("#{myInptTxtId.clientId}").value);
}
</script>
<h:inputText id="myInptTxtId" value="backingBean.emailAddress"/>
<h:commandButton onclick="myFunc()" action="results" value="Next"/>
建议属性id
inputText
组件上创建一个可以使用 EL 访问的对象 #{myInptTxtId}
,在上面的例子中。 文章接着指出,JSF 2.0 增加了UIComponent
类的零参数getClientId()
方法。从而允许建议的#{myInptTxtId.clientId}
结构以上获取组件的实际生成 ID。
虽然在我的测试中这不起作用。 其他人可以确认/否认吗?下面建议的答案存在上述缺点技术没有。 所以很高兴知道上述技术是否实际有效。
您需要完全使用 JSF 在生成的 HTML 输出中分配的 ID。右键单击 Web 浏览器中的页面,然后选择"查看源"。这正是JS看到的HTML代码(你知道,JS在Web浏览器中运行并在HTML DOM树上拦截)。
给定一个
<h:form>
<h:inputText id="emailAddresses" ... />
它看起来像这样:
<form id="j_id0">
<input type="text" id="j_id0:emailAddress" ... />
其中j_id0
是生成的 HTML <form>
元素的生成 ID。
您宁愿为所有 JSF NamingContainer
组件指定一个固定的id
,以便 JSF 不会自动生成它们。<h:form>
就是其中之一。
<h:form id="formId">
<h:inputText id="emailAddresses" value="#{emailAddresses.emailAddressesStr}"/>
这样,表单就不会像j_id0
那样获得自动生成的 ID,输入字段将获得固定 ID formId:emailAddress
。然后,您可以在 JS 中这样引用它。
var input = document.getElementById('formId:emailAddress');
从那时起,您可以像往常一样继续使用 JS 代码。 例如,通过input.value
获取价值。
另请参阅:
- 如何使用jQuery选择JSF组件?
根据您的更新进行更新:您误解了博客文章。特殊#{component}
引用是指计算 EL 表达式的当前组件,并且仅在组件本身的任何属性中起作用。无论您想要什么,也可以通过以下方式实现:
var input = document.getElementById('#{emailAddress.clientId}');
with (注意视图的binding
,你绝对不应该把它绑定到一个 bean)
<h:inputText binding="#{emailAddress}" />
但这太丑了。最好使用以下方法,其中将生成的HTML DOM元素作为JavaScript传递this
对函数的引用
<h:inputText onclick="show(this)" />
跟
function show(input) {
alert(input.value);
}
如果你使用的是jQuery,你甚至可以更进一步,使用样式类作为标记接口来抽象它们。
<h:inputText styleClass="someMarkerClass" />
跟
$(document).on("click", ".someMarkerClass", function() {
var $input = $(this);
alert($input.val());
});
答:这是我最满意的技巧。 不需要做太多奇怪的事情来弄清楚组件的 id。 请记住,这样做的重点在于您可以从页面上的任何位置了解组件的id
,而不仅仅是从实际组件本身。 这是关键。 我按下一个按钮,启动javascript函数,它应该能够访问任何其他组件,而不仅仅是启动它的组件。
此解决方案不需要任何"右键单击"并查看 id 是什么。 这种类型的解决方案很脆弱,因为 id 是动态生成的,如果我更改页面,我每次都必须经历这些废话。
-
将组件绑定到后备 Bean。
-
在所需的任何位置引用绑定组件。
因此,这里有一个如何做到这一点的示例。
假设:我有一个 *.xhtml 页面(可能是 *.jsp),并且我定义了一个支持豆。 我也在使用 JSF 2.0。
*.xhtml页
<script>
function myFunc() {
var inputText = document.getElementById("#{backBean.emailAddyInputText.clientId}")
alert("The email address is: " + inputText.value );
}
</script>
<h:inputText binding="#{backBean.emailAddyInputText}"/>
<h:commandButton onclick="myFunc()" action="results" value="Next"/>
背豆.java
UIInput emailAddyInputText;
确保也为此属性创建您的吸气器/设置器。
Id 是动态生成的,因此您应该为所有父元素定义名称以避免类似j_id123的 id。
请注意,如果你使用 jQuery 来选择元素 - 你应该在冒号前使用双斜杠:
jQuery("my-form-id\:my-text-input-block\:my-input-id")
而不是:
jQuery("my-form-id:my-text-input-block:my-input-id")
在 Richfaces 的情况下,您可以在 jsf 页面上使用 el 表达式:
#{rich:element('native-jsf-input-id')}
要选择 JavaScript 元素,例如:
#{rich:element('native-jsf-input-id')}.value = "Enter something here";
您可以在生成 HTML 源代码时查看 HTML 源代码,并查看 id 的设置,因此您可以在 JavaScript 中使用它。 由于它是在表单中,因此它可能在表单 ID
这不是JSF的方式,但是如果你想避免ID痛苦,你可以为选择器设置一个特殊的CSS类。只要确保使用一个好的名字,这样当有人读到类名时,很明显它是为此目的而使用的。
<h:inputText id="emailAddresses" class="emailAddressesForSelector"...
在你的 JavaScript 中:
jQuery('.emailAddressesForSelector');
当然,您仍然需要手动管理类名的唯一性。我确实认为这是可以维护的,只要您不在可重用组件中使用它。在这种情况下,您可以使用约定生成类名。
<h:form id="myform">
<h:inputText id="name" value="#{beanClass.name}"
a:placeholder="Enter Client Title"> </h:inputText>
</h:form>
这是 jsf 的一个小例子。现在我将编写 javascript 代码来获取上述 jsf 组件的值:
var x = document.getElementById('myform:name').value; //here x will be of string type
var y= parseInt(x,10); //here we converted x into Integer type and can do the
//arithmetic operations as well