通过输入按钮提交表单时我无法获取 xhrPost,我快疯了
-
21-09-2019 - |
题
它相当冗长,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 必须知道尝试上传的文件,而停止该事件似乎完全阻碍了这一点。
解决方案
经过更多的尝试后,我想出了自己的解决方案。
我制作了一个使用 dojo 和原型的测试页面。我注意到的一件事是,原型在相同的情况下也给出了错误,这一点我仍然不明白,但是坚持ajax请求将返回结果,在这种情况下,我使用javascripts本机setInterval()来继续请求ajax更新。(我做了一个定制的道场课程)
希望这对将来的人有所帮助。