相当冗长,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(),然后返回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必须知道试图上传的文件,并且停止该事件似乎完全阻碍了这一点。
答案 0 :(得分:1)
在玩了这个之后,我想出了自己的解决方案。
我制作了一个使用dojo和prototype的测试页面。我注意到的一件事是原型在同样的情况下也给出了错误,我仍然不明白,但是持久的ajax请求将返回结果,在这个例子中我使用javascripts本机setInterval()继续请求ajax更新。 (我做了一个自定义的dojo课程)
希望将来可以帮助某人。