Não consigo obter xhrpost após o envio do formulário via botão de entrada, estou ficando louco

StackOverflow https://stackoverflow.com/questions/1766163

Pergunta

É uma versão bastante longa e tldr abaixo do parede criticão do texto.

Configurar: Nossa empresa usava protótipo há algum tempo e recentemente mudou para o Dojo. Eu tenho convertido muitos e muitos js e colocando tudo de volta ao normal e depois encontrei esse problema ...

O problema: Eu tenho um formulário típico configurado com um campo de arquivo de upload. (Não estou usando um dijit e tentei várias variações delas - não estou trabalhando para mim, talvez em 1.4, tentarei novamente.) Ao pressionar o botão Enviar, minhas intenções foram assistir ao progresso do upload dos arquivos, no protótipo This foi uma chamada simples de Ajax.PeriodicalUpDater (o que é basicamente xhrget/post que corre repetidamente). Juntamente com APC.RFC1867 (Exemplo: http://www.phpriot.com/articles/php-ajax-file-uploads/3) isso se torna muito fácil, basicamente você publica e usa o Ajax para buscar o progresso atual do arquivo.

Aqui é onde eu encontro o problema real... xhrpost () não parece querer executar após o formulário entrar no que chamo de 'modo de submissão' (onde a página está spool e upload). A APC realmente precisa que os arquivos estejam no 'modo de submissão' para pesquisar o progresso atual e retornar o % via Ajax.

O que eu tentei: Apenas uma coisa funcionou parcialmente. Usando o OnClick = "" chamando o xhrpost () imediatamente seguido pelo retorno false; O problema com isso é que a única maneira de conseguir que funcione foi clicar no botão Enviar e, em seguida, clicar em um botão de envio separado com retorno falso ... Acho que por que isso funcionou é que ele começou um envio normal e depois durante O processo de upload enviou o xhrpost () junto com o retorno false;. Provavelmente, são os uploads reiniciados, mas o que tem certeza é que os dados da APC estavam sendo alimentados na barra de progresso, infelizmente isso não deve exigir 2 cliques. Além disso, também não terminou de enviar a página.

Tive pouco sucesso usando dojo.connect () no botão ou no formulário.

Tive pouco sucesso usando onclick = "" a menos que retorne false; é presente.

Tive pouco sucesso usando o dojo.io.Iframe para enviar uma solicitação separada.

Tive pouco sucesso usando dojox.file.fileupload e também apresenta uma grande quantia de seus próprios problemas.

Partes de codigo:

Código antigo:

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);

Novo Código:

    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);
            }
        }
    });
}

Manuseio da 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 '...';

}

Versão tldr: Preciso de uma maneira de enviar um formulário com arquivos para fazer upload e enviar xhrpost () ao mesmo tempo, e nada que eu tento funciona. A única outra variável é que a APC deve saber sobre o arquivo que tenta ser carregado e a interrupção do evento parece impedir isso completamente.

Foi útil?

Solução

Depois de brincar com isso um pouco mais, criei minha própria solução.

Fiz uma página de teste que usava dojo e protótipo. Uma coisa que notei foi que o protótipo também deu um erro na mesma situação, isso ainda não entendo, no entanto, ser persistente com as solicitações do Ajax retornará os resultados; nesse caso, usei JavaScripts Native SetInterval () para continuar solicitando atualizações do Ajax . (Eu fiz uma aula de dojo personalizada)

Espero que isso ajude alguém, no futuro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top