Naar de inhoud
Gratis naslagwerk over HTML
HTML leren en naslaan
Naslag / Formulieren

Het element <input type="week">

<input>-elementen van het type week creëren invoervelden die eenvoudige invoer mogelijk maken van een jaar plus het ISO 8601-weeknummer tijdens dat jaar (dat wil zeggen week 1 tot 52 of 53).

Code
<label for="camp-week">Choose a week in May or June:</label>

<input
  type="week"
  name="week"
  id="camp-week"
  min="2018-W18"
  max="2018-W26"
  required />
Resultaat in de browser

Waarde

Een tekenreeks die de waarde van de week/het jaar vertegenwoordigt die in de invoer is ingevoerd. Het formaat van de datum-en-tijdwaarde die door dit invoertype wordt gebruikt, wordt beschreven in Weektekenreeksen.

U kunt een standaardwaarde voor de invoer instellen door een waarde op te nemen binnen het value-attribuut, zoals hier:

HTML
<label for="week">What week would you like to start?</label>
<input id="week" type="week" name="week" value="2017-W01" />
Resultaat in de browser

Eén ding om op te merken is dat het weergegeven formaat kan afwijken van de eigenlijke value, die altijd wordt geformatteerd als yyyy-Www. Wanneer de bovenstaande waarde naar de server wordt verzonden, tonen browsers deze bijvoorbeeld mogelijk als Week 01, 2017, maar de verzonden waarde ziet er altijd uit als week=2017-W01.

U kunt de waarde ook ophalen en instellen in JavaScript met behulp van de value-eigenschap van het invoerelement, bijvoorbeeld:

JS
const weekControl = document.querySelector('input[type="week"]');
weekControl.value = "2017-W45";

Aanvullende attributen

Naast de attributen die gemeenschappelijk zijn voor <input>-elementen, bieden weekinvoervelden de volgende attributen.

max

Het laatste (in de tijd) jaar en weeknummer, in het tekenreeksformaat dat hierboven wordt besproken in de sectie Waarde, dat wordt geaccepteerd. Als de value die in het element is ingevoerd, dit overschrijdt, faalt het element bij beperkingsvalidatie. Als de waarde van het max-attribuut geen geldige weektekenreeks is, heeft het element geen maximumwaarde.

Deze waarde moet groter zijn dan of gelijk zijn aan het jaar en de week die zijn opgegeven door het min-attribuut.

min

Het vroegste jaar en de vroegste week die wordt geaccepteerd. Als de value van het element hier lager dan is, faalt het element bij beperkingsvalidatie. Als een waarde wordt opgegeven voor min die geen geldige weektekenreeks is, heeft de invoer geen minimumwaarde.

Deze waarde moet kleiner zijn dan of gelijk zijn aan de waarde van het max-attribuut.

readonly

Een Booleaans attribuut dat, indien aanwezig, betekent dat dit veld niet door de gebruiker kan worden bewerkt. De value ervan kan echter nog steeds worden gewijzigd door JavaScript-code die de value-eigenschap van HTMLInputElement direct instelt.

Opmerking

Omdat een alleen-lezen veld geen waarde kan hebben, heeft required geen enkel effect op invoervelden waarop ook het readonly-attribuut is opgegeven.

step

Het step-attribuut is een getal dat de granulariteit specificeert waaraan de waarde moet voldoen, of de speciale waarde any, die hieronder wordt beschreven. Alleen waarden die een heel aantal stappen van de stapbasis verwijderd zijn, zijn geldig. De stapbasis is min indien opgegeven, anders value, of −259.200.000 (het begin van week 1970-W01) als geen van beide is opgegeven.

Voor week-invoervelden wordt de waarde van step opgegeven in weken en wordt behandeld als een aantal milliseconden gelijk aan 604.800.000 maal de step-waarde (de onderliggende numerieke waarde is in milliseconden). De standaardwaarde is 1, wat 1 week aangeeft.

