2

2 つのアイデアを組み合わせようとしていますが、互いに互換性があるかどうかはわかりません。

アイデア 1: php スクリプトでコマンド (例: ping) を実行し、Web ブラウザーでコマンドのライブ結果を提供します。

アイデア 2: jQuery ダイアログ ボックスが表示され、開くと php スクリプトが実行され、ダイアログ ボックスに実際の結果が表示されます。

アイデア 1 はかなり簡単に実現できました (ping.php):

<?php
header('Content-Type: text/html; charset=utf-8');
set_time_limit(1800);
ob_implicit_flush(true);
ob_end_flush();

$exe_command = 'C:\\Windows\\System32\\ping.exe -n 10 google.com';

$descriptorspec = array(
    0 => array("pipe", "r"),  // stdin
    1 => array("pipe", "w"),  // stdout -> we use this
    2 => array("pipe", "w")   // stderr 
);
flush(); 

$process = proc_open($exe_command, $descriptorspec, $pipes);
echo "<pre>";  

if (is_resource($process))
{
    while ($s = fgets($pipes[1])) {  
        print $s; 

        flush();  
    }  
}
echo "</pre>"; 
?>

ブラウザで ping.php を開くと、1 行ずつ応答が返ってきます。

アイデア2は、私に問題を引き起こしているものです。ダイアログ ボックスを開くことはできますが、php の作業が終了するまでデータは表示されません。これはおそらくajaxの性質であるため、これを行う正しい方法については、おそらくマークから外れています。

index.html にある JavaScript は次のとおりです。

<script language="Javascript">

function testGetScript() {
    $.getScript("./cgi-bin/ping.php", function(data) {
        var divResults = document.getElementById('pingMe');
        divResults.innerHTML = data;
    });
}

function initDialogs() {
    $('#testDialog').dialog({
        autoOpen: false,
        width: 800,
        title: "PINGING.....",
        modal: true,
        open: function(event, ui) {
            testGetScript();
        },
        close: function() {
            $(this).dialog("close");
            },
        buttons: [
            {text: "Done", click: function() {
                $(this).dialog("close");
            }}
        ]
    });

}

$(document).ready(function(){
    initDialogs();

    $("*[class='btn']").button().click(function() {
            $('#testDialog').dialog('open');
    });

</script>

これが可能かどうかについて考えている人はいますか?もしそうなら、これをどのように達成できるかについて何かアドバイスはありますか?

4

4 に答える 4

2

jQuery.get()PHP ページをリクエストするために使用しますgetScript。JavaScript ファイルをロードするためのものです。

$.get('yourpage.php', {}, function(data, status, xhr) {
    // all done, get your content from the data variable.
});

ダイアログから get を呼び出すのではなく、get 呼び出しの本文にポップアップを表示すると、ダイアログはすべてのデータを取得した後に表示されます。

編集: AJAX は、情報を表示する前に readyState 4 を待機しているようです。PHP フラッシュは readyState 3 を送信しているようです。それをリッスンして、 responseText に入力する必要があります

圧縮を無効にし、コンテンツ タイプを application/octet-stream に設定する必要がある潜在的なバグがいくつかあります。

于 2013-07-29T18:51:55.797 に答える
0

これは、jQuery の getScript に done 関数を使用する必要があることを除いて、これまでと同じ方法で実行できます。

http://api.jquery.com/jQuery.getScript/

私は彼らのajax関数を使うことを好みます

http://api.jquery.com/jQuery.ajax/

セットアップを更新するために必要な場合は、js 間隔/タイムアウト

于 2013-07-29T18:52:03.360 に答える
0

示唆されているように、他の人がこれから恩恵を受けることができるように、この質問への回答として私の回避策をマークダウンしています。

最初に、index.html のダイアログ ボックスに iFrame を追加しました。

<div id="pwrShellDiagWC" style="display: none;">
<iframe id="ajaxFrameWC" src="" width="100%" height="60%"; frameborder="0"></iframe>
</div>

次に、Javascript (jQuery を使用) で、このダイアログ ボックスを初期化し、"open" オプションにコードを追加して、php URL を iFrame に読み込みます。

$('#pwrShellDiagWC').dialog({
autoOpen: false,
width: 800,
title: "Processing your request",
resizable: false,
modal: true,
open: function(event, ui) {
    var frameAttrib = $('#ajaxFrameWC').attr('src');
    var phpURL = './cgi-bin/test.php?value1=arg1';

    if (frameAttrib) {
         // do nothing!
    }
    else {
         $('#ajaxFrameWC').attr('src',phpURL)
    }
});

ボタンもいくつか追加しましたが、これが機能するためにそれを見る必要はないと思います。test.php は、質問に入力したコードを使用し、ダイアログ ボックスに 1 行ずつ表示します。

私が現在取り組んでいる唯一の側面は、iFrame を強制的に下部にスクロールしたままにすることですが、適切に配置されたいくつかの検索で、その小さな苦労を乗り越えることができると確信しています。

乾杯、これが一部の人に役立つことを願っています!

于 2013-08-30T17:22:37.523 に答える