Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > как работает richfaces pick list?


Автор: Forza 30.6.2009, 19:20
В библиотеке RichFaces присутствует так называемый Pick List - управляющий блок, состоящий из двух списков и позволяющий перемещать элементы из левого списка в правый и обратно. См. его описание тут - http://livedemo.exadel.com/richfaces-demo/richfaces/pickList.jsf?c=pickList&tab=usage .
Несмотря на внешнюю простоту, внутри себя пик-лист содержит сложную структуру из вложенных слоёв и таблиц. Притом каких-либо явных обработчиков событий в HTML-коде нет.

Моя задача - с помощью Селениума выбрать элемент в левом списке, чтобы затем с помощью кнопки Copy скопировать его в правый.
Вручную всё работает тривиально: кликаешь на элементе в левом списке - кнопка Copy активируется, затем нажимаешь на неё, и элемент копируется в правый список.

Если же кликать селениумом (DefaultSelenium.click()), то элемент выделится только в том случае, если курсор мышки находится над тем фреймом, в котором находится тестируемая страница (в другом фрейме - данные от селениума) - в обратном случае click() не вызывает исключений (т.е. xpath валидный), но и элемент не выделится. Использование перед вызовом click() различных методов, позволяющих передать фокус на пик-лист (focus(), mouseOver(), mouseMove()), не помогло. Также не сработала попытка изменять вручную значения хидденов, которые поштучно имеются у каждого элемента списка, и которые изменяются при ручном клике на элементе.

Поэтому у меня есть несколько разных вопросов:
  •  Может, кто-либо сразу может сказать, как работает этот конкретный RichFaces Pick List? Т.е. какое именно событие срабатывает на каком именно элементе для выделения элемента списка?
  •  Посоветуйте какой-нибудь тул, который позволяет отследить работу JavaScript - т.е. чтобы после клика на элементе тул показал, какое событие сработало на каком элементе?
  •  Пик-лист создаётся как безымянный объект JavaScript следующим кодом. Могу ли я к нему как-нибудь обратиться джаваскриптом, чтобы напрямую вызвать тот метод, который должен выделять элемент по клику на нём? Если могу, то как адресовать этот безымянный объект?


Код

<script type="text/javascript">var clientId = 'j_id352';
new Richfaces.PickList(
    new Richfaces.PickList.Target('j_id352', 'j_id352tlInternal_tab', 'j_id352tlInternal_header_tab', 'j_id352tlFocusKeeper', 
undefined, Richfaces.PickList.Target.SelectItem, null, null),
    new Richfaces.PickList.Source('j_id352', 'j_id352internal_tab', 'j_id352internal_header_tab', 'j_id352focusKeeper', 
undefined, Richfaces.PickList.Source.SelectItem, null, null), 
    "j_id352", 
    [['copy', 'discopy'], ['copyAll', 'discopyAll'], ['remove', 'disremove'], ['removeAll','disremoveAll']],
    "false", 
    "true", 
    {onlistchanged: null,
     onlistchange: null,
     onfocus:null,
     onblur:null
    },
    "j_id352valueKeeper");</script>


В HTML сам пик-лист выглядит следующим образом.

Код

<table id="j_id352" class="rich-list-picklist" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<div class="rich-picklist-source-items">
<input id="j_id352focusKeeper" type="button" style="width: 1px; position: absolute; left: -32767px;"/>
<table id="j_id352table" class="rich-picklist-body" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="border: 0px none ; padding: 0px;">
<div id="j_id352headerBox" class="rich-picklist-list">
<div id="j_id352contentBox" class="rich-picklist-list-content" style="width: 140px; height: 140px;">
<table id="j_id352internal_tab" class="rich-picklist-internal-tab" cellspacing="0" cellpadding="0" style="width: 100%;">
<tbody id="j_id352tbody">
<tr id="j_id352:source::0" class="rich-picklist-source-row">
<td class="rich-picklist-source-cell">
<img style="width: 1px; height: 1px;" alt=" " src="/richfaces-demo/a4j/g/3_3_1.GAorg/richfaces/renderkit/html/images/spacer.gif.jsf"/>
Option 1
<input id="j_id352:source::0StateInput" type="hidden" value="1" name="j_id352:source::0"/>
</td>
</tr>
<tr id="j_id352:source::1" class="rich-picklist-source-row">
<td class="rich-picklist-source-cell">
<img style="width: 1px; height: 1px;" alt=" " src="/richfaces-demo/a4j/g/3_3_1.GAorg/richfaces/renderkit/html/images/spacer.gif.jsf"/>
Option 2
<input id="j_id352:source::1StateInput" type="hidden" value="2" name="j_id352:source::1"/>
</td>
</tr>
<tr id="j_id352:source::2" class="rich-picklist-source-row">
<td class="rich-picklist-source-cell">
<img style="width: 1px; height: 1px;" alt=" " src="/richfaces-demo/a4j/g/3_3_1.GAorg/richfaces/renderkit/html/images/spacer.gif.jsf"/>
Option 3
<input id="j_id352:source::2StateInput" type="hidden" value="3" name="j_id352:source::2"/>
</td>
</tr>
<tr id="j_id352:source::3" class="rich-picklist-source-row">
<td class="rich-picklist-source-cell">
<img style="width: 1px; height: 1px;" alt=" " src="/richfaces-demo/a4j/g/3_3_1.GAorg/richfaces/renderkit/html/images/spacer.gif.jsf"/>
Option 4
<input id="j_id352:source::3StateInput" type="hidden" value="4" name="j_id352:source::3"/>
</td>
</tr>
<tr id="j_id352:source::4" class="rich-picklist-source-row">
<td class="rich-picklist-source-cell">
<img style="width: 1px; height: 1px;" alt=" " src="/richfaces-demo/a4j/g/3_3_1.GAorg/richfaces/renderkit/html/images/spacer.gif.jsf"/>
Option 5
<input id="j_id352:source::4StateInput" type="hidden" value="5" name="j_id352:source::4"/>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</td>
</tr>
</tbody>
</table>


Заранее благодарю.
Я уже два дня с этим тр@хаюсь.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)