Я не могу получить xhrPost при отправке формы с помощью кнопки ввода, я схожу с ума

Оно довольно длинное, версия TLDR ниже критической стены текста.

Настройка. Наша компания некоторое время использовала прототип и совсем недавно перешла на додзё. Я преобразовывал много-много JS и возвращал все в нормальное состояние, а затем столкнулся с этой проблемой...

Проблема: у меня есть обычная форма с полем для загрузки файла. (Я не использую диджит и пробовал несколько их вариантов - у меня не работает, возможно, в 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() для кнопки или формы.

У меня не было большого успеха с использованием onclick="" если не вернуть 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);
            }
        }
    });
}

Обращение с БТР:

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)


Поиграв с этим еще немного, я придумал свое собственное решение.

Я сделал тестовую страницу, в которой использовал додзё и прототип. Одна вещь, которую я заметил, заключалась в том, что прототип также выдавал ошибку в той же ситуации, этого я до сих пор не понимаю, однако, будучи постоянным с запросами ajax, вы получите результаты, в этом случае я использовал javascripts native setInterval() для продолжения запроса обновлений ajax . (Я сделал собственный класс додзё)

Надеюсь, это поможет кому-то в будущем.

person viisual    schedule 20.11.2009