2011-08-12 29 views
2

我有以下代码。如何通过javascript访问自定义JSF标签getElementById

<h:form id="Form"> 
    <div class="pageBody"> 
    <h:outputLabel id="lbl" styleClass="formLabel" value="#{messages['lable.email']}:" /> 
    <s:button id="login" label="#{messages['login.button']}" actionBean="#{account}" actionMethod="login" /> 
    </div> 
</h:form> 

这里是JavaScript

var obj = document.getElementById("Form:lbl"); //This works 
var obj1 = document.getElementById("Form:login"); //This doesnt work 

记住<s:button>是一个自定义的JSF组件。

任何帮助表示赞赏

回答

2

它应该适用于自定义组件。它是一个自定义组件还是一个复合组件?您遇到的问题以及JSF 2.0标记的存在表明它实际上是 a componsite component。对于自定义标签,自定义组件和复合组件之间的区别,请查看When to use <ui:include>, tag files, composite components and/or custom components?

在这个答案中,我会假设它确实是一个复合组件。

首先,JavaScript适用于HTML DOM树,而不适用于JSF组件树。 JavaScript即在网页浏览器上运行,而不是在网络服务器上运行。 JSF在web服务器上运行,生成一堆HTML并将其发送到webbrowser。 document.getElementById()只接受HTML DOM元素ID。

因此,找出其中<s:button>已生成的HTML DOM元素的ID,你应该在你的网页浏览器打开JSF页面,做一个右击,然后查看源并找到HTML源代码生成的HTML元素。

在该消息又在实现使用例如<h:commandButton id="button"><s:button id="login">合成成分的情况下,那么它会看起来像这样的事情:

<input type="submit" id="Form:login:button" /> 

本身的复合成分,即一个NamingContainer组件,该组件预先设定这样的ID。 <h:form>也是这样一个组件。这使您可以在同一个父容器内使用多个复合组件。

您应该在您的JavaScript函数中正好使用 ID。

var button = document.getElementById("Form:login:button"); 
+0

谢谢我在镀铬检查。该按钮有它自己的xhtml。我只需要输入的编号并且可以运行 – user891935

+0

不客气。既然你是新来的,请不要忘记标记答案(大部分)帮助解决问题。另见http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235在未来的JSF问题中,请特别注意所用的术语,以便问题可以更好理解:) – BalusC