search
HomeWeb Front-endCSS TutorialLightweight Autocomplete Controls with the HTML5 Datalist

Lightweight Autocomplete Controls with the HTML5 Datalist

In this tutorial, we’ll take a deep-dive into the little-used HTML5 element. It can implement a lightweight, accessible, cross-browser autocomplete form control that doesn’t require JavaScript.

Key Takeaways

  • The HTML5 `` element offers a lightweight, accessible, and cross-browser solution for autocomplete form controls without relying on JavaScript.
  • Unlike `
  • Browser support for `` is robust in modern browsers including Internet Explorer 10 and 11, with fallback options available for older browsers using a combination of `
  • The `` element cannot be styled directly with CSS, which limits customization but ensures consistency across different browsers and platforms.
  • Enhancements such as AJAX can be integrated with `` to dynamically populate options based on user input, improving functionality and user experience in applications requiring real-time data feedback.

What’s Wrong with

HTML5

  • there are lots of options, such as countries or job titles
  • the user wants to enter their own option which is not on the list

The obvious solution is an autocomplete control. This allows the user to enter a few characters, which limits the options available for quicker selection.

Developers often turn to one of the many JavaScript-powered solutions, but a custom autocomplete control is not always necessary. The HTML5 element is lightweight, accessible, and has no JavaScript dependencies. You may have heard it’s buggy or lacks support. That’s not true in 2021, but there are browser inconsistencies and caveats.

Quick Start

Picking your country from a list containing more than 200 options is an ideal candidate for an autocomplete control. Define a with child

<span><span><span><datalist> id<span>="countrydata"</span>></datalist></span>
</span>  <span><span><span><option>></option></span>Afghanistan<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Åland Islands<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Albania<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Algeria<span><span></span>></span>
</span>  <span><span><span><option>></option></span>American Samoa<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Andorra<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Angola<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Anguilla<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Antarctica<span><span></span>></span>
</span>  ...etc...
<span><span><span></span>></span>
</span></span></span></span></span></span></span></span></span></span></span>

The datalist’s id can then be referenced by a list attribute in any field:

<span><span><span><label> for<span>="country"</span>></label></span>country<span><span></span>></span>
</span>
<span><span><span><input> type<span>="text"</span>
</span></span><span>  <span>list<span>="countrydata"</span>
</span></span><span>  <span>id<span>="country"</span> name<span>="country"</span>
</span></span><span>  <span>size<span>="50"</span>
</span></span><span>  <span>autocomplete<span>="off"</span> /></span>
</span></span></span>

Confusingly, it’s best to set autocomplete="off". This ensures the user is shown values in the but not values they previously entered in the browser.

The result:

Lightweight Autocomplete Controls with the HTML5 Datalist

This is the default rendering in Microsoft Edge. Other applications implement similar functionality, but the look differs across platforms and browsers.

Using the label as a text child of an

<span><span><span><datalist> id<span>="countrydata"</span>></datalist></span>
</span>  <span><span><span><option>></option></span>Afghanistan<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Åland Islands<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Albania<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Algeria<span><span></span>></span>
</span>  <span><span><span><option>></option></span>American Samoa<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Andorra<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Angola<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Anguilla<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Antarctica<span><span></span>></span>
</span>  ...etc...
<span><span><span></span>></span>
</span></span></span></span></span></span></span></span></span></span></span>

Using a value attribute produces identical results:

<span><span><span><label> for<span>="country"</span>></label></span>country<span><span></span>></span>
</span>
<span><span><span><input> type<span>="text"</span>
</span></span><span>  <span>list<span>="countrydata"</span>
</span></span><span>  <span>id<span>="country"</span> name<span>="country"</span>
</span></span><span>  <span>size<span>="50"</span>
</span></span><span>  <span>autocomplete<span>="off"</span> /></span>
</span></span></span>

Note: the closing /> slash is optional in HTML5, although it could help prevent coding errors.

You can also set a value according to a chosen label using either of the following formats.

Option 1:

<span><span><span><datalist> id<span>="mylist"</span>></datalist></span>
</span>  <span><span><span><option>></option></span>label one<span><span></span>></span>
</span>  <span><span><span><option>></option></span>label two<span><span></span>></span>
</span>  <span><span><span><option>></option></span>label three<span><span></span>></span>
</span><span><span><span></span>></span>
</span></span></span></span></span>

