#php #javascript #jquery #ajax #xhr
Всем привет! Пытаюсь использовать jQuery AJAX для моих целей, но столкнулся с проблемой:
$('#go').on('click',function(evt){
evt.preventDefault();
$(this).hide();
$('#progress-bar').show();
console.log('starting ajax request');
$.ajax({
xhr: function () {
var xhr = new window.XMLHttpRequest();
xhr.addEventListener('progress', function (e) {
console.log(e);
if (e.lengthComputable) {
$('.progress-bar').css('width', '' + (100 * e.loaded / e.total)
+ '%');
}
});
return xhr;
},
type: 'POST',
url: 'core.php',
data: {},
complete: function (response, status, xhr) {
console.log(response);
$('.desc').html(response.responseText);
}
});
});
.container-fluid {
padding-top: 20px;
}
#progress-bar {
margin-top: 20px;
display: none;
width: 100%;
}
В core.php мне нужно провести будет некоторые операции над массивами. Предположим,
это будет:
Мой javascript не работает. Знаю, что это из-за того, что e.lengthComputable = false.
Также узнал, что core.php headers содержат Content-Length: 0. Ок. Но что я должен сделать,
чтоб мой AJAX запрос работал верно и работал динамический прогресс бар? Спасибо.
Ответы
Ответ 1
Content-Length: 0, потому что из PHP нет никакого вывода. Поставьте что-то вроде этого: echo "прогресс" $progress;, ну или что там у вас нужно от контроллера вернуть, чтобы в html затем вставить. В общем, то, что хотите, лучше через websockets сделать, чтобы сам сервер пушал обновления когда у него прогресс, и лучше это делать на node.js. Есть реализации сокетов и под php, но я, правда, заглянул разок как это сделано там, пришел в ужас и предпочитаю использовать node.js. К тому же, нагружать контроллеры PHP интенсивными вычислениями не рекомендуется наукой - если это скажем магазин, вы его положите рано или поздно, когда даже несколько десятков посетителей запустят нечто подобное. Для серверов с интенсивными вычислениями обычно берут Java EE, ставят большую железку. PHP, да и Node.js, по большому счету, для этого не годится.
Комментариев нет:
Отправить комментарий