「Widget:Custom map」の版間の差分

提供:メタファー リファンタジオ 攻略Wiki
移動先:案内検索
編集の要約なし
編集の要約なし
18行目: 18行目:


<script type="text/javascript">
<script type="text/javascript">
 
/////////////////////////////////////
let map;
// マップの初期化を改善するコード
var drawnItems;
(function() {
var drawControl;
     // API_BASE_URLを保護
var editMode = false;
     const WIKI_BASE_URL = API_BASE_URL;
// APIベースURLを定数として定義
     Object.defineProperty(window, 'API_BASE_URL', {
const API_BASE_URL = 'https://prd-h1g-elb-2067013247.ap-northeast-1.elb.amazonaws.com/metaphor_refantazio';
         value: WIKI_BASE_URL,
 
        writable: false,
///////////////
         configurable: false
// Wikiのクロスサイト影響をデバッグするためのツール
window.debugWikiURLSwitching = function() {
    console.group('=== Wiki URL Switching Debug ===');
   
     // 現在のWikiコンテキストを保存
     const currentWikiContext = {
        baseURL: API_BASE_URL,
        path: window.location.pathname,
        timestamp: new Date().toISOString()
    };
      
    // ローカルストレージのWiki関連データを確認
    console.log('LocalStorage Wiki Data:');
    Object.keys(localStorage).forEach(key => {
         if (key.includes('wiki') || key.includes('map') ||
            key.includes('rs2r') || key.includes('mario') ||
            key.includes('zelda') || key.includes('leaflet')) {
            console.log(`${key}:`, localStorage.getItem(key));
         }
     });
     });


     // セッションストレージも確認
     // マップ初期化前のクリーンアップ
     console.log('\nSessionStorage Wiki Data:');
     function cleanupBeforeInit() {
    Object.keys(sessionStorage).forEach(key => {
         // 既存のマップインスタンスを削除
        if (key.includes('wiki') || key.includes('map') ||
            key.includes('rs2r') || key.includes('mario') ||
            key.includes('zelda') || key.includes('leaflet')) {
            console.log(`${key}:`, sessionStorage.getItem(key));
        }
    });
 
    // グローバル変数のチェック
    console.log('\nGlobal Variables Check:');
    const relevantGlobals = ['API_BASE_URL', 'map', 'drawnItems', 'L'];
    relevantGlobals.forEach(varName => {
        if (window[varName]) {
            console.log(`${varName} exists:`, {
                type: typeof window[varName],
                value: varName === 'API_BASE_URL' ? window[varName] : '[Object]'
            });
        }
    });
 
    // Cookieもチェック
    console.log('\nRelevant Cookies:');
    document.cookie.split(';').forEach(cookie => {
        if (cookie.includes('wiki') || cookie.includes('map') ||
            cookie.includes('rs2r') || cookie.includes('mario') ||
            cookie.includes('zelda')) {
            console.log('Cookie:', cookie.trim());
        }
    });
 
    // APIリクエストの監視を強化
    const originalAjax = $.ajax;
    $.ajax = function(settings) {
        // URLの変更を検出
        const originalUrl = settings.url;
        const knownWikis = [
            'rs2r',
            'mario_luigi_brothership',
            'zelda_eow',
            'metaphor_refantazio'
        ];
       
        // 意図しないWikiへのURLスイッチを検出
        const detectedWiki = knownWikis.find(wiki =>
            settings.url.includes(wiki) && !API_BASE_URL.includes(wiki)
        );
       
        if (detectedWiki) {
            console.warn('URL Switch Detected!', {
                intendedWiki: API_BASE_URL.split('/').pop(),
                detectedWiki: detectedWiki,
                originalUrl: originalUrl,
                stack: new Error().stack
            });
        }
 
        return originalAjax.apply(this, arguments);
    };
 
    // Leafletマップのクリーンアップ状態を確認
    console.log('\nLeaflet State Check:');
    if (window.map) {
        console.log('Map instance exists');
        console.log('Drawn items count:', drawnItems?.getLayers().length || 0);
       
        // マップのイベントリスナーを確認
        const mapEvents = map._events;
        console.log('Map event listeners:', Object.keys(mapEvents));
    }
 
    // 前回のマップ情報が残っていないか確認
    if (window.previousMapState) {
        console.warn('Previous map state detected:', window.previousMapState);
    }
 
    // クリーンアップ関数の提供
    window.cleanupMapState = function() {
        console.group('Cleaning up map state');
       
         // マップインスタンスのクリーンアップ
         if (window.map) {
         if (window.map) {
             map.remove();
             map.remove();
             window.map = null;
             window.map = null;
         }
         }
       
 
         // drawnItemsのクリーンアップ
         // drawnItemsをクリーンアップ
         if (window.drawnItems) {
         if (window.drawnItems) {
             drawnItems.clearLayers();
             drawnItems.clearLayers();
             window.drawnItems = null;
             window.drawnItems = null;
         }
         }
       
 
         // Leaflet関連のグローバル変数をクリーンアップ
         // 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);
          
          
         console.log('Map state cleaned up');
         // イベントリスナーの設定
         console.groupEnd();
        map.on('unload', cleanupBeforeInit);
          
        return map;
    }
 
    // 既存の初期化処理を置き換え
    window.originalInitMap = window.initMap || function() {};
    window.initMap = function() {
        const map = initializeMap();
        window.originalInitMap.call(this);
        return map;
     };
     };


     console.log('\nDebug tools installed. Use cleanupMapState() to reset map state.');
     // ページ離脱時のクリーンアップ
    console.groupEnd();
    $(window).on('unload', cleanupBeforeInit);
};


// URLの履歴を追跡
})();
window.trackURLHistory = function() {
///////////////////////////</script>
    const urlHistory = sessionStorage.getItem('urlHistory') ?
 
        JSON.parse(sessionStorage.getItem('urlHistory')) : [];
 
   
let map;
    urlHistory.push({
var drawnItems;
        timestamp: new Date().toISOString(),
var drawControl;
        url: window.location.href,
var editMode = false;
        apiBaseUrl: API_BASE_URL
// APIベースURLを定数として定義
    });
const API_BASE_URL = 'https://prd-h1g-elb-2067013247.ap-northeast-1.elb.amazonaws.com/metaphor_refantazio';
   
    // 最新の10件のみ保持
    if (urlHistory.length > 10) {
        urlHistory.shift();
    }
   
    sessionStorage.setItem('urlHistory', JSON.stringify(urlHistory));
   
    console.group('URL History');
    urlHistory.forEach((entry, index) => {
        console.log(`${index + 1}:`, entry);
    });
    console.groupEnd();
};
//////////////////////////////////////////////


window.savePopupContent = savePopupContent;
window.savePopupContent = savePopupContent;

2024年11月10日 (日) 13:05時点における版