Не мога да получа xhrPost при изпращане на формуляр чрез бутона за въвеждане, полудявам

Тя е доста дълга, TLDR версия под критичната стена от текст.

Настройка: Нашата компания използваше прототип от известно време и съвсем наскоро премина към доджо. Преобразувах много и много 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; Проблемът с това е, че единственият начин, по който го накарах да работи, беше да щракна върху бутона за изпращане и след това да щракна върху отделен бутон за изпращане с return 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 трябва да знае за файла, който се опитва да бъде качен, и спирането на събитието изглежда възпрепятства това напълно.


person viisual    schedule 19.11.2009    source източник


Отговори (1)


След като си поиграх с това още малко, измислих свое собствено решение.

Направих тестова страница, която използва доджо и прототип. Едно нещо, което забелязах, беше, че prototype също даде грешка в същата ситуация, това все още не разбирам, но постоянството с ajax заявките ще върне резултати, в този случай използвах javascripts native setInterval(), за да продължа да изисквам ajax актуализации . (Направих персонализиран клас по доджо)

Надяваме се, че това ще помогне на някого в бъдеще.

person viisual    schedule 20.11.2009