Home >Web Front-end >CSS Tutorial >Replace JavaScript Dialogs With New HTML Dialog
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.
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'); }
At this time, I realized alert()
, confirm()
and prompt()
come with many often overlooked modal window features:
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.
Dialog
classFirst, 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(); } // ... }
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. 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>
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.) ...
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!