「Widget:Custom map」の版間の差分
提供:メタファー リファンタジオ 攻略Wiki
ヘイグ運営用アカウント (トーク | 投稿記録) 編集の要約なし |
ヘイグ運営用アカウント (トーク | 投稿記録) 編集の要約なし |
||
18行目: | 18行目: | ||
<script type="text/javascript"> | <script type="text/javascript"> | ||
///////////////////////////////////// | |||
// マップの初期化を改善するコード | |||
(function() { | |||
// API_BASE_URLを保護 | |||
const WIKI_BASE_URL = API_BASE_URL; | |||
// | Object.defineProperty(window, 'API_BASE_URL', { | ||
value: WIKI_BASE_URL, | |||
writable: false, | |||
/////////////// | configurable: false | ||
// | |||
// | |||
const | |||
}); | }); | ||
// | // マップ初期化前のクリーンアップ | ||
function cleanupBeforeInit() { | |||
// 既存のマップインスタンスを削除 | |||
// | |||
if (window.map) { | if (window.map) { | ||
map.remove(); | map.remove(); | ||
window.map = null; | window.map = null; | ||
} | } | ||
// | // drawnItemsをクリーンアップ | ||
if (window.drawnItems) { | if (window.drawnItems) { | ||
drawnItems.clearLayers(); | drawnItems.clearLayers(); | ||
window.drawnItems = null; | window.drawnItems = null; | ||
} | } | ||
// | // Leaflet関連の変数をリセット | ||
['editControl', 'drawControl', 'iconDefinitions'].forEach(varName => { | ['editControl', 'drawControl', 'iconDefinitions'].forEach(varName => { | ||
if (window[varName]) { | if (window[varName]) { | ||
147行目: | 49行目: | ||
} | } | ||
}); | }); | ||
/ | // マップ関連のローカルストレージをクリア | ||
const currentWiki = WIKI_BASE_URL.split('/').pop(); | |||
Object.keys(localStorage).forEach(key => { | Object.keys(localStorage).forEach(key => { | ||
if (key.includes('map') || key.includes('leaflet')) { | if (key.includes('map') || key.includes('leaflet')) { | ||
localStorage.removeItem(key); | if (!key.includes(currentWiki)) { | ||
localStorage.removeItem(key); | |||
} | |||
} | } | ||
}); | }); | ||
} | |||
// 安全なマップ初期化 | |||
function initializeMap() { | |||
// 初期化前のクリーンアップ | |||
cleanupBeforeInit(); | |||
// マップインスタンスの作成 | |||
map = L.map('map', { | |||
crs: L.CRS.Simple, | |||
maxBounds: imageBounds.pad(0.5), | |||
minZoom: <!--{$minzoom}-->, | |||
maxZoom: <!--{$maxzoom}-->, | |||
}); | |||
// APIリクエストのインターセプター | |||
const originalAjax = $.ajax; | |||
$.ajax = function(settings) { | |||
// URLが現在のWikiのものかチェック | |||
if (typeof settings.url === 'string') { | |||
const requestUrl = settings.url.startsWith('http') ? | |||
settings.url : | |||
WIKI_BASE_URL + settings.url; | |||
if (!requestUrl.includes(WIKI_BASE_URL.split('/').pop())) { | |||
console.warn('Incorrect Wiki URL detected, correcting...'); | |||
settings.url = settings.url.replace( | |||
/\/[^\/]+\/api\.php/, | |||
'/' + WIKI_BASE_URL.split('/').pop() + '/api.php' | |||
); | |||
} | |||
} | |||
return originalAjax.apply(this, arguments); | |||
}; | |||
// その他の初期化処理... | |||
drawnItems = new L.FeatureGroup(); | |||
map.addLayer(drawnItems); | |||
// イベントリスナーの設定 | |||
map.on('unload', cleanupBeforeInit); | |||
return map; | |||
} | |||
// 既存の初期化処理を置き換え | |||
window.originalInitMap = window.initMap || function() {}; | |||
window.initMap = function() { | |||
const map = initializeMap(); | |||
window.originalInitMap.call(this); | |||
return map; | |||
}; | }; | ||
// ページ離脱時のクリーンアップ | |||
$(window).on('unload', cleanupBeforeInit); | |||
})(); | |||
///////////////////////////</script> | |||
let map; | |||
var drawnItems; | |||
var drawControl; | |||
var editMode = false; | |||
// APIベースURLを定数として定義 | |||
const API_BASE_URL = 'https://prd-h1g-elb-2067013247.ap-northeast-1.elb.amazonaws.com/metaphor_refantazio'; | |||
///////////////////////////////// | |||
window.savePopupContent = savePopupContent; | window.savePopupContent = savePopupContent; |