我无法通过输入按钮提交表单提交xhrPost,我疯了

时间:2009-11-19 20:05:33

标签: php dojo apc xmlhttprequest onsubmit

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

1 个答案:

答案 0 :(得分:1)

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

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

希望将来可以帮助某人。