我使用的是<p:dataTable>
,我使用了html <table>
。我想在<p:inputText>
更改事件中禁用/只读PrimeFaces <h:selectOneMenu>
。
我使用的是JavaScript,但它没有使用它。
<script type="text/javascript">
function change(val)
{
//alert(val);
if(val=="Check")
{
document.getElementById('bankName').readonly=false;
document.getElementById('receiptNo').readonly=true;
}
if(val=="Cash")
{
forms.elements["mainForm:chkNo"].readonly=true;
document.getElementById('chkNo').readonly=true;
document.getElementById('bankName').readonly=true;
document.getElementById('receiptNo').readonly=false;
}
}
</script>
JSF代码
<h:column>
<p:dataTable id="paymentHistoryDataTable" var="due"
>
<p:column>
.......
<table id="paymentProcess">
<tr>
<td style="width: 80px;">
<h:selectOneMenu value="#{adminActionController.tempBean.selectType}" id="type" onchange="change(this.value);">
<f:selectItem itemLabel="Check" itemValue="Check"/>
<f:selectItem itemLabel="Cash" itemValue="Cash"/>
</h:selectOneMenu>
</td>
</tr>
<tr id="check">
<td></td>
<td></td>
<td style="width: 90px;" id="lblChk">
<label> <h:outputText value="Check/DD Number:" /> </label>
</td>
<td style="width: 90px;">
<h:inputText id="chkNo" value="#{adminActionController.tempBean.checkNumber}" immediate="true"
required="false" validatorMessage="insert Check/DD number">
</h:inputText>
</td>
................ 我想在js中访问id =“chkNo”以禁用它..
答案 0 :(得分:6)
你在这里犯了几个概念错误。
您的具体问题是由于您正在编写基于JSF源代码的JavaScript代码。这不完全正确。 JSF在Web服务器上运行并生成HTML。 JavaScript在webbrowser上运行,只看到HTML,而不是JSF。在webbrowser中右键单击页面,选择查看源并仔细查看。不存在标识为bankName
或receiptNo
的任何HTML元素。相反,它是formId:tableId:0:bankName
,formId:tableId:1:bankName
,formId:tableId:2:bankName
等。原则上,您应该使用JavaScript中的那些HTML元素ID来从HTML DOM中选择元素。
但这很笨拙。
而是使用JSF提供的标签/设施来实现所需的功能要求。您可以在readonly
中使用JSF表达式语言,例如readonly="#{dropdown.value == 'Cash'}"
。您可以使用<f:ajax>
执行JSF ajax请求来更新模型和视图。
以下启动示例应该为您提供一个良好的起点:
<h:selectOneMenu id="type" value="#{adminActionController.tempBean.selectType}">
<f:selectItem itemValue="Check"/>
<f:selectItem itemValue="Cash"/>
<f:ajax render="chkNo bankName receiptNo" />
</h:selectOneMenu>
<p:inputText id="chkNo" readonly="#{adminActionController.tempBean.selectType == 'Cash'}" />
<p:inputText id="bankName" readonly="#{adminActionController.tempBean.selectType == 'Cash'}" />
<p:inputText id="receiptNo" readonly="#{adminActionController.tempBean.selectType == 'Check'}" />
当下拉列表发生更改时,<f:ajax>
将使用(相对)客户端ID chkNo
,bankName
和receiptNo
更新组件。此更新将强制重新评估readonly
属性。
无关,您使用<p:dataTable><table>
的方式,其中您没有将行绑定到var="due"
是非常奇怪的,但这是一个可能的主题未来的问题/问题。上面的代码示例假设正确的上下文。