0

以下を使用して、「出力」という DIV を更新しています。これは、1 つの例外を除いて正常に機能します。エコー エントリで親ページを更新する必要があります。

<script type="text/javascript">
<!--
var divid = 'output';
var loadingmessage = '<img src="working.gif">';
function AJAX(){
var xmlHttp;
try{
xmlHttp=new XMLHttpRequest(); // Firefox, Opera 8.0+, Safari
return xmlHttp;
}
catch (e){
try{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); // Internet Explorer
return xmlHttp;
}
catch (e){
try{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
return xmlHttp;
}
catch (e){
alert("Your browser does not support AJAX!");
return false;
}
}
}
}
function formget(f, url) {
var poststr = getFormValues(f);
postData(url, poststr);
}
function postData(url, parameters){
var xmlHttp = AJAX();
xmlHttp.onreadystatechange =  function(){
if(xmlHttp.readyState > 0 && xmlHttp.readyState < 4){
document.getElementById(divid).innerHTML=loadingmessage;
}
if (xmlHttp.readyState == 4) {

document.getElementById(divid).innerHTML=xmlHttp.responseText;
}
}

xmlHttp.open("POST", url, true);
xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttp.setRequestHeader("Content-length", parameters.length);
xmlHttp.setRequestHeader("Connection", "close");
xmlHttp.send(parameters);
}

function getFormValues(fobj)

{
var str = "";
var valueArr = null;
var val = "";
var cmd = "";

for(var i = 0;i < fobj.elements.length;i++)

{
switch(fobj.elements[i].type)

{

case "select-one":

str += fobj.elements[i].name +
"=" + fobj.elements[i].options[fobj.elements[i].selectedIndex].value + "&amp;amp;";
break;

}
}

str = str.substr(0,(str.length - 1));
return str;

}

//--></script>

これは次を使用して呼び出されます。

<input type='button' name='Send' value='submit' onclick="javascript: formget(this.form, 'foo.php');">

私が抱えている問題は、foo.php が一連の exec() コマンドを実行することです。各コマンドの間には、出力 div に表示したい echo ステートメントがあります。

したがって、次のようになります。

echo "アーカイブ ファイル"; exec ("tar -cvf bar.tar bar.txt foo.txt");

echo "/user をバックアップしています"; exec ("tar -cvf /user.tar /user/*");

ユーザーに working.gif を見てもらいたいのですが、その下で foo.php からの各 echo ステートメントを表示できますか?

ありがとう

4

1 に答える 1

0

単一の AJAX リクエストでデータのチャンクを別々の時間に送り返そうとしたとは言えないので、それが可能かどうかはわかりません。現在何が起こっていますか?最初のエコー メッセージのみを取得しますか、それとも最後に応答全体のみを取得しますか?

私が知っている2つのことがうまくいく:

  1. PHP スクリプトを複数のスクリプトに分割し、別々の AJAX リクエストで順番に実行します。これは、分離されたスクリプトが互いに依存していない場合、または分離されたスクリプト間で状態を保持する他の方法を見つけた場合にのみ機能します。

  2. AJAX リクエストを使用する代わりに、iframe を作成し、PHP スクリプトをロードします。その後、PHP スクリプトの出力のフラッシュが機能するはずです。(Wordpress を使用したことがある場合は、この手法を使用してプラグインの更新の進行状況を表示していると思います。)

于 2012-12-02T23:34:31.497 に答える