[Javascript] Safari 15.4 後原生支援 <dialog>:前端不再需要外部 Modal 套件

  • 7
  • 0

之前要在網頁上做到彈跳視窗,我都直覺想到要用一些外掛套件,像是 jQuery Dialog 或是  jQuery Modal 

 然後必須要引入一些 library ,最近有需要看一下,發現故事變了,原來現在已經可以用 dialog 了

 


 

原因很簡單:Safari。

Safari 以前不支援 <dialog>,大家都怕踩雷,但從 iOS / macOS Safari 15.4(2022/03/14) 之後正式支援

這表示 2025 年的今天可以放心使用 <dialog>

不需要再引入任何的 library 就可以辦到

我直接給程式碼,這是我現在最常用的版本

功能簡單可讀性高、不用任何第三方依賴

<button id="openDialogBtn">開啟對話框</button>

<dialog id="checkoutDialog">
    <form method="dialog">
        <p>請輸入您的名稱:</p>
        <input type="text" id="usernameInput" placeholder="輸入名稱…" />

        <div style="margin-top: 16px; text-align: right;">
            <button value="cancel">取消</button>
            <button value="confirm">送出</button>
        </div>
    </form>
</dialog>

<script>
    const dialog = document.getElementById('checkoutDialog');
  const openBtn = document.getElementById('openDialogBtn');

  // 按下按鈕 → 打開 dialog
  openBtn.addEventListener('click', () => {
    dialog.showModal();
  });

  // 你也可以監聽 dialog 的關閉事件(例如取得 input 值)
  dialog.addEventListener('close', () => {
    if (dialog.returnValue === "confirm") {
      const name = document.getElementById('usernameInput').value;
      alert("使用者輸入:"+name);
    }else{
      alert(dialog.returnValue);
    }
  
  });
</script>

result:

結論:

1. showModal() 幫你處理一堆麻煩

背景阻擋、焦點管理、自動 ESC 關閉。

你不用寫任何 code,全部原生搞定。

2. method="dialog" 

按哪個按鈕,dialog.returnValue 就返回哪個 value。

不需要寫 click handler,不用 preventDefault()

不用管理 state他就會自動關閉。

3. 不用外部依賴

基於這三個理由,跟程式碼簡潔程度,不用不行了...爽

--

本文原文首發於我的個人部落格:Safari 15.4 後原生支援 <dialog>:前端不再需要外部 Modal 套件

--

---

Yesterday I wrote down the code. I bet I could be your hero. I am a mighty little programmer.