Ассоциативные массивы не поддерживаются в IE 7? - PullRequest
1 голос
/ 01 марта 2012

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

Для ясности, это мой код:

var modelTable = {};

Затем я сохраняю что-то на объекте:

//inside getJSON-call:
$.each(data.Models, function (index, val) {
    modelTable[val.Name] = val;
});

В этом случае val - это просто объект json:

{
    Models : [
        {
            Name: "4-stroke (EBE)",
            ModelNumber: "VRE",
            Engine: "125ccm"
        }
    ]
}

Но когда я пытаюсь извлечь данные из моего modelTable следующим образом:

var model = modelTable["4-stroke (EBE)"];

Объект является нулевым или неопределенным, в соответствии с инструментами разработчика IE:

SCRIPT5007: Unable to get value of the property 'Name': object is null or undefined 

Редактировать: Большие фрагменты кода:

Это в основном два поля ввода для поиска (с автозаполнением пользовательского интерфейса jQuery; не важно). Поле First , используется для выбора марки мотоцикла (марки), затем поле second заполняется при выборе марки и содержит название модели. Значение (javascript .text()) второго поля ввода используется для поиска всех конкретных данных в modelTable, потому что мне нужны эти данные для отправки формы поиска.

$(function () {
    if ($('#mc_search').length) {
        init_mc_makes();
    }
});

var modelTable = {};

function init_mc_makes() {
    //populates the brand drop down list in jquery ui autocomplete
}

function init_mc_models() {
    //populates the model drop down list in jquery ui autocomplete
    //and iterates the json data to save associative data in modelTable
    //calls submitSearch(name, brand)
}

function submitSearch(name, brand) {
    var model = modelTable[name];
    var chosenModelNumber = model.ModelNumber; //Unable to get value of the property 'ModelNumber': object is null or undefined 
    //submits form with data...
}

1 Ответ

0 голосов
/ 01 марта 2012

Если код, который вы показываете, выполняется после готовности к dom, обратный вызов $() будет выполнен синхронно . Например, вывод этого кода:

$(function () { console.log(1); });
console.log(2);

зависит от того, выполнено ли оно до , когда DOM готов (сначала будет выводиться 2, а затем - когда DOM наконец готов - 1) или после он готов (в этом случае он выдаст 1, затем 2).

Я подозреваю, что ваш код выполняется только тогда, когда DOM готов (например, он находится в асинхронно загруженном файле или сам по себе обернут в вызов $()). То, произойдет это или нет, может действительно зависеть от используемого браузера, поскольку такие вещи, как наличие атрибута defer в тегах скрипта или скорость создания DOM, могут реально повлиять на это. Это только догадка, хотя; трудно сказать без контекста.

Если это правильно, однако, init_mc_makes() вызывается немедленно; в частности, он вызывается перед присвоением

modelTable = {}

сделано. Из-за переменного подъема, modelTable уже существует на данный момент, но это undefined.

Если эта теория верна, движется

var modelTable = {};

выше вызов $(...) должен решить проблему.

...