作为 Javascript 新手,我很难弄清楚以下问题:
我有一个带有颜色列表的外部 JSON 文件。
[
{"num": "1B2-5","nam": "burntsienna","hex": "EA7E5D","com": "int2"},
{"num": "1B3-5","nam": "cadetblue","hex": "5F9EA0","col": "int1"},
{"num": "1B1-6","nam": "chartreuse","hex": "7FFF00"},
{"num": "1B2-6","nam": "chocolate","hex": "D2691E","com": "int2"}
]
在代码中的这一点上,#background 的背景颜色值将等于 JSON 文件中的值之一。我将背景颜色值转换为十六进制,删除“#”字符,并在 JSON 数组中找到它的索引号。然后我使用索引号为相应的属性声明变量。
为了这个例子的目的,我已经缩短了代码。
$(document).ready(function() {
$.getJSON('_js/json.js', function(colors_list){
var pageColorPre = rgb2hex($('#background').css('background-color'));
var pageColor = pageColorPre.toUpperCase().substr(1);
var pageColorIndex = findIndexByKeyValue(colors_list, "hex", pageColor)
var nameByIndex = colors_list[pageColorIndex].nam
var numberByIndex = colors_list[pageColorIndex].num
var comByIndex = colors_list[pageColorIndex].com
function findIndexByKeyValue(obj, key, value){
for (var i = 0; i < obj.length; i++) {
if (obj[i][key] == value) {
return i;
}
}
return null;
}
function rgb2hex(rgb) {
if ( rgb.search("rgb") == -1 ) {
return rgb;
} else {
rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
function hex(x) {
return ("0" + parseInt(x).toString(16)).slice(-2);
}
return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}
}
});
});
尽管代码在 Safari、Firefox 和 Chrome 中运行良好,但当浏览器到达这一行时:
var numberByIndex = colors_list[pageColorIndex].num
调试时出现以下错误:
uncaught TypeError: cannot read property 'nam' of undefined.
IE8 中的代码中断并显示以下消息:
'colors_list[...] nam'is null or not an object.
我想也许是因为“com”和“col”值有时为空,并不是每种颜色都有它们,这可能是个问题。但是,即使仅声明每种颜色都具有的属性,例如“nam”或“num”,我也会收到相同的错误消息。
谢谢。