イメージマップ内の領域属性の座標を再計算するスクリプトを作成しています。最初にページを読み込むとき、関数は初期化され、領域の座標はユーザーのブラウザの幅に合わせて調整されます。最初の時間はすべてうまくいく。イメージマップ領域座標を再計算するときのエラー
window要素に 'resize'イベントリスナーを追加しました。関数は起動し(init関数と同じ)、座標は期待どおりに調整されます。そうです。しかし、1つの問題があります。ウィンドウのサイズを変更するたびにエラーが表示され続けます(エラーが発生するのは初めてです)。
エラー:resizeイベントにinit関数を発射するとき誰もがうまくいかない何
Uncaught TypeError: Cannot set property 'coords' of undefined
at http://localhost:3000/js/index.js:78697:33
at Array.forEach (native)
at Object.resize (http://localhost:3000/js/index.js:78696:23)
at Object.start (http://localhost:3000/js/index.js:78691:25)
at Object.init (http://localhost:3000/js/index.js:78679:27)
at Object.start (http://localhost:3000/js/index.js:78724:27)
at init (http://localhost:3000/js/index.js:78720:19)
はJavaScript
/* ALL IMPORTANT CONFIG DATA
------------------------------------------------ */
const config = {
allMaps: [],
actualMap: document.getElementsByTagName('map')[0],
allAreas: false,
areaCoords: [],
vector: false,
};
/* RECALCULATION FUNCTIONALITY
------------------------------------------------ */
const RecalculateImageMap = {
init() {
/* AUTOMATICALLY UPDATE COORDINATES ON RESIZED WINDOW
------------------------------------------------ */
window.addEventListener('resize', ImageMapSetup.init);
if (!config.actualMap.newSize) {
RecalculateImageMap.start();
}
},
start() {
config.allAreas = config.actualMap.getElementsByTagName('area');
config.vector = document.getElementById('interactive_vector');
/* ALL COORDINATES TO ARRAY
------------------------------------------------ */
for (let i = 0; i < config.allAreas.length; i++) {
const coords = config.allAreas[i].coords;
config.areaCoords.push(coords.replace(/ *, */g, ',').replace(/ +/g, ','));
}
RecalculateImageMap.resize();
},
resize() {
/* FOR EACH AREA => RESIZE THE COORDINATES
------------------------------------------------ */
config.areaCoords.forEach(function(area, i) {
config.allAreas[i].coords = RecalculateImageMap.scale(area);
});
},
scale(area) {
const allValues = area.split(',');
/* CHECK FOR DIFFERENCE IN SCREENSIZE
------------------------------------------------ */
let totalScale = config.vector.width/config.vector.naturalWidth;
let newArea = [];
/* CHANGE EACH COORDINATE BASED ON THE NEW SCALE (DIFFERENCE SINCE LAST WIDTH)
------------------------------------------------ */
allValues.map(function(coordinate) {
let result = Math.round(Number(coordinate) * totalScale);
newArea.push(result);
});
return newArea;
}
};
/* INITIALIZE RESIZING
------------------------------------------------ */
const ImageMapSetup = {
init() {
ImageMapSetup.start(config.actualMap);
},
start(element) {
if (element) {
RecalculateImageMap.init(element);
config.allMaps.push(element);
}
}
};
ImageMapSetup.init();
を参照していますか?私はしばらくの間、解決策を探していました。しかし、それは成功しません。
ありがとうございます!
あなたは 'config.areaCoords.forEach'でループしていますので、' areaCoords'のインデックスでループ内の 'config.allAreas [i] .coords'にアクセスしています。**本当に** 'i'インデックスは' config.allAreas'の要素数を決して超えませんか? – gus27
@ gus27お返事ありがとうございます!ループとインデックスはうまくいくようですが、私は+1と-1を試みましたが、それより多くのエラーがあります。変わったことは、関数が初めて完璧に動作することです(ページを読み込むときのinit)。ウィンドウのサイズを変更すると、一度正常に機能した同じ機能が起動する間にエラーが発生します。 –