JSF 2.0 javascript onload / oncomplete - PullRequest
       12

JSF 2.0 javascript onload / oncomplete

1 голос
/ 06 апреля 2011

Я работаю с Myfaces 2.0 после долгого проекта с использованием MyFaces 1.1 + Tomahawk + Ajax4JSF. 2.0, безусловно, огромное улучшение. Хотя я не могу заставить работать javascript. Я воткнул это в мою голову:

<script type="text/javascript">
    window.onload = function () {
        var fileDownload = document.getElementById('userManagementForm:fileDownload');
        if (fileDownload.value == 'true') {
            fileDownload.value = false;
            window.open('Download');
        }
    }                   
    </script>

Но это не выполняется. Я немного посмотрел на исходный код myfacecs JS и заметил, что они кое-что делают с onload. Не вдавался в подробности, но это, кажется, блокирует мою попытку переопределить событие onload. Есть ли другой способ обойти это, может быть, прямой вызов библиотеки JSF?

Еще один вопрос, вроде той же темы. Ajax4JSF имеет атрибут «oncomplete», который позволит вам запустить Javascript после выполнения запроса Ajax. Есть ли в MyFaces 2.0 аналог f: ajax? Если подумать, я не пробовал event = "oncomplete", возможно, это сработает.

1 Ответ

4 голосов
/ 07 апреля 2011

Хорошо, я понял это.

Загрузка скрипта вверху страницы позже переопределяется

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

<script type="text/javascript">
        myfaces._impl.core._Runtime.addOnLoad(window, checkDownloadFile);
</script>

И, конечно, я должен был определить checkDownloadFile, который делает то, что у меня было в оригинальном посте.

Я тоже разобрался с неполным. Тег f: ajax имеет атрибут onevent, который вызывается 3 раза. Один раз перед казнью и дважды после. Я полагаю, один раз сразу после завершения запроса, затем снова после обновления компонентов страницы. Функция обратного вызова принимает параметр события, который имеет статус. Таким образом, в вашей функции обратного вызова вы проверяете статус, чтобы решить, стоит ли что-то делать. Статусы - начало, завершение и успех. Так что для моего случая у меня есть:

<f:ajax execute="userManagementForm" event="click" onevent="myEvent" render="userManagementForm:results userManagementForm:workarea userManagementForm:fileDownload" />

А потом сценарий:

    function myEvent(e) {
        if (e.status == 'success') {
            checkDownloadFile();
        }
    }
...