1

MyFaces 1.1 + Tomahawk + ​​Ajax4JSF を使用した長いプロジェクトの後、Myfaces 2.0 を使用しています。2.0 は間違いなく大幅な改善です。私はonload 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 には、Ajax リクエストの完了後に Javascript を実行できる「oncomplete」属性がありました。f:ajax で MyFaces 2.0 に相当するものはありますか? そういえば、event="oncomplete" は試していませんが、うまくいくかもしれません。

4

1 に答える 1

4

さて、私はそれを理解しました。

後でページの上部にあるスクリプトをロードするとオーバーライドされます

ページの最後にスクリプトをロードすると、オンロードが上書きされますが、JSF メカニズムも壊れます。したがって、より良い解決策は、JSF の onload を使用してスクリプトをページの最後に配置することでした。JSFソースを少し掘り下げた後、関数を見つけました。

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

そしてもちろん、元の投稿で行ったことを行う checkDownloadFile を定義する必要がありました。

私はoncompleteについても理解しました。f:ajax タグには、3 回呼び出される onevent 属性があります。実行前に 1 回、実行後に 2 回。リクエストを完了した直後に一度、ページコンポーネントを更新した後にもう一度信じています。コールバック関数は、ステータスを持つイベント パラメータを受け取ります。したがって、コールバック関数でステータスをチェックして、何かを行うかどうかを決定します。ステータスは、begin、complete、および success です。だから私の場合、私は持っています:

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

そしてスクリプト:

    function myEvent(e) {
        if (e.status == 'success') {
            checkDownloadFile();
        }
    }
于 2011-04-07T09:13:21.560 に答える