У меня есть страница, которая использует функции jjery ajax для отправки некоторых сообщений.
Для отправки может быть отправлено более 50 тыс. Сообщений.
Это может занять некоторое время.
То, что я хочу сделать, это показать индикатор выполнения с отправляемыми сообщениями.
Бэкэнд – это PHP.
Как я могу это сделать?
Это обновляется по мере продолжения исходного сценария.
функция настраивается под названием progress(ident)
Функция делает вызов ajax скрипту, который считывает процент.
индикатор прогресса обновляется Если возвращаемый процент не равен 100,
функция устанавливает тайм-аут, который вызывает себя через 1 секунду.
У вас может быть анимированная gif-загрузка через .html()
в область результатов, пока ваша функция ajax не вернет результаты. Просто идея.
Что касается индикатора выполнения jquery ui, периодически с помощью вашего скрипта вы хотите отобразить числовое значение, представляющее процент завершен как назначенную переменную javascript. Например…
// text example php script if (isset($_GET['twentyfive-percent'])) { sleep(2); // I used sleep() to simulate processing echo '$("#progressbar").progressbar({ value: 25 });'; } if (isset($_GET['fifty-percent'])) { sleep(2); echo '$("#progressbar").progressbar({ value: 50 });'; } if (isset($_GET['seventyfive-percent'])) { sleep(2); echo '$("#progressbar").progressbar({ value: 75 });'; } if (isset($_GET['onehundred-percent'])) { sleep(2); echo '$("#progressbar").progressbar({ value: 100 });'; }
И ниже – это функция, которую я использовал, чтобы получить индикатор выполнения, чтобы обновить его положение. Я знаю, немного орехов.
avail_elem = 0; function progress_bar() { progress_status = $('#progressbar').progressbar('value'); progress_status_avail = ['twentyfive-percent', 'fifty-percent', 'seventyfive-percent', 'onehundred-percent']; if (progress_status != '100') { $.ajax({ url: 'test.php?' + progress_status_avail[avail_elem], success: function(msg) { eval(msg); avail_elem++; progress_bar(); } }); } }
Если бы я должен был догадаться, я бы сказал, что есть лучший способ … Но так я работал, когда тестировал.
Проверьте это, если вы используете jQuery: http://docs.jquery.com/UI/Progressbar
Вы можете просто указать значение бара для каждого успеха AJAX.
В противном случае, если вы не используете JS Framework, см. Это: http://www.redips.net/javascript/ajax-progress-bar/
У меня нет возможности проверить его, но он должен выглядеть следующим образом:
var current = 0; var total = 0; var total_emails = <?php $total_emails ;?>; $.ajax({ ... success: function(data) { current++; // Add one to the current number of processed emails total = (current/total_emails)*100; // Get the percent of the processed emails $("#progressbar").progressbar("value", total); // Add the new value to the progress bar } });
И убедитесь, что вы включите jQuery вместе с jQueryUI, а затем добавьте контейнер #progressbar где-нибудь на странице.
У меня могут быть некоторые ошибки, хотя … Вам, вероятно, придется округлить общее количество, особенно если у вас много писем.
Используйте этот ответный вопрос
вот как я его реализовал:
var progressTrigger; var progressElem = $('span#progressCounter'); var resultsElem = $('span#results'); var recordCount = 0; $.ajax({ type: "POST", url: "Granules.asmx/Search", data: "{wtk: '" + wkt + "', insideOnly: '" + properties.insideOnly + "', satellites: '" + satIds + "', startDate: '" + strDateFrom + "', endDate: '" + strDateTo + "'}", contentType: "application/json; charset=utf-8", dataType: "xml", success: function (xml) { Map.LoadKML(xml); }, beforeSend: function (thisXHR) { progressElem.html(" Waiting for response from server ..."); ResultsWindow.LoadingStart(); progressTrigger = setInterval(function () { if (thisXHR.readyState > 2) { var totalBytes = thisXHR.getResponseHeader('Content-length'); var dlBytes = thisXHR.responseText.length; (totalBytes > 0) ? progressElem.html("Downloading: " + Math.round((dlBytes / totalBytes) * 100) + "%") : "Downloading: " + progressElem.html(Math.round(dlBytes / 1024) + "K"); } }, 200); }, complete: function () { clearInterval(progressTrigger); progressElem.html(""); resultsElem.html(recordCount); ResultsWindow.LoadingEnd(); }, failure: function (msg) { var message = new ControlPanel.Message("<p>There was an error on search.</p><p>" + msg + "</p>", ControlPanel.Message.Type.ERROR); } });