Option 2:

<span><span><span><datalist> id<span>="mylist"</span>></datalist></span>
</span>  <span><span><span><option> value<span>="label one"</span> /></option></span>
</span>  <span><span><span><option> value<span>="label two"</span> /></option></span>
</span>  <span><span><span><option> value<span>="label three"</span> /></option></span>
</span><span><span><span></span>></span>
</span></span></span></span></span>

In both cases, the input field is set to 1, 2 or 3 when a valid option is chosen, but the UI varies across browsers:

  • Chrome shows a list with both the value and the label. Only the value remains once an option is chosen.
  • Firefox shows a list with the label only. It switches to the value once an option is chosen.
  • Edge shows the value only.

The following CodePen example shows all variations:

See the Pen
HTML5 autocomplete examples by SitePoint (@SitePoint)
on CodePen.

Implementations will evolve but, for now, I’d advise you do not use a value and label since it’s likely to confuse users. (A workaround is discussed below.)

Browser Support and Fallbacks

The element is well supported in modern browsers as well as Internet Explorer 10 and 11:

Lightweight Autocomplete Controls with the HTML5 Datalist

There are several implementation notes, but they won’t affect most usage. The worst that could happen is a field reverts to a standard text input.

If you absolutely must support IE9 and below, there’s a fallback pattern which uses a standard

<span><span><span><datalist> id<span>="countrydata"</span>></datalist></span>
</span>  <span><span><span><option>></option></span>Afghanistan<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Åland Islands<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Albania<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Algeria<span><span></span>></span>
</span>  <span><span><span><option>></option></span>American Samoa<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Andorra<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Angola<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Anguilla<span><span></span>></span>
</span>  <span><span><span><option>></option></span>Antarctica<span><span></span>></span>
</span>  ...etc...
<span><span><span></span>></span>
</span></span></span></span></span></span></span></span></span></span></span>

See the Pen
HTML5 autocomplete fallback by SitePoint (@SitePoint)
on CodePen.

In modern browsers, the

In IE9 and below, both the (very long)

Lightweight Autocomplete Controls with the HTML5 Datalist

Both values could be entered in old IEs. Your application must either:

  • decide which is most valid, or
  • use a small JavaScript function to reset one when the other is changed

Using on Non-text Controls

Chrome-based browsers can also apply values to:

  1. An input with the type of "date". The user can choose from a range of options defined as YYYY-MM-DD values but presented in their locale format.

  2. An input with the type of "color". The user can choose from a selection of color options defined as six-digit hex values (three-digit values don’t work).

  3. An input with a type of "range". The slider shows tick marks, although this doesn’t limit which value can be entered.

See the Pen
HTML5 on other input types by SitePoint (@SitePoint)
on CodePen.

CSS Styling

If you ever struggled styling a

An can be styled as normal, but a linked and its child

