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

2025-07-21

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

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


原因很簡單:Safari。

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

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

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

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

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

&lt;button id=&quot;openDialogBtn&quot;&gt;開啟對話框&lt;/button&gt; &lt;dialog id=&quot;checkoutDialog&quot;&gt; &lt;form method=&quot;dialog&quot;&gt; &lt;p&gt;請輸入您的名稱&#65306;&lt;/p&gt; &lt;input type=&quot;text&quot; id=&quot;usernameInput&quot; placeholder=&quot;輸入名稱&#8230;&quot; /&gt; &lt;div style=&quot;margin-top: 16px; text-align: right;&quot;&gt; &lt;button value=&quot;cancel&quot;&gt;取消&lt;/button&gt; &lt;button value=&quot;confirm&quot;&gt;送出&lt;/button&gt; &lt;/div&gt; &lt;/form&gt; &lt;/dialog&gt; &lt;script&gt; const dialog = document.getElementById(&#39;checkoutDialog&#39;); const openBtn = document.getElementById(&#39;openDialogBtn&#39;); // 按下按鈕 &#8594; 打開 dialog openBtn.addEventListener(&#39;click&#39;, () =&gt; { dialog.showModal(); }); // 你也可以監聽 dialog 的關閉事件&#65288;例如取得 input 值&#65289; dialog.addEventListener(&#39;close&#39;, () =&gt; { if (dialog.returnValue === &quot;confirm&quot;) { const name = document.getElementById(&#39;usernameInput&#39;).value; alert(&quot;使用者輸入&#65306;&quot;+name); }else{ alert(dialog.returnValue); } }); &lt;/script&gt;

result:

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

背景阻擋、焦點管理、自動 ESC 關閉。
你不用寫任何 code,全部原生搞定。

2. method="dialog" 
按哪個按鈕,dialog.returnValue 就返回哪個 value。
不需要寫 click handler,不用 preventDefault()
不用管理 state他就會自動關閉。

3. 不用外部依賴

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



當麻許的碎念筆記 2014 | Donma Hsu Design.