0

它相当冗长,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 必须知道试图上传的文件,而停止事件似乎完全阻碍了这一点。

4

1 回答 1

1

在玩了更多之后,我想出了自己的解决方案。

我做了一个使用dojo和原型的测试页面。我注意到的一件事是原型在相同的情况下也出现了错误,我仍然不明白,但是坚持使用 ajax 请求将返回结果,在这种情况下,我使用 javascripts 本机 setInterval() 继续请求 ajax 更新. (我做了一个自定义的道场课程)

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

于 2009-11-20T22:23:49.180 回答