Как оптимизировать AJAX запрос?

292
04 августа 2017, 02:47

Есть два связанных option поля в форме для фильтрации автомобилей по маркам и моделям: mark -> model. При выборе марки подгружаются модели. Проблема в том что марки не подгрудаются с сервера с заранее, а только в момент клика на первое поле с марками при помощи $('#mark').focus, и получается что при каждом клике на выпадающее меню марок отправляется запрос, что создает лишнюю нагрузку на сервер.

Как можно исправить эту проблему не меняя код сервера а только модифицировав логику ajax запросов?

Сама форма:

<div>
    <select id="mark" name="mark" data-url="get_all_proposes/get_all_marks">
        <option value="">Select mark</option>
    </select>
</div>
<div>
    <select id="model" name="model" data-url="get_all_proposes/get_model_by_mark">
        <option value="">Select model</option>
    </select>
</div>

Код js:

$(document).ready(function () {
    //Get marks set.
    $('#mark').focus(function(event) {
        $.ajax({
            url : 'get_all_proposes/get_all_marks',
            type : 'get',
            dataType: 'json',
            success: function (data) {
                var select = $('#mark');
                $.each(data, function(index, value) {
                    var optionMark = $('<option>');
                    optionMark.val(value).text(value).appendTo(select);
                });
            }
        });
    });
    //Get models set.
    $('#mark').change(function() {
        $.ajax({
            url : 'get_all_proposes/get_model_by_mark',
            type : 'get',
            data : {
                'mark' : this.value
            },
            dataType: 'json',
            success : function(data) {
                var optionModel = $('#model');
                $.each(data, function(index, value) {
optionModel.append($('<option>').val(value).text(value));
                });
            }
        });
    });
});
Answer 1

Если список марок фисированный и не зависит от других параметров (что скорее всего так), то можно заполнить его сразу после создания страницы:

$(document).ready(function () {
    //Get marks set.
    $.ajax({
        url: 'get_all_proposes/get_all_marks',
        type: 'get',
        dataType: 'json',
        success: function (data) {
            var select = $('#mark');
            $.each(data, function (index, value) {
                var optionMark = $('<option>');
                optionMark.val(value).text(value).appendTo(select);
            });
        }
    });
    //Get models set.
    $('#mark').change(function () {
        $.ajax({
            url: 'get_all_proposes/get_model_by_mark',
            type: 'get',
            data: {
                'mark': this.value
            },
            dataType: 'json',
            success: function (data) {
                var optionModel = $('#model');
                $.each(data, function (index, value) {
                    optionModel.append($('<option>').val(value).text(value));
                });
            }
        });
    });
});
READ ALSO
Подгрузка html шаблона

Подгрузка html шаблона

Подскажите как правильно организовать загрузку html файла средствами jsТ

262
Бесконечный перебор массива

Бесконечный перебор массива

Дан цикл с большим количеством итерацийДан массив с четырьмя элементами

588
Скрипт уведомления на Javascript [требует правки]

Скрипт уведомления на Javascript [требует правки]

Есть таблица пользователей у которых есть непогашенный кредитВ этой таблице есть столбец date здесь отображается дата когда должник должен...

211