I hope this situation improves, but for now, a solution is proposed at MDN which:

  1. overrides the default browser behavior
  2. effectively treats the like a
    so it can be styled in CSS
  3. replicates all autocomplete functionality in JavaScript
  4. I’ve enhanced it further and the code is available on GitHub. To use it, load the script anywhere in your HTML page as an ES6 module. The jsDelivr CDN URL can be used:

    <span><span><span><datalist> id<span>="countrydata"</span>></datalist></span>
    </span>  <span><span><span><option>></option></span>Afghanistan<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>Åland Islands<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>Albania<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>Algeria<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>American Samoa<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>Andorra<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>Angola<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>Anguilla<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>Antarctica<span><span></span>></span>
    </span>  ...etc...
    <span><span><span></span>></span>
    </span></span></span></span></span></span></span></span></span></span></span>

    Or you can install it with npm if you’re using a bundler:

    <span><span><span><label> for<span>="country"</span>></label></span>country<span><span></span>></span>
    </span>
    <span><span><span><input> type<span>="text"</span>
    </span></span><span>  <span>list<span>="countrydata"</span>
    </span></span><span>  <span>id<span>="country"</span> name<span>="country"</span>
    </span></span><span>  <span>size<span>="50"</span>
    </span></span><span>  <span>autocomplete<span>="off"</span> /></span>
    </span></span></span>

    Your elements must use the format. For example:

    <span><span><span><datalist> id<span>="mylist"</span>></datalist></span>
    </span>  <span><span><span><option>></option></span>label one<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>label two<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>label three<span><span></span>></span>
    </span><span><span><span></span>></span>
    </span></span></span></span></span>

    Note: can’t be used, since it results in an empty element that can’t be styled!

    CSS can then be added to style some or all and

    <span><span><span><datalist> id<span>="mylist"</span>></datalist></span>
    </span>  <span><span><span><option> value<span>="label one"</span> /></option></span>
    </span>  <span><span><span><option> value<span>="label two"</span> /></option></span>
    </span>  <span><span><span><option> value<span>="label three"</span> /></option></span>
    </span><span><span><span></span>></span>
    </span></span></span></span></span>

    Example:

    See the Pen
    HTML5 autocomplete CSS styling by SitePoint (@SitePoint)
    on CodePen.

    Styling works, but is it worth the effort? I suspect not …

    • Re-implementing the browser’s standard keyboard, mouse, and touch controls with reasonable accessibility is difficult. The MDN example doesn’t support keyboard events and, while I tried to improve it, there will inevitably be issues on some devices.
    • You’re relying on 200 lines of JavaScript to solve a CSS problem. It minifies to 1.5kB, but could introduce performance issues if you required many long elements on the same page.
    • If JavaScript is a requirement, would it be preferable to use a prettier, more consistent, battle-tested JavaScript component?

    The control falls back to a standard HTML5 without styling when JavaScript fails, but that’s a minor benefit.

    Creating an Ajax-enhanced

    Presuming your designer is happy to accept browser styling differences, it’s possible to enhance standard functionality using JavaScript. For example:

    1. Implement optional validation which only accepts a known value in the .
    2. Set
    3. Set other field values when an option is chosen. For example, selecting “United States of America” sets “US” in a hidden input.

    The code primarily needs to redefine

    • An Ajax API request should only occur once a minimum number of characters has been entered.
    • Typing events should be debounced. That is, an Ajax call is only triggered once the user has stopped typing for at least half a second.
    • Query results should be cached so it’s not necessary to repeat or parse identical calls.
    • Unnecessary queries should be avoided. For example, entering “un” returns 12 countries. There’s no need to make further Ajax calls for “unit” or “united” because all the resulting options are contained in the original 12 results.

    I’ve created a standard Web Component for this, and the code is available on GitHub. The CodePen example below allows you to select a valid country after entering at least two characters. A music artist autocomplete then returns artists who originated in that country with names matching the search string:

    See the Pen
    HTML5 with Ajax autocomplete by SitePoint (@SitePoint)
    on CodePen.

    • The country look-up API is provided by restcountries.eu.
    • The music artist look-up API is provided by musicbrainz.org.

    To use it in your own application, load the script anywhere in your HTML page as an ES6 module. The jsDelivr CDN URL can be used:

    <span><span><span><datalist> id<span>="countrydata"</span>></datalist></span>
    </span>  <span><span><span><option>></option></span>Afghanistan<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>Åland Islands<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>Albania<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>Algeria<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>American Samoa<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>Andorra<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>Angola<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>Anguilla<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>Antarctica<span><span></span>></span>
    </span>  ...etc...
    <span><span><span></span>></span>
    </span></span></span></span></span></span></span></span></span></span></span>

    Or you can install it with npm if you’re using a bundler:

    <span><span><span><label> for<span>="country"</span>></label></span>country<span><span></span>></span>
    </span>
    <span><span><span><input> type<span>="text"</span>
    </span></span><span>  <span>list<span>="countrydata"</span>
    </span></span><span>  <span>id<span>="country"</span> name<span>="country"</span>
    </span></span><span>  <span>size<span>="50"</span>
    </span></span><span>  <span>autocomplete<span>="off"</span> /></span>
    </span></span></span>

    Create an element with a child to use as the data-entry field. For example, the country lookup uses this:

    <span><span><span><datalist> id<span>="mylist"</span>></datalist></span>
    </span>  <span><span><span><option>></option></span>label one<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>label two<span><span></span>></span>
    </span>  <span><span><span><option>></option></span>label three<span><span></span>></span>
    </span><span><span><span></span>></span>
    </span></span></span></span></span>

    element attributes:

    attribute description api the REST API URL (required) resultdata the name of the property containing a result array of objects in the returned API JSON (not required if only results are returned) resultname the name of the property in each result object which matches the search input and is used for datalist > Åland Islands> Albania> Algeria> American Samoa> Andorra> Angola> Anguilla> Antarctica> ...etc... >

    The resultdata attribute doesn’t need to be set because this is the only data returned (there’s no wrapper object). The resultname attribute must be set to "name" because that property is used to populate datalist

    Other fields can be auto-filled when an option is chosen. The following inputs receive the "alpha2Code" and "region" property data because a data-autofill attribute has been set:

    <span><span><span><label> for<span>="country"</span>></label></span>country<span><span></span>></span>
    </span>
    <span><span><span><input> type<span>="text"</span>
    </span></span><span>  <span>list<span>="countrydata"</span>
    </span></span><span>  <span>id<span>="country"</span> name<span>="country"</span>
    </span></span><span>  <span>size<span>="50"</span>
    </span></span><span>  <span>autocomplete<span>="off"</span> /></span>
    </span></span></span>

    How datalist-ajax works

    You can skip this section if you’d rather not read 230 lines of code and keep the magic alive!

    The code initially creates a new within the , which it attaches to the child using a list attribute. An input event handler monitors the and calls a runQuery() function when a minimum number of characters have been entered and the user is not still typing.

    runQuery() builds the API URL from data in the form and makes an Ajax call using the Fetch API. The returned JSON is parsed, then a reusable DOM fragment containing

    A datalistUpdate() function is called, which updates the with the appropriate cached DOM fragment. Further calls to runQuery() avoid Ajax calls if a query has already been cached or a previous query can be used.

    A change event handler also monitors the , which is triggered when focus is moved from the field and the value has been modified. The function checks that the value matches a known option and, if necessary, uses the Constraint Validation API to show the error message provided in the valid attribute.

    Assuming a valid option has been chosen, the change handler function populates all fields with matching data-autofill attributes. A reference to the auto-fill fields is retained so they can be reset if an invalid option is subsequently entered.

    Note that the shadow DOM is not used. This ensures the auto-complete (and ) elements can be styled by CSS and accessed by other scripts if necessary.

    Dunkin’

    The HTML5 has limitations but is ideal if you require a simple framework-agnostic auto-complete field. The lack of CSS support is a shame, but browser vendors may eventually address that oversight.

    Any of the code and examples shown in this tutorial can be adopted for your own projects.

    FAQs About Lightweight Autocomplete Controls with the HTML5 Datalist

    What is the HTML5 datalist element and how does it work?

    The HTML5 datalist element is a pre-defined list of options for an input element. It provides an “autocomplete” feature on form elements. The datalist element uses the id attribute to associate it with a specific input element. The input element uses the list attribute to identify the datalist. Inside the datalist, you can define option elements that represent the available options for the input field.

    How can I use the HTML5 datalist for autocomplete?

    To use the HTML5 datalist for autocomplete, you need to associate the datalist with an input field. This is done by adding the list attribute to the input field and setting its value to the id of the datalist. The browser will then suggest autocomplete options based on the user’s input and the defined options in the datalist.

    Can I use the HTML5 datalist element in all browsers?

    The HTML5 datalist element is supported in most modern browsers, including Chrome, Firefox, Safari, and Edge. However, it’s not supported in Internet Explorer 9 and earlier versions. You can check the current browser compatibility on websites like Can I Use.

    How can I style the HTML5 datalist options?

    Unfortunately, the styling options for the HTML5 datalist element are quite limited. The appearance of the dropdown list is controlled by the browser and can’t be easily customized with CSS. However, you can style the input field associated with the datalist.

    Can I use multiple datalists for a single input field?

    No, you can’t associate multiple datalists with a single input field. The list attribute of the input field can only take one id, which corresponds to one datalist. If you need to provide multiple sets of options, you might need to use JavaScript to dynamically change the options based on user input.

    Can I use the HTML5 datalist with other input types?

    Yes, the HTML5 datalist can be used with various input types, including text, search, url, tel, email, date, month, week, time, datetime-local, number, range, and color. However, the autocomplete feature might not work as expected with some input types like range or color.

    Can I use the HTML5 datalist with a select element?

    No, the HTML5 datalist can’t be used with a select element. The datalist is designed to provide autocomplete suggestions for an input field, while the select element provides a dropdown list of options. If you need a dropdown list, you should use the select element instead.

    Can I use JavaScript with the HTML5 datalist?

    Yes, you can use JavaScript with the HTML5 datalist to dynamically add, remove, or change options. However, keep in mind that the datalist doesn’t support events like onchange or onclick on its options. You need to add the event listeners to the associated input field instead.

    Can I use the HTML5 datalist for a search field?

    Yes, the HTML5 datalist can be a great choice for a search field. It can provide autocomplete suggestions based on the user’s input, which can enhance the user experience. However, you need to manually populate the datalist with the possible search terms.

    Can I use the HTML5 datalist with a textarea?

    No, the HTML5 datalist can’t be used with a textarea. The datalist is designed to provide autocomplete suggestions for an input field, not for a textarea. If you need autocomplete functionality for a textarea, you might need to use a JavaScript library or build your own solution.

