let map; let itinerary = []; function initMap() { map = L.map('map').setView([35.6895, 139.6917], 13); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map); map.on('click', function(e) { let marker = L.marker(e.latlng).addTo(map); addLocationToItinerary(e.latlng); }); } function addLocationToItinerary(latlng) { let item = { lat: latlng.lat.toFixed(4), lng: latlng.lng.toFixed(4), date: '', time: '', memo: '' }; itinerary.push(item); updateItineraryDisplay(); } function updateItineraryDisplay() { let itineraryList = document.getElementById('itinerary'); itineraryList.innerHTML = ''; itinerary.forEach((item, index) => { let li = document.createElement('li'); li.textContent = `地点: ${item.lat}, ${item.lng}`; if (item.date) li.textContent += ` - ${item.date}`; if (item.time) li.textContent += ` ${item.time}`; if (item.memo) li.textContent += ` - ${item.memo}`; let editButton = document.createElement('button'); editButton.textContent = '編集'; editButton.onclick = () => editItineraryItem(index); li.appendChild(editButton); itineraryList.appendChild(li); }); } function editItineraryItem(index) { let item = itinerary[index]; item.date = prompt('日付を入力してください:', item.date); item.time = prompt('時間を入力してください:', item.time); item.memo = prompt('メモを入力してください:', item.memo); updateItineraryDisplay(); } document.getElementById('save-itinerary').addEventListener('click', function() { localStorage.setItem('itinerary', JSON.stringify(itinerary)); alert('日程を保存しました'); }); document.getElementById('load-itinerary').addEventListener('click', function() { let savedItinerary = localStorage.getItem('itinerary'); if (savedItinerary) { itinerary = JSON.parse(savedItinerary); updateItineraryDisplay(); alert('日程を読み込みました'); } else { alert('保存された日程がありません'); } }); window.onload = initMap; Service Worker (service-worker.js) javascript const CACHE_NAME = 'trip-planner-v1'; const urlsToCache = [ '/', '/index.html', '/styles.css', '/app.js', '/icon.png' ]; self.addEventListener('install', function(event) { event.waitUntil( caches.open(CACHE_NAME) .then(function(cache) { return cache.addAll(urlsToCache); }) ); }); self.addEventListener('fetch', function(event) { event.respondWith( caches.match(event.request) .then(function(response) { if (response) { return response; } return fetch(event.request); } ) ); });