• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Управление Видимостью

  • Автор темы rrr
  • Дата начала
R

rrr

Коллеги, подскажите, pls, в чем может быть дело. Пробую показывать/прятать элемент liMembers (типа listbox) в зависимости от содержимого элемента cbType (типа combobox). Если содержимое "Договор", то показывать. если нет, то прятать.

Пробую на стороне клиента

var idType = '#{java script:getClientId("cbType")}';
var idMembers = '#{java script:getClientId("lbMembers")}';

Код:
var ourValue = document.getElementById(idType).value;
var visibility;
if (ourValue == 'Договор')
visibility = 'visible';
else
visibility = 'hidden';
document.getElementById(idMembers).style.visibility=visibility;

и на стороне сервера

Код:
var combo:javax.faces.component.UIComponent = getComponent("cbType");
var comboVal = combo.getValue();
var lbMembers:javax.faces.component.UIComponent = getComponent("lblMembers");
if (comboVal == "Договор")
lbMembers.setRendered(true);
else
lbMembers.setRendered(false);


В обоих случаях получаю сообщение браузера "Непредвиденная ошибка среды выполнения":
Источник ошибки
Имя страницы:/Document.xsp
Исключительная ситуация
► Трассировка стека

Что может быть не так?

UPD: поместил оба элемента на одну панель, переключил обновление на частичное, только панели - перестало ругаться, но и работать не начало. Что еще может быть?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
в трассировке, кот. отсут. и написано - что не так
 
R

rrr

Поместил элементы на панель и переключил форму на обновление только панели. Сообщение об ошибке пропало, но lbMembers все время виден. Может, еще что подскажете?
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Как-то сложно все пишите/выдумываете.

Server JS
<!--shcode--><pre><code class='java'>getComponent("elementName").getValue();
getComponent("elementName").setValue("something");[/CODE]
Note: you cannot access or set fields with visible=false. If you want to work with a field, but don't want to display it, give the field a CSS class with "display:none".
Get submitted value before validation
<!--shcode--><pre><code class='java'>getComponent("elementName").getSubmittedValue()[/CODE]
Client JS
<!--shcode--><pre><code class='java'>document.getElementById("#{id:elementID}").value;[/CODE]
Get a computed field's value:
<!--shcode--><pre><code class='java'>document.getElementById("#{id:elementID}").innerHTML;[/CODE]
Код скрытия надо писать сразу в свойстве Visible компонента. Например так
Код:
var tmp = getComponent("inputText8").value
tmp == "Абонентский"
и обновлять его при помощи Partial refresh или Submit
 
A

alexas

Код скрытия надо писать сразу в свойстве Visible компонента. Например так
var tmp = getComponent("inputText8").value
tmp == "Абонентский"
и обновлять его при помощи Partial refresh или Submit
И получить ошибку, если "inputText8" скрыт :)
Для SSJS, в коде скрытия (Visible компонента) удобно проверять Scope variable. Работает при полном и частичном обновлении.
Для CSJS, Visible компонента - Static и управлять видимостью:
document.getElementById("#{id:xxx}").style.display = "inline"
document.getElementById("#{id:xxx}").style.display = "none"
но это только при Partial Refresh компонента.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
И получить ошибку, если "inputText8" скрыт ^_^
Для SSJS, в коде скрытия (Visible компонента) удобно проверять Scope variable. Работает при полном и частичном обновлении.
Для CSJS, Visible компонента - Static и управлять видимостью:
document.getElementById("#{id:xxx}").style.display = "inline"
document.getElementById("#{id:xxx}").style.display = "none"
но это только при Partial Refresh компонента.
Очень интересно. Видимое поле ссылается на невидимое... это как?
Всегда должен быть видимый набор полей, от которого "пляшут" дальше.

alexas, явно не читал что написано:
Note: you cannot access or set fields with visible=false. If you want to work with a field, but don't want to display it, give the field a CSS class with "display:none".

И собственно Visible это не просто скрытие компонента, это так сказать "физическое удаление" его со станицы. Т.е. компонент не подгружает данные. Выгода от этого очевидная.
Одно дело спрятать просто текстовое поле - другое дело спрятать вид или ричтекст.
Так что я не был бы на столько уверенным, что твое решение лучше. И уж тем более так настоятельно не рекомендовал бы его.

Мой пример ссылается на видимое поле. И я написал что это пример.

А вообще, если правильно все делать - ошибки не будет. Должна быть правильно построена логика скрытия.
1. можно обновлять панель/таблицу/ячейку и т.д., в которой находится компонент
2. можно обновлять всю страницу
3. можно вычислять какой компонент нужно обновить

Но чтоб не заморачиваться - лучше обновлять группу компонентов (панели, таблицы и т.д.), а не городить огороды из SSJS, CSJS и CSS. Сам потом с ума сойдешь, когда забудешь что и для чего писал
Или считаешь что большое количество кода показывает крутизну программиста?
 
A

alexas

NickProstoNick конечно, если логика скрытия нескольких элементов одинакова, надо управлять всей группой. Я и не утверждал обратного.
alexas, явно не читал что написано:
Note: you cannot access or set fields with visible=false. If you want to work with a field, but don't want to display it, give the field a CSS class with "display:none".
Вкурсе. А вот рабочий пример CSJS на скорую руку (примерно, о чем спрашивал rrr)
Код:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:panel id="pane">
<xp:listBox id="liMembers">
<xp:selectItem itemLabel="Untitled"></xp:selectItem>
<xp:selectItem itemLabel="Untitled"></xp:selectItem>
</xp:listBox>
<xp:label id="label1"></xp:label></xp:panel>
<xp:br></xp:br>
<xp:comboBox id="cbTipe">
<xp:selectItem itemLabel="Договор" itemValue="Договор"></xp:selectItem>
<xp:selectItem itemLabel="Недоговор" itemValue="Недоговор"></xp:selectItem>
<xp:eventHandler event="onchange" submit="true"
refreshMode="partial" refreshId="pane">
<xp:this.onComplete><![CDATA[var check = document.getElementById("#{id:cbTipe}").value;
if(check == "Договор"){
document.getElementById("#{id:pane}").style.display = "inline";
}
else {
document.getElementById("#{id:pane}").style.display = "none";
};]]></xp:this.onComplete>
<xp:this.script>
<xp:executeClientScript>
<xp:this.script><![CDATA[if(document.getElementById("#{id:cbTipe}").value == "Документ"){
document.getElementById("#{id:pane}").style.display = "inline";
}
else {
document.getElementById("#{id:pane}").style.display = "none";
} ]]></xp:this.script>
</xp:executeClientScript>
</xp:this.script>
</xp:eventHandler>
</xp:comboBox></xp:view>

А по поводу
var tmp = getComponent("inputText8").value
tmp == "Абонентский"

я имел ввиду, что товарищ применит этот код для скрытия "влоб" и получит ошибку (судя по вопросу - изучение хепагов в самом начале, а логика программирования в них сильно отличается от классических нотусов)
 
R

rrr

Применил. Ошибки нет. Что я делаю не так? ^_^
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!