The above is the detailed content of Lightweight Autocomplete Controls with the HTML5 Datalist. For more information, please follow other related articles on the PHP Chinese website!

Statement
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
This Isn't Supposed to Happen: Troubleshooting the ImpossibleThis Isn't Supposed to Happen: Troubleshooting the ImpossibleMay 15, 2025 am 10:32 AM

What it looks like to troubleshoot one of those impossible issues that turns out to be something totally else you never thought of.

@keyframes vs CSS Transitions: What is the difference?@keyframes vs CSS Transitions: What is the difference?May 14, 2025 am 12:01 AM

@keyframesandCSSTransitionsdifferincomplexity:@keyframesallowsfordetailedanimationsequences,whileCSSTransitionshandlesimplestatechanges.UseCSSTransitionsforhovereffectslikebuttoncolorchanges,and@keyframesforintricateanimationslikerotatingspinners.

Using Pages CMS for Static Site Content ManagementUsing Pages CMS for Static Site Content ManagementMay 13, 2025 am 09:24 AM

I know, I know: there are a ton of content management system options available, and while I've tested several, none have really been the one, y'know? Weird pricing models, difficult customization, some even end up becoming a whole &

The Ultimate Guide to Linking CSS Files in HTMLThe Ultimate Guide to Linking CSS Files in HTMLMay 13, 2025 am 12:02 AM

