它相当冗长,TLDR 版本低于文本的暴击墙。
设置:我们公司使用原型已经有一段时间了,最近才切换到dojo。我一直在转换很多很多 JS 并将一切恢复正常,然后我遇到了这个问题......
问题:我有一个带有上传文件字段的典型表单。(我没有使用 dijit,并且尝试了它们的多种变体 - 也许在 1.4 中不适合我,我会再试一次。)按下提交按钮后,我的意图是观察文件的上传进度,在原型中是一个简单的 ajax.PeriodicalUpdater 调用(基本上是 xhrGet/Post 一遍又一遍地运行)。再加上 apc.rfc1867 (例如:http ://www.phpriot.com/articles/php-ajax-file-uploads/3 )这变得很容易,基本上你发帖,并使用ajax来获取文件的当前进度.
这是我遇到实际问题的地方...... xhrPost() 在表单进入我所说的“提交模式”(页面正在假脱机和上传)后似乎不想运行。APC 实际上需要文件处于“提交模式”以轮询当前进度并通过 ajax 返回 %。
我尝试过的:只有一件事部分奏效。使用 onclick="" 调用 xhrPost() 紧跟 return false; 这个问题是我让它真正工作的唯一方法是单击提交按钮,然后单击一个单独的提交按钮并返回 false ......我认为这工作的原因是它开始了一个正常的提交,然后在它发送 xhrPost() 的上传过程以及 return false;。可能是重新开始上传,但可以肯定的是 APC 数据正在输入进度条,不幸的是,这不需要点击 2 次。此外,它也没有完成提交页面。
我在按钮或表单上使用 dojo.connect() 几乎没有成功。
我使用 onclick="" 几乎没有成功,除非 return false; 存在。
我使用 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 必须知道试图上传的文件,而停止事件似乎完全阻碍了这一点。