それはかなり長い、テキストの壁の下の TLDR バージョンです。
セットアップ: 当社はしばらくプロトタイプを使用していましたが、最近道場に切り替えました。私はたくさんの JS を変換し、すべてを通常の状態に戻していましたが、この問題が発生しました...
問題: アップロード ファイル フィールドを設定した典型的なフォームがあります。(私は dijit を使用しておらず、それらの複数のバリエーションを試しました - おそらく 1.4 でうまくいかないので、もう一度試してみます。) 送信ボタンを押すと、私の意図はファイルのアップロードの進行状況を監視することでした。単純な ajax.PeriodicalUpdater 呼び出しでした (これは基本的に、何度も何度も実行される xhrGet/Post です)。apc.rfc1867 (例: http://www.phpriot.com/articles/php-ajax-file-uploads/3 ) と組み合わせると、これは非常に簡単になります。基本的には投稿し、ajax を使用してファイルの現在の進行状況を取得します。 .
ここで実際の問題が発生します...フォームが「送信モード」と呼ばれるもの(ページがスプールおよびアップロードされる場所)に入った後、xhrPost()は実行したくないようです。APC は、現在の進行状況をポーリングし、ajax 経由で % を返すために、実際にはファイルを「送信モード」にする必要があります。
私が試したこと:部分的に機能したのは1つだけです。onclick="" を使用して xhrPost() を呼び出すと、すぐに return false; が続きます。これに関する問題は、実際に機能させる唯一の方法は、送信ボタンをクリックしてから、falseを返す別の送信ボタンをクリックすることだったということです...これが機能した理由は、通常の送信を開始したことです。アップロード プロセスは、xhrPost() と return false; を送信しました。アップロードが再開された可能性がありますが、APC データがプログレス バーに入力されていたことは確かです。残念ながら、これには 2 回のクリックは必要ありません。また、ページの送信も完了していません。
ボタンまたはフォームに dojo.connect() を使用してもほとんど成功しませんでした。
false を返さない限り、onclick="" を使用してもほとんど成功しませんでした。存在します。
dojo.io.iframe を使用して別のリクエストを送信することにほとんど成功していません。
私は dojox.file.FileUpload を使用してほとんど成功しておらず、それ自体の問題も多数あります。
コード スニペット:
古いコード:
new PeriodicalExecuter(function(pe) {
if( dojo.byId('progressbar').innerHTML == 'Processing...' ) {
pe.stop();
} else if( dojo.byId('progressbar').innerHTML != '' ) {
dojo.byId('progressbar1').setStyle({
width: dojo.byId('progressbar').innerHTML + '%'
});
}
}, 1);
新しいコード:
dojo.xhrPost({
url: 'ajax/apcProgressBar.php',
content: { progress_key: dojo.byId( 'progress_key' ).value },
load: function( data ) {
dojo.byId( 'progressbar' ).innerHTML = data;
if( dojo.byId( 'progressbar' ).innerHTML != '' ) {
dojo.style( 'progressbar1', 'width', dojo.byId( 'progressbar' ).innerHTML + '%' );
window.setTimeout(this, 2000);
}
}
});
}
APC の取り扱い:
if( isset( $_POST[ 'progress_key' ] ) ) {
if( $status = apc_fetch( 'upload_' . $_POST[ 'progress_key' ] ) ) {
$progress = ceil( $status[ 'current' ] / $status[ 'total' ] * 100 );
if ( $progress >= 100 ) {
echo 'Processing...';
} else {
echo $progress;
}
}
echo '...';
}
TLDR バージョン: アップロードするファイルを含むフォームを送信し、同時に xhrPost() を送信する方法が必要ですが、何も試してもうまくいきません。他の唯一の変数は、アップロードしようとしているファイルについて APC が認識している必要があり、イベントを停止すると、これが完全に妨げられるように見えることです。