我的目标是将焦点设置为特定的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>
答案 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();