我怎样才能知道JSF组件的id,以便我可以在Javascript中使用



问题:有时你会想从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 是动态生成的,如果我更改页面,我每次都必须经历这些废话。

  1. 将组件绑定到后备 Bean。

  2. 在所需的任何位置引用绑定组件。

因此,这里有一个如何做到这一点的示例。

假设:我有一个 *.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

相关内容

  • 没有找到相关文章

最新更新