Table of Contents
JavaScript Dialog class
Initialization templates and browser support detection
Summarize
Home Web Front-end CSS Tutorial Replace JavaScript Dialogs With New HTML Dialog

Replace JavaScript Dialogs With New HTML Dialog

Mar 14, 2025 am 09:20 AM

Say goodbye to JavaScript dialog box and embrace HTML<dialog></dialog> element! This article will demonstrate how to use HTML<dialog></dialog> Elements and JavaScript classes elegantly replace traditional JavaScript dialog boxes ( alert() , confirm() , and prompt() ) and improve user experience and accessibility.

Replace JavaScript Dialogs With New HTML Dialog

Are you tired of those monotonous styles and limited functionality JavaScript dialogs? Although they are convenient, they have shortcomings in accessibility, style customization and modernization. This article will provide a more flexible and powerful alternative.

I've used API calls and JavaScript dialogs heavily in a project to collect user feedback. Waiting for another developer to complete<modal></modal> During the development of the component, I used alert() , confirm() and prompt() functions. For example:

 const deleteLocation = confirm('Delete Location?');
if (deleteLocation) {
  alert('location deleted');
}
Copy after login

At this time, I realized alert() , confirm() and prompt() come with many often overlooked modal window features:

  1. True modal window: always on top of the stack, even in z-index: 99999;<div> Above.<li> <strong>Keyboard access:</strong> Press Enter to confirm, press Escape to cancel.</li> <li> <strong>Screen reader friendly:</strong> Move focus and allow reading of modal window content.</li> <li> <strong>Focus Capture:</strong> Pressing the Tab key does not jump to any focusable elements on the main page (but in Firefox and Safari, the focus jumps to the browser UI. Strangely, it is impossible to use the Tab key to move the focus to the "Accept" or "Cancel" buttons in any browser).</li> <li> <strong>Support for user preferences:</strong> Light and dark modes are supported out of the box.</li> <li> <strong>Pause code execution:</strong> Wait for user input.</li> <p> These JavaScript methods meet my needs in 99% of the cases. So, why don't I (and other web developers) use them often? Probably because they look like system errors and cannot be styled. Another important consideration is that they are being gradually being deprecated. The first is to remove it from the cross-domain iframe, which is said to be completely removed from the web platform in the future, although this plan seems to be paused.</p> <p> With this in mind, what alternatives do we have to replace <code>alert() , confirm() , and prompt() ? You may have heard of HTML<dialog></dialog> Elements, this article will focus on how to use it in conjunction with JavaScript classes.

    Although it is impossible to completely copy the full functionality of the JavaScript dialog box, if we<dialog></dialog> showModal() method is used in conjunction with Promise (Promise can resolve (accept) or reject (cancel)), so we can get almost the same functionality. Going a step further, let's do it for HTML<dialog></dialog> Elements add sound effects, just like a real system dialog!

    If you want to view the demo now, visit here.

    JavaScript Dialog class

    First, we need a basic JavaScript class that contains a settings object that will be merged with the default settings. These settings will be used for all dialogs unless you overwrite them when invoked (more on that later).

     export default class Dialog {
      constructor(settings = {}) {
        this.settings = Object.assign(
          {
            /* DEFAULT SETTINGS - see description below */
          },
          settings
        );
        this.init();
      }
      // ...
    }
    Copy after login

    Settings include:

    • accept : The label of the "Accept" button.
    • bodyClass : The dialog box is open and the browser does not support it<dialog></dialog> when added to the element's CSS class.
    • cancel : The label of the "Cancel" button.
    • dialogClass : Add to<dialog></dialog> Custom CSS class for elements.
    • message :<dialog></dialog> Internal content.
    • soundAccept : The URL of the audio file that the user plays when clicking the "Accept" button.
    • soundOpen : The URL of the audio file that the user plays when the dialog box is opened.
    • template : an optional HTML template, injected into<dialog></dialog> middle.

    Initialization templates and browser support detection

    In init method, we will add a helper function to detect the browser's HTML<dialog></dialog> Support for elements and set basic HTML:

     init() {
      // Test<dialog> Support this.dialogSupported = typeof HTMLDialogElement === 'function';
      this.dialog = document.createElement('dialog');
      this.dialog.dataset.component = this.dialogSupported ? 'dialog' : 'no-dialog';
      this.dialog.role = 'dialog';
    
      // HTML template this.dialog.innerHTML = `
        <fieldset data-ref="fieldset" role="document">
    <legend data-ref="message"></legend>
    <div data-ref="template"></div>
    </fieldset>
    <menu></menu> `;
    
      document.body.appendChild(this.dialog);
      // ...
    }</dialog>
    Copy after login

    Browser pair<dialog></dialog> The support situation varies, so we need to perform detection and provide a fallback solution.

    (The subsequent steps are similar to the original text, and the length is too long. Some code details are omitted here, but key logic and code snippets are retained, and the language is polished and adjusted.)

    ... (Omit some code details, including DOM node references, button attributes, cancel button events, polyfills that do not support browsers, keyboard navigation, display<dialog></dialog> , waiting for user input, hiding<dialog></dialog> , focus processing, add alert , confirm and prompt methods, asynchronous/waiting, cross-browser styles, custom dialog examples, etc.) ...

    Summarize

    Through the solutions provided in this article, you can easily use more modern and flexible HTML<dialog></dialog> Elements replace traditional JavaScript dialogs to improve user experience and application accessibility. Remember to adjust the style and functionality according to your specific needs to create a custom dialog that best suits you.

The above is the detailed content of Replace JavaScript Dialogs With New HTML Dialog. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Vue 3 Vue 3 Apr 02, 2025 pm 06:32 PM

It&#039;s out! Congrats to the Vue team for getting it done, I know it was a massive effort and a long time coming. All new docs, as well.

A bit on ci/cd A bit on ci/cd Apr 02, 2025 pm 06:21 PM

I&#039;d say "website" fits better than "mobile app" but I like this framing from Max Lynch:

Can you get valid CSS property values from the browser? Can you get valid CSS property values from the browser? Apr 02, 2025 pm 06:17 PM

I had someone write in with this very legit question. Lea just blogged about how you can get valid CSS properties themselves from the browser. That&#039;s like this.

Using Markdown and Localization in the WordPress Block Editor Using Markdown and Localization in the WordPress Block Editor Apr 02, 2025 am 04:27 AM

If we need to show documentation to the user directly in the WordPress editor, what is the best way to do it?

Stacked Cards with Sticky Positioning and a Dash of Sass Stacked Cards with Sticky Positioning and a Dash of Sass Apr 03, 2025 am 10:30 AM

The other day, I spotted this particularly lovely bit from Corey Ginnivan’s website where a collection of cards stack on top of one another as you scroll.

Comparing Browsers for Responsive Design Comparing Browsers for Responsive Design Apr 02, 2025 pm 06:25 PM

There are a number of these desktop apps where the goal is showing your site at different dimensions all at the same time. So you can, for example, be writing

How to Use CSS Grid for Sticky Headers and Footers How to Use CSS Grid for Sticky Headers and Footers Apr 02, 2025 pm 06:29 PM

CSS Grid is a collection of properties designed to make layout easier than it’s ever been. Like anything, there&#039;s a bit of a learning curve, but Grid is

Google Fonts   Variable Fonts Google Fonts Variable Fonts Apr 09, 2025 am 10:42 AM

I see Google Fonts rolled out a new design (Tweet). Compared to the last big redesign, this feels much more iterative. I can barely tell the difference

See all articles