在迭代器中为inputText设置id

时间:2012-02-23 15:22:47

标签: javascript jsf myfaces trinidad

我的目标是将焦点设置为特定的inputText。

由于似乎无法使用tr:inputText属性自动执行此操作,因此我尝试使用Javascript。

对于document.getElementById我需要渲染的html <input>的ID。我尝试将此id设置为正确的索引。但是,它使用id varFieldIterator:0:varField进行渲染,其中数字0来​​自迭代器,并且根据我的起始值selectionStart而不同。如果我从selectionStart = 10开始,则文本框10的第一个索引为0.如果我从15开始然后有一个PPR来显示前15个文本框,则它们将从16开始获取id。

我认为代码会明确我尝试实现的目标:

<tr:iterator
    id="varFieldIterator"
    value="#{myController.form.model.fieldList}"
    var="field"
    rows="15"
    first="#{{myController.form.model.selectionStart}"
    varStatus="status">
  <tr:inputText
      id="varField#{status.index}"
      value="#{field.value}"
      label="Text #{status.index +1}">
</tr:iterator>

<tr:inputHidden
    id="FOCUS_TEXT"
    value="#{myController.form.model.endFocus}"></tr:inputHidden>
<trh:script>
window.onload = function() { document.getElementById('varField' + document.getElementById('FOCUS_TEXT').value).focus(); } 
</trh:script>

1 个答案:

答案 0 :(得分:1)

虽然ID属性接受EL表达式,但它仅在视图构建期间设置,而不是在视图渲染时间期间设置。因此,如果您使用的是视图构建时标记,例如JSTL <c:forEach>,那么它就可以工作了。但是这个标签可能有undesireable side effects

我建议您只更改JavaScript函数,使其不再依赖于ID。目前还不清楚你的整个HTML dom结构是什么,以及你是否正在使用jQuery,这将简化HTML DOM遍历。

使用普通的JS,你可以举例如grab the first form然后获取它的第一个输入元素:

document.forms[0].elements[0].focus();

或者你可以grab input elements by tag name

document.getElementsByTagName("input")[0].focus();

或者你可以给他们所有类名<tr:inputText styleClass="specificInput">grab them by class name

document.getElementsByClassName("specificInput")[0].focus();

这些电话是可以连结的。所以,如果你知道它在<h:form id="myForm">内,那么你也可以这样做:

document.getElementById("myForm").getElementsByTagName("input")[0].focus();