#xpages
#xpages
Вопрос:
Я пробовал так много разных вещей. У меня есть xpages, который обновляется несколько раз, и, основываясь на последовательности вводимых данных на этом пути, я хочу сосредоточиться на разных полях. Последняя версия использует сценарий вывода и следующий код, однако, похоже, он не распознает переменную viewScope, поэтому он фокусируется на первом поле на странице или вообще не фокусируется. Я устанавливаю переменную viewScope в разное время в процессе прогрессии.
Мои вопросы:
-
Куда мне поместить сценарий вывода, поскольку в начале прогрессии отображается только часть страницы.
-
Какой код я могу использовать, чтобы быть эффективным и распознавать различные места для фокусировки?
-
Есть ли лучший способ, чем сценарий вывода?
Вот код, который я использую…
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. Майк, да, конечно, я бы посмотрел на ваше приложение, просто свяжитесь со мной.