jQuery - может ли $ .json вызывать другую страницу или использовать запрос, уже запущенный на текущей странице? - PullRequest
2 голосов
/ 28 февраля 2012

На данный момент ничего не сломано. :) Я просто хочу получить какую-то производительность.

У меня есть форма с цепочкой выбора (один выпадающий список изменяется, а второй выпадающий параметр изменяется). Прямо сейчас моя форма выполнит ajax-вызов на другую страницу и получит содержимое в виде строки данных json. Это быстро, но если данные уже были извлечены (например, сохранены в памяти), изменения будут мгновенными, а не небольшой задержкой. Могу ли я изменить вызов этой функции на что-то, что выполняется на странице? Например, jQuery Autocomplete делает это (посмотрите на исходный код). Прямо сейчас, когда вы измените значение для операционной системы, список моделей изменится. Если бы я загрузил модель в память, мне нужно было бы смоделировать строку json, чтобы указать, какие параметры соответствуют операционным системам.

Другими словами, могу ли я создать строку json и сохранить ее в памяти, а затем просто сослаться на эти данные вместо отдельного вызова ajax?

function updateModels(i){
    var pltfrm = $(i).val();
    var firstOption = $(i);
    var model = firstOption.parent().next().find('.model');
    $.getJSON("index.cfm?do=misc.getModels&platform=" + pltfrm,
    function(j){
        var options = '';
        for (var i = 0; i < j.length; i++) 
        {
            options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
        }
    model.html(options);
    });
}

Мои данные JSON в настоящий момент отформатированы для ОС LINUX:

[
{"optionValue":"","optionDisplay":"Select a model"},
{"optionValue":"Dell 2850","optionDisplay":"Dell 2850"},
{"optionValue":"Dell 2950","optionDisplay":"Dell 2950"},
{"optionValue":"Dell 2970", "optionDisplay":"Dell 2970"},
{"optionValue":"Dell 6850", "optionDisplay":"Dell 6850"},
{"optionValue":"Dell R710", "optionDisplay":"Dell R710"}
]

Это очень низкий приоритет , но я знаю, что это поможет производительности, поэтому, если у вас будет время и вы захотите поработать со мной, я, безусловно, это ценю.

1 Ответ

1 голос
/ 28 февраля 2012

Конечно, просто сохраните данные в localStorage:

function updateModels(i){
    var pltfrm = $(i).val();
    var firstOption = $(i);
    var model = firstOption.parent().next().find('.model');

    var storedItemSerialized = localStorage.getItem('model' + pltfrm), storedItem = {};

    var redrawModels = function (j)
    {
        var options = '';
        for (var i = 0; i < j.length; i++) 
        {
            options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
        }
        model.html(options);

    }


    if (storedItemSerialized)
    {
       redrawModels($.parseJSON(storedItemSerialized));
    }
    else
    {

      $.getJSON("index.cfm?do=misc.getModels&platform=" + pltfrm,
      function(j){
        localStorage.setItem('model' + pltfrm, JSON.stringify(j));
        redrawModels(j);
      });

    }
}

Этот метод обладает дополнительным преимуществом сохранения данных через запросы страниц.

...