它相当冗长,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更新。(我做了一个定制的道场课程)

希望这对将来的人有所帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top