Доступ к выбранному узлу дерева richfaces из Javascript

Это должен быть очень простой вопрос. У меня есть дерево Richfaces, которое отображается с использованием JSF. Когда пользователь нажимает на узел, я хочу, чтобы запускалась функция javascript. Ни больше ни меньше. Без перенаправлений, без повторной отправки, без повторной обработки, без Ajax. Просто старый добрый Javascript.

Я видел атрибут дерева onselected, и он действительно запускает метод Javascript. Но, конечно, я хочу знать, какой узел был нажат.

Вот что у меня есть

<head>
<script type="text/javascript">
function documentClicked(nodeRef)
{
    alert("Node is "+nodeRef);
}

</script>
</head>


    <rich:tree switchType="client" value="#{ajaxDocumentTree.rootNode}"  
        var="document" onselected="documentClicked()" >



        <rich:treeNode   iconLeaf="../images/tree/doc.gif"
            icon="../images/tree/doc.gif">

            <h:outputText value="#{document.friendlyName}" />

        </rich:treeNode>

Но это не работает, потому что nodeRef не определен. Я ожидал, что первым аргументом обратного вызова будет выбранный узел, но это не так.

Итак, вопрос такой:

Как запустить функцию Javascript с выбранным узлом из дерева richfaces?


person kazanaki    schedule 19.05.2010    source источник


Ответы (2)


Ответ заключается в том, что код javascript должен находиться на уровне узла, а не на уровне дерева.

<head>
<script type="text/javascript">
function documentClicked(nodeRef)
{
    alert("Node id is "+nodeRef);
}

</script>
</head>


    <rich:tree switchType="client" value="#{ajaxDocumentTree.rootNode}"  
        var="document" >

        <rich:treeNode onclick="documentClicked('#{document.id}')">

            <h:outputText value="#{document.friendlyName}" />

        </rich:treeNode>
person kazanaki    schedule 20.05.2010

У меня небольшой опыт работы с JSF, но не следует ли this (в рамках вашего обработчика событий) относиться к выбранному узлу, как это обычно происходит в JavaScript?

Измените свою функцию на эту и попробуйте:

function documentClicked()
{
    alert("Node is " + this);
}

РЕДАКТИРОВАТЬ: очевидно, что вышесказанное неверно. Согласно моему комментарию ниже, измените свой JSF на

<rich:tree switchType="client" value="#{ajaxDocumentTree.rootNode}"  
        var="document" onselected="documentClicked(this)" >
person Peter Jaric    schedule 19.05.2010
comment
Я думал то же самое! Я уже пробовал. Это относится ко всему окну браузера, а не к выбранному узлу. - person kazanaki; 19.05.2010
comment
У вас есть общедоступный URL-адрес вашей тестовой страницы? Я действительно с подозрением отношусь к этим фреймворкам Java / JSF-to-JavaScript. Наверное, потому, что я их плохо знаю, но мне бы очень помогло увидеть, какой JS-код был сгенерирован в итоге. Затем мы можем увидеть, как на самом деле вызывается documentClicked. - person Peter Jaric; 19.05.2010
comment
Хорошо, я дурак, из вашего кода очевидно, как вызывается documentClicked. Сохраните исходную функцию и вызовите ее в onselected следующим образом: documentClicked (this). - person Peter Jaric; 19.05.2010