Как встроить и вызвать скрипт javascript на странице RichFaces / JSF

Я искал способ встраивать и вызывать функции javascript на страницах JSF. Я тоже использую RichFaces.

Чтобы определить функцию, похоже, я могу сделать это в кросс-браузерной манере:

        <a4j:outputPanel ajaxRendered="true">
        <f:verbatim>
            <script type="text/javascript">
                function datum() {
                    alert("hi");
                }
            </script>
        </f:verbatim>
    </a4j:outputPanel>

но я не уверен, как я могу вызвать эту функцию при загрузке страницы, чтобы текст, который она возвращал, был встроен в h:outputPanel. План состоит в том, чтобы встроить часы js в страницу, обслуживаемую клиентом. Обратите внимание, я не использую тег body, я использую фейсы ui:composition, f:view (core) и RF RI rich:page.

Спасибо


person volvox    schedule 04.06.2010    source источник


Ответы (1)


Независимо от того, какие типы тегов на стороне сервера вы используете, к тому времени, как ваша страница попадает в браузер, все уже исчезло, и это был просто HTML. (По крайней мере, так лучше, иначе ничего не получится.) Что вам нужно сделать, так это организовать вызов вашего кода обработчиком события load. Есть разные способы сделать это, но самый простой из них:

 <f:verbatim>
     <script type="text/javascript">
        window.onload = function() {
            alert("hi");
        }
    </script>
</f:verbatim>

Теперь, что касается инициализации другой части страницы, снова важно то, что заканчивается в HTML. Вы захотите организовать там какой-то HTML-контейнер (<div> или что-то в этом роде, в зависимости от дизайна вашей страницы), и вы захотите, чтобы он имел уникальный атрибут «id». Затем ваш Javascript может использовать «id» для поиска элемента и установки его содержимого:

    var elem = document.getElementById("whatever");
    elem.innerHTML = // ... whatever ;

Вы, вероятно, сделали бы это внутри функции "load".

Кроме того, если вы используете Facelets вместо JSP, который представляет собой технологию просмотра на основе XML, вам нужно будет добавить разделители разделов XML CDATA, если ваш JavaScript содержит комментарии // или литералы, такие как ‹,>, && и т. Д. пример с разделителями XML CDATA:

 <f:verbatim>
     <script type="text/javascript">
     //<![CDATA[
        //Comments won't show error now.
        window.onload = function() {
            alert("hi");
        }
    //]]>
    </script>
</f:verbatim>

Вы можете увидеть подробное объяснение Когда здесь использовать CDATA. Они не нужны, если вы создаете страницы HTML5.

Удачного кодирования!

person Pointy    schedule 04.06.2010
comment
Я понял о тегах сервера, но хотел быть недвусмысленным относительно вызова этой функции в коде jsf. Я не понимал, что могу использовать window.onload внутри самого js. Спасибо - person volvox; 04.06.2010
comment
О, также предупреждение (вероятно, очевидное) - как только вам понадобится две вещи, которые будут вызываться во время загрузки (особенно, когда они находятся в несвязанных блоках кода на стороне сервера), вы вам понадобится более изящная настройка для управления этими функциями обработчика. Вот где начинают сильно помогать различные фреймворки Javascript. - person Pointy; 04.06.2010
comment
@BalusC Что ж, я польщен, что вы сочли мою дрожь достаточно значительной, чтобы ее можно было квалифицировать как чрезмерное обобщение :-) Я не буду отрицать тот факт, что дрожь - это моя настоящая реакция, когда я думаю о XHTML, хотя я полностью согласен с точки, которые вы указали в этом другом ответе. - person Pointy; 11.04.2013
comment
Справедливо. Извините, я просто устал видеть, что XHTML переоценивают / чрезмерно обобщают не те люди :) - person BalusC; 11.04.2013
comment
Я пробовал окружить скрипт секцией CDATA. Но если я это сделаю, CDATA также будет отображаться в выводе HTML. Без него я получаю ошибки, потому что скрипт содержит ‹и›. Я использую JSF 2, реализацию myfaces. - person Markus N.; 12.05.2016