Установить идентификатор для inputText в итераторе - PullRequest
0 голосов
/ 23 февраля 2012

Моя цель - установить фокус на определенный inputText.

Поскольку, кажется, нет способа сделать это автоматически с помощью свойства tr: inputText, я пытаюсь использовать Javascript.

Для document.getElementById мне нужен идентификатор отображаемого HTML <input>.Я пытаюсь установить этот идентификатор на правильный индекс.Однако он отображается с идентификатором varFieldIterator:0:varField, где число 0 исходит от итератора и отличается в зависимости от моего начального значения selectionStart.Если я начну с selectionStart = 10, первый индекс для текстового поля 10 будет 0. Если я начну с 15, а затем у меня есть PPR, чтобы показать первые 15 текстовых полей, они получают идентификатор, начинающийся с 16.

Iдумаю, код даст понять, чего я пытаюсь достичь:

<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 Ответ

1 голос
/ 23 февраля 2012

Хотя атрибут ID принимает выражения EL, он устанавливается только во время построения представления, но не во время отображения представления.Так что, если бы вы использовали тег времени построения представления, такой как JSTL <c:forEach>, он бы работал.Но этот тег может иметь нежелательных побочных эффектов .

Я бы порекомендовал просто изменить функцию JavaScript, чтобы она больше не зависела от идентификаторов.Непонятно, какова вся ваша структура HTML dom, и если вы используете jQuery или нет, что упростит обход HTML DOM.

С простым JS вы можете, например, просто получить первую форму и затем получить первый элемент ввода:

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

Или вы можете захватить вводэлементы по имени тега :

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

Или вы можете дать им всем имя класса, например <tr:inputText styleClass="specificInput"> и , получить их по имени класса :

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

Эти звонки являются связными.Так что, если вы знаете, что он внутри <h:form id="myForm">, вы можете также сделать, например:

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