Оно довольно длинное, версия 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 должен знать о попытке загрузки файла, и остановка события, кажется, полностью препятствует этому.