Spaces:
Running
Running
| const resetButton = document.getElementById('resetButton'); | |
| const log = document.getElementById('log'); | |
| const status = document.getElementById('status'); | |
| // 功能開關:是否呼叫 API 獲取額外資訊 | |
| const useApi = false; | |
| // 檢查瀏覽器是否支援 Web NFC | |
| if (!('NDEFReader' in window)) { | |
| status.textContent = '您的瀏覽器不支援 Web NFC。請在 Android 版 Chrome 中嘗試。'; | |
| status.style.color = 'red'; | |
| } else { | |
| // 建立 NDEFReader 實例 | |
| const ndef = new NDEFReader(); | |
| let isScanning = false; | |
| // 頁面載入後自動嘗試初始化 | |
| initNFC(); | |
| resetButton.addEventListener('click', () => { | |
| log.textContent = ''; | |
| resetButton.style.display = 'none'; | |
| }); | |
| // 如果權限被拒絕,讓用戶點擊頁面任何地方重新嘗試 | |
| document.body.addEventListener('click', () => { | |
| if (!isScanning) { | |
| initNFC(); | |
| } | |
| }); | |
| async function initNFC() { | |
| if (isScanning) return; | |
| try { | |
| status.textContent = '正在啟動 NFC 掃描...'; | |
| status.style.color = 'orange'; | |
| await ndef.scan(); | |
| // 成功啟動掃描 | |
| isScanning = true; | |
| status.textContent = '請將 NFC 卡片靠近您的裝置'; | |
| status.style.color = 'green'; | |
| document.body.style.cursor = 'default'; | |
| ndef.onreadingerror = () => { | |
| status.textContent = '讀取 NFC 卡片時發生錯誤,請重新嘗試'; | |
| status.style.color = 'red'; | |
| setTimeout(() => { | |
| if (isScanning) { | |
| status.textContent = '請將 NFC 卡片靠近您的裝置'; | |
| status.style.color = 'green'; | |
| } | |
| }, 3000); | |
| }; | |
| ndef.onreading = ({ message, serialNumber }) => { | |
| resetButton.style.display = 'inline-block'; | |
| let output = `> 掃描時間: ${new Date().toLocaleString()}\n`; | |
| output += `> 卡片 UID: ${serialNumber}\n`; | |
| if (useApi) { | |
| // 當 useApi 為 true 時,執行這段邏輯 | |
| fetch(`https://api.example.com/card-info?uid=${serialNumber}`) | |
| .then(response => response.json()) | |
| .then(data => { | |
| output += `> 持卡人: ${data.holderName}\n`; | |
| output += `> 其他資訊: ${data.otherInfo}\n`; | |
| output += '─'.repeat(40) + '\n'; | |
| log.textContent = output + log.textContent; | |
| }) | |
| .catch(error => { | |
| console.error('API 錯誤:', error); | |
| output += '> 無法從 API 獲取額外資訊。\n'; | |
| output += '─'.repeat(40) + '\n'; | |
| log.textContent = output + log.textContent; | |
| }); | |
| } else { | |
| // 當 useApi 為 false 時,只顯示 UID | |
| output += '─'.repeat(40) + '\n'; | |
| log.textContent = output + log.textContent; | |
| } | |
| // 短暫顯示掃描成功狀態 | |
| const originalStatus = status.textContent; | |
| const originalColor = status.style.color; | |
| status.textContent = '✓ 卡片掃描成功!'; | |
| status.style.color = 'blue'; | |
| setTimeout(() => { | |
| status.textContent = originalStatus; | |
| status.style.color = originalColor; | |
| }, 2000); | |
| }; | |
| } catch (error) { | |
| if (error.name === 'NotAllowedError') { | |
| status.textContent = '⚠️ 需要 NFC 權限才能使用,請點擊頁面任何地方授權'; | |
| status.style.color = 'orange'; | |
| document.body.style.cursor = 'pointer'; | |
| } else { | |
| status.textContent = `錯誤: ${error.message}`; | |
| status.style.color = 'red'; | |
| } | |
| } | |
| } | |
| } | |