Een tekenreekswaarde van any betekent dat er geen stappengrootte wordt geïmpliceerd, en elke waarde is toegestaan (behoudens andere beperkingen, zoals min en max). In werkelijkheid heeft dit hetzelfde effect als 1 voor week-invoervelden, omdat de picker-UI alleen het selecteren van hele weken toestaat.

Opmerking

Wanneer de door de gebruiker ingevoerde gegevens niet voldoen aan de stappengrootte-configuratie, kan de user agent afronden naar de dichtstbijzijnde geldige waarde, waarbij bij twee even dichtbij gelegen opties de voorkeur wordt gegeven aan getallen in positieve richting.

Weekinvoervelden gebruiken

Weekinvoervelden lijken op het eerste gezicht handig, omdat ze een eenvoudige gebruikersinterface bieden voor het kiezen van weken en het naar de server verzonden gegevensformaat standaardiseren, ongeacht de browser of landinstelling van de gebruiker. Er zijn echter problemen met <input type="week"> omdat browserondersteuning niet in alle browsers is gegarandeerd.

We bekijken eerst basaal en vervolgens complexer gebruik van <input type="week">, en geven later advies over het beperken van het browserondersteuningsprobleem (zie Omgaan met browserondersteuning).

Basisgebruik van week

Het meest eenvoudige gebruik van <input type="week"> omvat een basale combinatie van <input> en het <label>-element, zoals hieronder te zien is:

HTML
<form>
  <label for="week">What week would you like to start?</label>
  <input id="week" type="week" name="week" />
</form>
Resultaat in de browser

De invoergrootte regelen

<input type="week"> ondersteunt geen formuliergrootte-attributen zoals size. U zult voor uw groottebehoeften uw toevlucht moeten nemen tot CSS.

Het step-attribuut gebruiken

U zou het step-attribuut moeten kunnen gebruiken om het aantal weken te variëren dat wordt gesprongen wanneer de waarde wordt verhoogd of verlaagd, maar dit lijkt echter geen enkel effect te hebben op ondersteunende browsers.

Validatie

Standaard past <input type="week"> geen enkele validatie toe op ingevoerde waarden. De UI-implementaties laten u over het algemeen niets specificeren dat geen geldige week/jaar is, wat handig is, maar het is nog steeds mogelijk om te verzenden met een leeg veld, en u wilt mogelijk het bereik van kiesbare weken beperken.

Maximum- en minimumweken instellen

U kunt de min- en max-attributen gebruiken om de geldige weken te beperken die door de gebruiker kunnen worden gekozen. In het volgende voorbeeld stellen we een minimumwaarde van Week 01, 2017 en een maximumwaarde van Week 52, 2017 in:

HTML
<form>
  <label for="week">What week would you like to start?</label>
  <input id="week" type="week" name="week" min="2017-W01" max="2017-W52" />
  <span class="validity"></span>
</form>
Resultaat in de browser

Hier is de CSS die in het bovenstaande voorbeeld wordt gebruikt. Hier maken we gebruik van de CSS-eigenschappen :valid en :invalid om de invoer te stylen op basis van of de huidige waarde geldig is. We moesten de pictogrammen op een <span> naast de invoer plaatsen, niet op de invoer zelf, omdat in Chrome de gegenereerde inhoud binnen de formuliercontrole wordt geplaatst en niet effectief kan worden gestyled of getoond.

CSS
div {
  margin-bottom: 10px;
  position: relative;
}

input[type="number"] {
  width: 100px;
}

input + span {
  padding-right: 30px;
}

input:invalid + span::after {
  position: absolute;
  content: "✖";
  padding-left: 5px;
}

input:valid + span::after {
  position: absolute;
  content: "✓";
  padding-left: 5px;
}

Het resultaat hiervan is dat alleen weken tussen W01 en W52 in 2017 als geldig worden beschouwd en selecteerbaar zijn in ondersteunende browsers.

