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 の background-color 値は、JSON ファイル内のいずれかの値になります。背景色の値を 16 進数に変換し、「#」文字を削除して、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」の値が null になることがあるため、すべての色に値があるわけではないので、問題になる可能性があると思いました。ただし、すべての色が持つ「nam」や「num」などのプロパティを宣言するだけでも、同じエラー メッセージが表示されます。
ありがとう。