#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, по большому счету, для этого не годится.
Комментариев нет:
Отправить комментарий