點擊 Label 變為輸入框,輸入框失焦後變回 Label 並顯示新值;雙擊再次編輯。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Label 編輯演示</title>
<style>
.editable-label { cursor: text; border: 1px solid transparent; padding: 2px 4px; display: inline-block; min-width: 80px; }
.editable-label:focus-within { border-color: #007bff; background: #fff; }
.editable-label input { border: none; outline: none; width: 100%; font: inherit; }
</style>
</head>
<body>
<label class="editable-label" ondblclick="startEdit(this)">雙擊編輯我</label>
<script>
function startEdit(label) {
if (label.querySelector('input')) return; // 防重複
const text = label.textContent;
label.innerHTML = '<input type="text" value="' + escapeHtml(text) + '">';
const input = label.querySelector('input');
input.focus();
input.select();
const finish = () => {
const newVal = input.value;
label.textContent = newVal || text; // 空則恢復原值
label.ondblclick = () => startEdit(label); // 重新綁定
};
input.addEventListener('blur', finish);
input.addEventListener('keydown', e => {
if (e.key === 'Enter') { input.blur(); }
if (e.key === 'Escape') { input.value = text; input.blur(); }
});
}
function escapeHtml(str) {
return str.replace(/[&<>"']/g, c => ({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c]));
}
</script>
</body>
</html>
ondblclick 觸發編輯態,blur 確認提交,Enter/Esc 鍵盤支持。escapeHtml 轉義實體字符,防止注入腳本。擴展建議:若項目已用 Vue/React,請直接使用
v-model/useState綁定雙向數據,配合contenteditable或組件庫(如 Element Plus 的ElInput)實現更健壯。