У меня есть динамически сгенерированный объект, который выглядит так:
colorArray = {
AR: "#8BBDE1",
AU: "#135D9E",
AT: "#8BBDE1",
... }
Я пытаюсь использовать его для раскрашивания карты с помощью этого плагина и атрибут 'colors' во время вызова плагина. Так:
$('#iniDensityMap').vectorMap({
backgroundColor: '#c2e2f2',
colors: colorArray,
... (some other params)
});
Но это не цвет в странах. Когда я жестко кодирую это, он работает нормально, но он должен быть динамически сгенерирован для этого проекта, поэтому что-то вроде этого не будет работать для меня (хотя на самом деле это окрашивает карту):
$('#iniDensityMap').vectorMap({
backgroundColor: '#c2e2f2',
colors: { AR: "#8BBDE1", AU: "#135D9E", AT: "#8BBDE1" },
... (some other params)
});
Я проследил проблему достаточно глубоко в плагине, чтобы найти, что она как-то связана с этим циклом:
setColors: function(key, color) {
if (typeof key == 'string') {
this.countries[key].setFill(color);
} else {
var colors = key; //This is the parameter passed through to the plugin
for (var code in colors) {
//THIS WILL NOT GET CALLED
if (this.countries[code]) {
this.countries[code].setFill(colors[code]);
}
}
}
},
Я также пытался перебирать объект colorArray
самостоятельно, вне плагина, и столкнулся с той же проблемой. Что бы ни находилось внутри for ( var x in obj ), оно не срабатывает. Я также заметил, что colorArray.length
возвращает undefined. Еще одно важное замечание заключается в том, что я создал экземпляр var colorArray = {};
в отдельном вызове, пытаясь убедиться, что он находится в глобальной области видимости и им можно манипулировать.
Я думаю, что проблема либо в:
- То, как я динамически заполняю объект -
colorArray[cCode] = cColor;
(в вызове jQuery .each) - Я снова путаю различия между Arrays() и Objects() в javascript.
- Возможно, это проблема масштаба?
- Некоторая комбинация всего вышеперечисленного.
EDIT #1: я переместил свой дополнительный вопрос об объектах в консоли в Firebug в новое сообщение ЗДЕСЬ. Этот вопрос более конкретно относится к Firebug, чем к основной проблеме JS, о которой я здесь спрашиваю.
Правка №2: дополнительная информация Вот код, который я использую для динамического заполнения объекта:
function parseDensityMapXML() {
$.ajax({
type: "GET",
url: "media/XML/mapCountryData.xml",
dataType: "xml",
success: function (xml) {
$(xml).find("Country").each(function () {
var cName = $(this).find("Name").text();
var cIniCount = $(this).find("InitiativeCount").text();
var cUrl = $(this).find("SearchURL").text();
var cCode = $(this).find("CountryCode").text();
//Populate the JS Object
iniDensityData[cCode] = { "initiatives": cIniCount, "url": cUrl, "name": cName };
//set colors according to values of initiatives count
colorArray[cCode] = getCountryColor(cIniCount);
});
}
});
} //end function parseDensityMapXML();
Затем эта функция вызывается по событию щелчка флажка в другом месте страницы. Объекты iniDensityData
и colorArray
объявлены в заголовке html-файла — в надежде, что они останутся в глобальной области видимости:
<script type="text/javascript">
//Initialize a bunch of variables in the global scope
iniDensityData = {};
colorArray = {};
</script>
И, наконец, вот фрагмент из читаемого XML-файла:
<?xml version="1.0" encoding="utf-8"?>
<icapCountryData>
<Country>
<Name>Albania</Name>
<CountryCode>AL</CountryCode>
<InitiativeCount>7</InitiativeCount>
<SearchURL>~/advance_search.aspx?search=6</SearchURL>
</Country>
<Country>
<Name>Argentina</Name>
<CountryCode>AR</CountryCode>
<InitiativeCount>15</InitiativeCount>
<SearchURL>~/advance_search.aspx?search=11</SearchURL>
</Country>
... and so on ...
</icapCountryData>
jQuery.each
. Вы случайно не используете ключевое словоthis
внутри этой функции? напримерthis.countries
?this
неправильное связывание является одной из наиболее распространенных причин ошибок в JavaScript. - person rybosome   schedule 01.08.2012$(xml).find("Country").each(function () { var cCode = $(this).find("CountryCode").text(); ...some more stuff }
, а затем заполняю colorArray следующим образом:colorArray[cCode] = cColor;
- person Tim   schedule 01.08.2012colorArray
(хотя на самом деле это объект)? Что можно сказать о масштабах этого? Было бы неплохо, если бы вы разместили больше кода, чтобы получить полный контекст. Использование инструментов разработчика также может помочь вам копнуть глубже; поместите следующий оператор прямо перед вызовом функцииvectorMap
:console.log(colorArray);
. Это запишет в консоль отладки вашего браузера содержимое объектаcolorArray
. Гугл инструкция как подтянуть консоль. Я предполагаю, что этот объект будет либо{}
,null
, либоundefined
. - person rybosome   schedule 01.08.2012Object
вArray
. Массив в javascript использует квадратные скобкиvar arr = [];
. Называя это массивом, мы думаем, что вы запутались... - person ErikE   schedule 01.08.2012