#javascript #html #jquery #django #ajax
#javascript #HTML #jquery #джанго #аякс
Вопрос:
Я новичок в Javascript, Jquery и Ajax-запросах, и у меня проблема с выполнением моих скриптов.
В принципе, у меня есть очень длинный список для отображения на моей домашней странице (более 1200 элементов). Раньше я загружал страницу в обычном режиме, но поскольку загрузка моего списка заняла бы много времени (и поскольку он находится прямо в середине страницы), возникла бы огромная задержка, прежде чем все мои HTML-элементы отобразились бы. Например, мой нижний колонтитул будет загружаться последним элементом, и он появится почти через целую секунду после моей навигационной панели.
Я решил использовать AJAX-запросы, чтобы сначала загрузить мой HTML-код, выполнить навигационную панель и нижний колонтитул и только потом получить мой список, чтобы показать его в середине моей страницы.
Первая проблема, с которой я сталкиваюсь, заключается в том, что во время обработки моего скрипта ничего не появляется. Это означает, что даже если «tr» моего первого элемента списка готов, он будет отображаться только тогда, когда «tr» 1200-го элемента также будет готов. Мне нужно, чтобы таблица заполнялась постепенно. Я вижу, что мои «tr» генерируются в моей консоли, но они применяются в моем HTML только после того, как все они будут выполнены (после 12500 мс).
Вторая проблема, с которой я сталкиваюсь, заключается в том, что пока этот же скрипт обрабатывается, моя страница не отвечает на мои запросы. Например, я не могу «проверить» или нажать любую кнопку на странице до тех пор, пока скрипт не будет завершен. Это вызывает беспокойство, потому что даже если первая проблема устранена, у меня все еще есть страница, не отвечающая на запросы, в течение примерно 12’500 мс.
Код, который я использую, выглядит следующим образом:
$(document).ready(function(){
console.log( "Document Ready" );
$.ajax({
url: "update_list/",
type: 'get',
success:function(response) {
buildTable(response)
}
});
});
URL-адрес, указанный в предыдущем фрагменте кода, ссылается на это представление в моем бэкэнде Django:
(Элементы списка, которые я хочу получить, — это акции компании)
def update_list(request, *args, **kwargs):
if request.is_ajax():
stocks = StockListView().get_queryset().values('symbol', 'company_name', 'market_cap')
return JsonResponse({"stocks_serialized": list(stocks)})
И затем это скрипт для заполнения моей HTML-таблицы:
function buildTable(data){
var table = document.getElementById('tableId')
const values = Object.values(data);
//this step is because I get a dictionary with an array as its first value. We only need the array for the next part.
const stock_list = values[0]
for (var i = 0; i < stock_list.length; i ){
var row = `<tr>
<td>${stock_list[i].symbol}</td>
<td>${stock_list[i].company_name}</td>
<td>${stock_list[i].market_cap}</td>
</tr>`
table.innerHTML = row
console.log( row )
}
}
Кто-нибудь знает, как исправить эти проблемы? Нужно ли мне изменить свою стратегию, чтобы AJAX запрашивал только небольшие приращения моего списка при запуске прокрутки вниз? В данный момент отображается только около 20 элементов моего списка, остальные доступны только через прокрутку вниз в моей таблице.
Спасибо всем за вашу помощь!
Комментарии:
1. Проблема 1: вам нужно два цикла (по 1 для каждой строки, 1 для всех объявлений), чтобы переместить ваш
<tr>
и</tr>
за пределы внутреннего цикла. Проблема 2: ограничить выполнение циклов внутриbuildTable()
2. Вы пробовали индексировать свою базу данных?
3. @RandyCasburn Спасибо за помощь, но я решил свою проблему по-другому.
4. @Popnoodles Я не индексировал свою базу данных, но, насколько я слышал, это был бы хороший способ сократить количество мс до скорости загрузки.
5. @chenard612 правильно проиндексированная база данных экономит НАМНОГО больше, чем несколько мс. Вы могли бы возвращать результаты за 200 мс вместо 12500 мс.
Ответ №1:
Я нашел решение своей проблемы на веб-сайте Jquery: https://www.tutorialrepublic.com/faq/how-to-add-remove-table-rows-dynamically-using-jquery.php
function buildTable(data){
const values = Object.values(data);
const stock_list = values[0]
for (var i = 0; i < stock_list.length; i ){
//We first declare the variables for each <td> we need
var symbol = stock_list[i].symbol
var comanyName = stock_list[i].company_name
var market_cap = stock_list[i].market_cap_rounded
//We then append them to a string in html fashion
added_row = '<tr>'
'<td>' symbol '</td>'
'<td>' comanyName '</td>'
'<td>' market_cap '</td>'
'</tr>'
//To finally append this long string to your table through it's ID:
$('#tableId').append(added_row)
};
};
Это сделало мою домашнюю страницу намного быстрее и решило обе мои проблемы.
Казалось, что этот шаг сильно замедлил работу страницы:
table.InnnerHtml = row