gpt4 book ai didi

javascript - 我如何知道 JSF 组件的 ID,以便我可以在 Javascript 中使用

转载 作者:IT王子 更新时间:2023-10-29 03:07:47 25 4
gpt4 key购买 nike

问题:有时您会想要从 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>

更新:这篇文章Client Identifiers in 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"/>

建议inputText组件上的属性id使用 #{myInptTxtId} 创建一个可以通过 EL 访问的对象,在上面的例子中。文章继续指出 JSF 2.0 添加了UIComponent 类的零参数 getClientId() 方法。从而允许 #{myInptTxtId.clientId} 构造建议获取组件实际生成的 id。

虽然在我的测试中这不起作用。任何人都可以确认/否认。下面建议的答案有上面的缺点技术没有。所以最好知道上述技术是否确实有效。

最佳答案

您需要准确使用 JSF 在生成的 HTML 输出中分配的 ID。在您的网络浏览器中右键单击该页面并选择查看源代码。这正是 JS 看到的 HTML 代码(你知道,JS 在 webbrowser 中运行并在 HTML DOM 树上拦截)。<​​/p>

给定一个

<h:form>
<h:inputText id="emailAddresses" ... />

它看起来像这样:

<form id="j_id0">
<input type="text" id="j_id0:emailAddress" ... />

在哪里j_id0是生成的 HTML 的生成 ID <form>元素。

你宁愿给所有的 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 获取值(value).

另见:


更新 根据您的更新:您误解了博客文章。特别#{component}引用指的是评估 EL 表达式的当前组件,这仅适用于组件本身的任何属性。无论你想要什么,也可以通过以下方式实现:

var input = document.getElementById('#{emailAddress.clientId}');

with(注意 binding 到 View ,你应该 absolutely not 将它绑定(bind)到一个 bean)

<h:inputText binding="#{emailAddress}" />

但这很丑陋。最好使用以下方法,其中将生成的 HTML DOM 元素作为 JavaScript this 传递函数引用

<h:inputText onclick="show(this)" />

function show(input) {
alert(input.value);
}

如果您使用的是 jQuery,您甚至可以更进一步,使用样式类作为标记接口(interface)来抽象它们

<h:inputText styleClass="someMarkerClass" />

$(document).on("click", ".someMarkerClass", function() {
var $input = $(this);
alert($input.val());
});

关于javascript - 我如何知道 JSF 组件的 ID,以便我可以在 Javascript 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6045307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com