在 MDN 文件中,HTMLButtonElement、HTMLFormElement 等均屬於「HTML DOM Element Objects」,但為何 new Image() 可正常建立,new Button()、new Form() 卻拋出 ReferenceError: Button is not defined?
Image() 建構子存在於 window.Image,歷史緣由是為了 預載圖片(preload)與 canvas 繪圖服務,不等同於建立 DOM 節點。它回傳的是一個獨立的 HTMLImageElement 實例,未掛載到文件樹,也無 parentNode。
現代瀏覽器支援 document.createElement('button') 或 new HTMLButtonElement()(實驗性),但 絕大多數 HTML 元素沒有暴露全域建構子。標準方式:
// 正確建立按鈕元素
const btn = document.createElement('button');
btn.textContent = 'Click me';
document.body.appendChild(btn);
// 正確建立表單元素
const form = document.createElement('form');
form.action = '/submit';
form.method = 'POST';
document 工廠方法,而非全域建構子。createElement 可確保元素擁有正確的 ownerDocument、命名空間與事件繼承鏈。Image、Option、Audio 等少數建構子,後續標準化決定不再擴展。| 建構子 | 對應元素 | 主要用途 |
|---|---|---|
new Image() | <img> | 預載、Canvas 繪圖 |
new Option() | <option> | 動態產生下拉選項 |
new Audio() | <audio> | 音頻播放控制 |
new Text() | 文字節點 | 建立文字節點 |
document.createElement(tagName) 建立任意元素。new Image() 但記得它不是 DOM 節點,需再 document.createElement('img') 並設定 src 才能插入頁面。dom lib 可獲得完整型別提示,避免誤用不存在的建構子。Image 是歷史遺留的特例,服務於圖片預載與 Canvas;其餘元素請遵循 DOM 標準,透過 document.createElement() 建立。理解這層設計哲學,能避免在控制台看到紅字報錯。