XPages — Как установить фокус в разное время на странице после обновления

#xpages

#xpages

Вопрос:

Я пробовал так много разных вещей. У меня есть xpages, который обновляется несколько раз, и, основываясь на последовательности вводимых данных на этом пути, я хочу сосредоточиться на разных полях. Последняя версия использует сценарий вывода и следующий код, однако, похоже, он не распознает переменную viewScope, поэтому он фокусируется на первом поле на странице или вообще не фокусируется. Я устанавливаю переменную viewScope в разное время в процессе прогрессии.

Мои вопросы:

  1. Куда мне поместить сценарий вывода, поскольку в начале прогрессии отображается только часть страницы.

  2. Какой код я могу использовать, чтобы быть эффективным и распознавать различные места для фокусировки?

  3. Есть ли лучший способ, чем сценарий вывода?

Вот код, который я использую…

 var vNextFocus = viewScope.vsNextFocus;
if(vNextFocus == "CustomerName") {
    XSP.getElementById("#{id:CustomerName}").focus();
}
if(vNextFocus == "PONbr") {
    XSP.getElementById("#{id:PONbr}").focus();
}
  

И т.д……

Ответ №1:

Ваш код представляет собой смесь SSJS и CSJS.

Добавьте onClientLoad событие на свою XPage.
Вычислите идентификатор клиента, на котором следует сфокусироваться с помощью
#{javascript: ...get client id on server side...} на стороне сервера.
Поместите результат в виде строки в код XSP.getElementById("...").focus() CSJS .
Таким образом, поле, заданное в viewScope.vsNextFocus, получает фокус.

 <?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:eventHandler
        event="onClientLoad"
        submit="false">
        <xp:this.script><![CDATA[
            XSP.getElementById("#{javascript:
                try {
                    getComponent(viewScope.vsNextFocus).getClientId(facesContext);
                } catch(e) {
                    getComponent('inputText1').getClientId(facesContext);
                }
            }").focus();
        ]]></xp:this.script>
    </xp:eventHandler>
    ... your controls ...
</xp:view>
  

На всякий случай, если viewScope.vsNextFocus не установлен, по умолчанию в коде используется поле «inputText1».

Комментарии:

1. Частичные обновления не работают на моей xpage, поэтому я использую все полные обновления, и для первых двух мне нужно полное, потому что области страницы становятся видимыми по мере ее продвижения. Я не знаю, почему частичные обновления не работают. Будет ли код, который я опубликовал, работать в коде CSJS?

2. ОК. Я полностью обновил свой ответ. Надеюсь, теперь это работает для вас.

3. Кнут, я не могу тебя отблагодарить. Я перепробовал так много вещей, вероятно, потратил более 5 дней, просто пытаясь сосредоточиться на поле и менять этот фокус в разное время. Не могли бы вы взглянуть на мое приложение и внести предложения для меня? Частичные обновления быстро отображают окно с ошибкой, а затем исчезают. Я писал об этой ошибке в прошлом. Кроме того, опубликованный вами код показывает предупреждение о том, что двойная кавычка не была закрыта должным образом?

4. Майк, предупреждение находится только в окне редактора клиентских сценариев, потому что оно не все в одной строке. Вы можете игнорировать это, поскольку компиляция XPage прошла успешно, или вы можете поместить все в одну строку.

5. Майк, да, конечно, я бы посмотрел на ваше приложение, просто свяжитесь со мной.