Skip to main content

Form Validation [Advanced]

This template explains how to show an advanced form summary validation on submit, this hightens the accessibility of the form enormously. empty.

Hint: Press F on your keyboard to view both templates and components in fullscreen and ESC to exit the fullscreen mode. You can also open the template in a new browser window.

Open in new window
<!DOCTYPE html>
<html class="duet-bg-gradient duet-sticky-footer" lang="fi">
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<link rel="stylesheet" href="" integrity="sha384-5JYmtSD7nykpUvSmTW1CHMoBDkBZUpUmG0vuh+NUVtZag3F75Kr7+/JU3J7JV6Wq" crossorigin="anonymous" />
<link rel="stylesheet" href="" integrity="sha384-KeNjzo6R8WFjZWEYZd3aL0ECLsFelze+7ljixu7EdJYrz927Cx0dgDgeARmxtRWe" crossorigin="anonymous" />
<link rel="stylesheet" href="" integrity="sha384-TUOKkdeQ1gfQwKnPF3pNHJPj3+1XXTAyZnoiUP1UlBCTVYZJWNU9RI+82mComnXj" crossorigin="anonymous" />
<script type="module" src="" integrity="sha384-XNgC8GhyXZ75uSGSN/NM8jvyOtPrfyFTlO8VBDfSpPgw296goUAZzAKKrgbOdk0u" crossorigin="anonymous"></script>
<script nomodule src="" integrity="sha384-TFMkho2BQ9Nnp2L9s/rhHw/6HiCqI1DW2I28mgqETM24PH2Kt2tkYCCtjFd71eDU" crossorigin="anonymous"></script>
display: none;
<duet-header language="fi"></duet-header>
<duet-layout center>
<div slot="main">
<duet-card padding="large">
<duet-spacer breakpoint="x-small" size="medium"></duet-spacer>
<form id="form" action="#" novalidate>
<duet-heading level="h1" visual-level="h2">Ota yhteyttä</duet-heading>
Lähetä meille viesti kun haluat antaa palautetta tai pyytää yhteydenottoa. Jos olet jo asiakkaamme, asiasi
hoituu parhaiten, kun kirjaudut verkkopalveluun.
<duet-spacer size="medium"></duet-spacer>
<duet-input label="Nimi" name="name" placeholder="Matti Meikäläinen" expand required> </duet-input>
<duet-input label="Sähköposti" name="email" type="email" placeholder="" required expand>
label="Viesti asiakaspalveluun"
placeholder="Kirjoita tähän"
tooltip="Hello, I’m a tooltip! To close me, you can click outside of
the tooltip, hit ESC key or click the X button."



<duet-alert variation="danger" announcements="true" class="duet-form-validation duet-form-validation--hidden">

<duet-spacer size="x-large"></duet-spacer>
<duet-button submit variation="primary">Lähetä viesti</duet-button>
<duet-footer logo-href="#" language="fi"></duet-footer>
// Show back link in the header component
var header = document.querySelector("duet-header")
header.back = {
label: "Takaisin",
href: "/"

// Show data in the footer component
var footer = document.querySelector("duet-footer")
footer.items = [
{ label: 'Hae korvausta', href: '#', icon: 'navigation-make-claim' },
{ label: 'Osta vakuutus', href: '#', icon: 'action-buy-insurance' },
{ label: 'Yhteystiedot', href: '#', icon: 'form-tel' }
] = [
{ label: 'Turvallisuus ja käyttöehdot', href: '#' },
{ label: 'Evästeet', href: '#' },
{ label: 'Henkilötietojen käsittely', href: '#' },

// Prevent normal submission of the form
var form = document.querySelector("#form")
form.addEventListener("submit", function(event) {
}, false)

var alert = document.querySelector(".duet-form-validation")

//get items with errors
function testForErrors(){
var errors = []
var form = document.querySelector("#form")
var inputs = form.querySelectorAll("duet-input, duet-select, duet-textarea, duet-radio-group")
for(var i = 0; i < inputs.length; i++){
return errors

// When the submit button is clicked do fake validation for demo purposes
var submit = document.querySelector("duet-button")
submit.addEventListener("click", function(e) {

// Show error in the first input, announce it to the screen reader,
// and finally set focus on this first input so that user can fix the error.
var errorMsg = "Virhe: Tämä kenttä on pakollinen"
var input = document.querySelector("duet-input")
input.error = errorMsg

// Show additional errors in different type of components for demo
var email = document.querySelectorAll("duet-input")[1]
email.error = errorMsg

// Finally, for demo purposes, let’s add change listeners for the
// form fields that remove the error when something is inputted
input.addEventListener("duetChange", function() {
input.error = ""
}, false)
email.addEventListener("duetChange", function() {
email.error = ""
}, false)

// this is a really simple implementation of a summary error handler
// you should internationalize this in real useage and add additional error information to it - the key part is that a user should get a summary
// and a capability to "jump" to the field that has an error.

var itemsWithErrors = testForErrors()
alert.innerHTML = ""
itemsWithErrors.forEach((item, index)=>{
var node = document.createElement("span")
var link = document.createElement("duet-link")
link.setAttribute("identifier", || "")
link.setAttribute("url", `#${ || ""}`)
node.innerHTML = `${index+1}: `
link.innerHTML = `the field "${}" has an error</br>`
node.addEventListener("click", (event)=>{

}, false)


To install this template’s dependencies into your project, run:

npm install @duetds/components
npm install @duetds/css
npm install @duetds/fonts

For further guidelines, please see each package’s documentation.


Follow these practical tutorials to learn how to build simple page layouts using Duet’s CSS Framework, Web Components and other features:


Building Layouts


Using CLI Tools


Creating Custom Patterns


Server Side Rendering


Sharing Prototypes


Usage With Markdown


If you experience any issues while using a template, please head over to the Support page for more guidelines and help.