Weekwaarden verplicht maken

Daarnaast kunt u het required-attribuut gebruiken om het invullen van de week verplicht te maken. Als gevolg daarvan tonen ondersteunende browsers een foutmelding als u probeert een leeg weekveld te verzenden.

Laten we een voorbeeld bekijken; hier hebben we minimum- en maximumweken ingesteld, en het veld ook verplicht gemaakt:

HTML
<form>
  <div>
    <label for="week">What week would you like to start?</label>
    <input
      id="week"
      type="week"
      name="week"
      min="2017-W01"
      max="2017-W52"
      required />
    <span class="validity"></span>
  </div>
  <div>
    <input type="submit" value="Submit form" />
  </div>
</form>

Als u probeert het formulier te verzenden zonder een waarde, toont de browser een foutmelding. Probeer nu met het voorbeeld te spelen:

Resultaat in de browser

Hier is een screenshot voor degenen onder u die geen ondersteunende browser gebruiken:

The week form control has two dashes where the week number should be. A popup with a yellow warning symbol and a 'Please fill out this field' is emanating from the two dashes, which are highlighted in blue, the same blue as the input's focus ring.

Let op

HTML-formuliervalidatie is geen vervanging voor scripts die ervoor zorgen dat de ingevoerde gegevens in het juiste formaat staan. Het is veel te eenvoudig voor iemand om aanpassingen aan de HTML aan te brengen waarmee de validatie kan worden omzeild, of om deze volledig te verwijderen. Het is ook mogelijk dat iemand uw HTML volledig omzeilt en de gegevens rechtstreeks naar uw server verzendt. Als uw server-side code de ontvangen gegevens niet valideert, kan er een ramp gebeuren wanneer onjuist geformatteerde gegevens worden ingediend (of gegevens die te groot zijn, van het verkeerde type, enzovoort).

Omgaan met browserondersteuning

Zoals hierboven vermeld, is het grote probleem bij het gebruik van weekinvoervelden op dit moment de browserondersteuning: Safari en Firefox ondersteunen dit niet op desktop, en oude versies van IE ondersteunen dit ook niet.

Mobiele platforms zoals Android en iOS maken uitstekend gebruik van dit soort invoertypes, en bieden gespecialiseerde UI-controls die het echt eenvoudig maken om waarden te selecteren in een touchscreenomgeving. De week-picker op Chrome voor Android ziet er bijvoorbeeld zo uit:

A modal popup. The header reads 'set week'. There are two columns: the left has 36 in the middle at full opacity, with 35 above it and 37 below being semi-opaque. On the right side, 2017 is fully opaque. There are no other options. Three text links or buttons on the bottom include 'clear' on the 'left' and 'cancel' and 'set' on the right.

Niet-ondersteunende browsers vallen gracieus terug op een tekstinvoerveld, maar dit veroorzaakt problemen zowel op het gebied van de consistentie van de gebruikersinterface (de weergegeven control zal anders zijn), als op het gebied van gegevensverwerking.

Het tweede probleem is het meest ernstige. Zoals eerder vermeld, wordt bij een week-invoerveld de eigenlijke waarde altijd genormaliseerd naar het formaat yyyy-Www. Wanneer de browser terugvalt op een generiek tekstinvoerveld, is er niets om de gebruiker te begeleiden bij het correct formatteren van de invoer (en het is zeker niet intuïtief). Er zijn meerdere manieren waarop mensen weekwaarden zouden kunnen schrijven; bijvoorbeeld:

  • Week 1 2017
  • Jan 2-8 2017
  • 2017-W01
  • enz.

De beste manier om op dit moment cross-browser met weken/jaren in formulieren om te gaan, is door de gebruiker het weeknummer en jaar in aparte controls te laten invoeren (<select>-elementen zijn hiervoor populair; zie hieronder voor een voorbeeld), of door JavaScript-bibliotheken zoals de jQuery date picker te gebruiken.

Voorbeelden

In dit voorbeeld creëren we twee sets UI-elementen voor het kiezen van weken: een native picker gemaakt met <input type="week">, en een set van twee <select>-elementen voor het kiezen van weken/jaren in oudere browsers die het week-invoertype niet ondersteunen.

De HTML ziet er als volgt uit:

HTML
<form>
  <div class="nativeWeekPicker">
    <label for="week">What week would you like to start?</label>
    <input
      id="week"
      type="week"
      name="week"
      min="2017-W01"
      max="2018-W52"
      required />
    <span class="validity"></span>
  </div>
  <p class="fallbackLabel">What week would you like to start?</p>
  <div class="fallbackWeekPicker">
    <div>
      <span>
        <label for="week">Week:</label>
        <select id="fallbackWeek" name="week"></select>
      </span>
      <span>
        <label for="year">Year:</label>
        <select id="year" name="year">
          <option value="2017" selected>2017</option>
          <option value="2018">2018</option>
        </select>
      </span>
    </div>
  </div>
</form>

De weekwaarden worden dynamisch gegenereerd door de onderstaande JavaScript-code.

CSS
div {
  margin-bottom: 10px;
  position: relative;
}

input[type="number"] {
  width: 100px;
}

input + span {
  padding-right: 30px;
}

input:invalid + span::after {
  position: absolute;
  content: "✖";
  padding-left: 5px;
}

input:valid + span::after {
  position: absolute;
  content: "✓";
  padding-left: 5px;
}

Het andere deel van de code dat interessant kan zijn, is de feature-detectiecode. Om te detecteren of de browser <input type="week"> ondersteunt, maken we een nieuw <input>-element, proberen we het type ervan in te stellen op week, en controleren we vervolgens direct wat het type ervan is ingesteld. Niet-ondersteunende browsers geven text terug, omdat het week-type terugvalt op het type text. Als <input type="week"> niet wordt ondersteund, verbergen we de native picker en tonen we in plaats daarvan de fallback picker-UI (<select>s).

JS
// Get UI elements
const nativePicker = document.querySelector(".nativeWeekPicker");
const fallbackPicker = document.querySelector(".fallbackWeekPicker");
const fallbackLabel = document.querySelector(".fallbackLabel");

const yearSelect = document.querySelector("#year");
const weekSelect = document.querySelector("#fallbackWeek");

// Hide fallback initially
fallbackPicker.style.display = "none";
fallbackLabel.style.display = "none";

// Test whether a new date input falls back to a text input or not
const test = document.createElement("input");

try {
  test.type = "week";
} catch (e) {
  console.log(e.description);
}

// If it does, run the code inside the if () {} block
if (test.type === "text") {
  // Hide the native picker and show the fallback
  nativePicker.style.display = "none";
  fallbackPicker.style.display = "block";
  fallbackLabel.style.display = "block";

  // populate the weeks dynamically
  populateWeeks();
}

function populateWeeks() {
  // Populate the week select with 52 weeks
  for (let i = 1; i <= 52; i++) {
    const option = document.createElement("option");
    option.textContent = i < 10 ? `0${i}` : i;
    weekSelect.appendChild(option);
  }
}
Opmerking

Vergeet niet dat sommige jaren 53 weken hebben (zie Weken per jaar)! U moet hier rekening mee houden bij het ontwikkelen van productie-apps.

Technische samenvatting

Waarde Een tekenreeks die een week en jaar vertegenwoordigt, of leeg
Gebeurtenissen change en input
Ondersteunde gemeenschappelijke attributen autocomplete, list, readonly, step
IDL-attributen list, value, valueAsDate, valueAsNumber
DOM-interface

HTMLInputElement

Impliciete ARIA-rol geen bijbehorende rol

Zie ook

Verwante elementen