1

ユーザーがデバイスを選択してから、デバイスで実行するコマンドを選択できるフォーム(チェックボックスの3つのグループ)があります。ユーザーが実行したいデバイスとコマンドを確認した後、続行ボタンをクリックします。

現在、フォームデータがPOSTを介して別のPHPページに送信され、そこで情報がデコードされています。次に、デバイスの情報がDBから取得され、PHPのEXECコマンドを使用して実行されるTCLスクリプトにパラメーターとして挿入されます。スクリプトが戻るまでに最大15秒かかります。

ただし、別のページを読み込む代わりに、JS $ .blockUI()を使用してページをブロックし、フォームを送信し、スクリプトが返されるのを待ってから、フォームが以前に配置されていた場所に返されたコンテンツを表示したいと思います。次に、明らかにUIのブロックを解除します。

プロジェクトにZendFrameworkを使用しています。私は次のものを持っています:

フォーム宣言:

<form name="runcommands" action="/commands/execute/" method="post">

3つの異なるチェックボックスグループ(これは動的に生成されたフォームです):

"<input type='checkbox' name='globalcommand.$id' value='$id' />$command<br />";
"<input type='checkbox' name='projectcommand.$id' value='$id' />$command<br />";
"<input type='checkbox' name='device.$id' value='$id' />$hostname<br />";

私のjavascript/ajaxの知識は、非常に非常に限られています。これは私がJSで行った最初のことです。サイトの残りの部分は、ほとんど純粋なPHP/HTMLです。これが私がJSのために試みたものです。明らかに、それは機能しません。

<script type="text/javascript">
        // Globals
        // prepare the form when the DOM is ready 

        var formd = ""; 

        $(document).ready(function() { 
            //$('#messageCenter').hide();

            //Form Ajax
            var options = { 
                beforeSubmit: beforeSubmit,  // pre-submit callback 
                success: showResponse  // post-submit callback 
            }; 
            $('#runcommands').ajaxForm(options); // bind form using 'ajaxForm' 

            $.ajax({
                type: "post",
                url: "/commands/execute/",
                data: {
                    formd: formd,
                    serverResponse: data.message
                },
                complete: finishAjax
            });
            $.unblockUI();

        }); 

        function finishAjax (data) {
            var ret = data.responseText;
            alert(ret);
        }

        function beforeSubmit (formData, jqForm, options) { 
            formd = $.param(formData); 
            $.blockUI();
            return true; 
        } 

        function showResponse(responseText, statusText, xhr, $form)  { 
            ret = responseText;
            alert(ret);
        } 

    </script>

PHPの実行ページで、今のところスクリプトの出力をエコーアウトします。別の方法でもそれを行う方が良いでしょうか?

ご意見をお寄せいただきありがとうございます。私は立ち往生していて、ここからどこへ行くべきかわかりません。

ケビン

4

1 に答える 1

1

2つの解決策:

解決策1:
現在、ブロック解除はAjaxリクエストの開始と呼ばれていますが、応答が返された後に実行する必要があります。完全な関数にブロック解除を追加します。

<script type="text/javascript">
    // Globals
    // prepare the form when the DOM is ready 

    var formd = ""; 

    $(document).ready(function() { 
        //$('#messageCenter').hide();

        //Form Ajax
        var options = { 
            beforeSubmit: beforeSubmit,  // pre-submit callback 
            success: showResponse  // post-submit callback 
        }; 
        $('#runcommands').ajaxForm(options); // bind form using 'ajaxForm' 

        $.ajax({
            type: "post",
            url: "/commands/execute/",
            data: {
                formd: formd,
                serverResponse: data.message
            },
            complete: finishAjax
        });
    }); 

    function finishAjax (data) {
        var ret = data.responseText;
        alert(ret);
        $.unblockUI();
    }

    function beforeSubmit (formData, jqForm, options) { 
        formd = $.param(formData); 
        $.blockUI();
        return true; 
    } 

    function showResponse(responseText, statusText, xhr, $form)  { 
        ret = responseText;
        alert(ret);
    } 

</script>

解決策2:
asyncオプションをfalseに設定して、ajaxを同期させます。これにより、ブラウザがブロックされます。

 $.ajax({
        type: "post",
        url: "/commands/execute/",
        async: false,
        data: {
            formd: formd,
            serverResponse: data.message
        },
        complete: finishAjax
    });
于 2012-03-15T04:22:27.930 に答える