Linking CSS files to HTML can be achieved by using elements in part of HTML. 1) Use tags to link local CSS files. 2) Multiple CSS files can be implemented by adding multiple tags. 3) External CSS files use absolute URL links, such as. 4) Ensure the correct use of file paths and CSS file loading order, and optimize performance can use CSS preprocessor to merge files.

CSS Flexbox vs Grid: a comprehensive reviewCSS Flexbox vs Grid: a comprehensive reviewMay 12, 2025 am 12:01 AM

Choosing Flexbox or Grid depends on the layout requirements: 1) Flexbox is suitable for one-dimensional layouts, such as navigation bar; 2) Grid is suitable for two-dimensional layouts, such as magazine layouts. The two can be used in the project to improve the layout effect.

How to Include CSS Files: Methods and Best PracticesHow to Include CSS Files: Methods and Best PracticesMay 11, 2025 am 12:02 AM

The best way to include CSS files is to use tags to introduce external CSS files in the HTML part. 1. Use tags to introduce external CSS files, such as. 2. For small adjustments, inline CSS can be used, but should be used with caution. 3. Large projects can use CSS preprocessors such as Sass or Less to import other CSS files through @import. 4. For performance, CSS files should be merged and CDN should be used, and compressed using tools such as CSSNano.

Flexbox vs Grid: should I learn them both?Flexbox vs Grid: should I learn them both?May 10, 2025 am 12:01 AM

Yes,youshouldlearnbothFlexboxandGrid.1)Flexboxisidealforone-dimensional,flexiblelayoutslikenavigationmenus.2)Gridexcelsintwo-dimensional,complexdesignssuchasmagazinelayouts.3)Combiningbothenhanceslayoutflexibilityandresponsiveness,allowingforstructur

Orbital Mechanics (or How I Optimized a CSS Keyframes Animation)Orbital Mechanics (or How I Optimized a CSS Keyframes Animation)May 09, 2025 am 09:57 AM

What does it look like to refactor your own code? John Rhea picks apart an old CSS animation he wrote and walks through the thought process of optimizing it.

See all articles

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 Article

Roblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusion System, Explained
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers Of The Witch Tree - How To Unlock The Grappling Hook
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Clair Obscur: Expedition 33 - How To Get Perfect Chroma Catalysts
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft