Id('msg'); function showMsg(text, isErr) { msgEl.textContent = text; msgEl.className = 'msg ' + (isErr ? 'err' : 'ok'); msgEl.style.display = 'block'; setTimeout(function() { msgEl.style.display = 'none'; }, 3000); } function loadList() { fetch(API + '?action=list') .then(r => r.json()) .then(res => { if (!res.ok) { showMsg(res.msg || '加载失败', true); return; } listEl.innerHTML = (res.data || []).map(row => '<tr><td>' + row.id + '</td><td>' + escapeHtml(row.domain) + '</td><td>' + escapeHtml(row.title) + '</td><td><button class="btn edit-btn" data-id="' + row.id + '">修改</button> ' + '<button class="btn btn-danger del-btn" data-id="' + row.id + '">删除</button></td></tr>' ).join(''); }) .catch(() => showMsg('请求失败', true)); } function escapeHtml(s) { var d = document.createElement('div'); d.textContent = s; return d.innerHTML; } form.addEventListener('submit', function(e) { e.preventDefault(); var id = editId.value; var isEdit = id !== ''; var formData = new FormData(); formData.append('action', isEdit ? 'edit' : 'add'); if (isEdit) formData.append('id', id); formData.append('domain', editDomain.value.trim()); formData.append('title', editTitle.value.trim()); fetch(API, { method: 'POST', body: formData }) .then(r => r.