Progressiv verbesserte HTML5 Formulare

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Dies ist meiner Meinung nach der derzeit beste Weg, Formulare progressiv zu verbessern. Das heißt, HTML5-Funktionen nutzen, wenn sie verfügbar sind, und auf JavaScript-Alternativen zurückgreifen, wenn sie es nicht sind.

Laden Sie Yepnope.js

<script src="scripts/yepnope.js"></script>

Yepnope ist ein "Skript-Loader", der Skripte *bedingt* lädt. Sie geben ihm einen booleschen Wert (true oder false), wenn er true ist, lädt er eine Reihe von Skripten (oder CSS), wenn er false ist, eine andere Reihe. Woher bekommen wir diesen booleschen Wert? Indem wir ein Feature testen mit...

Laden Sie Modernizr

<script src="scripts/modernizr.js"></script>

Modernizr gibt Ihnen die Möglichkeit, HTML5 und CSS3¹-Features zu testen. Zum Beispiel ist mit geladenem Modernizr Modernizr.inputtypes.date true, wenn Sie sich in einem Browser befinden, der Eingaben mit dem Typ "date" unterstützt (nur Opera, ab Version 9) und false, wenn Sie sich in einem Browser befinden, der den "date"-Typ nicht unterstützt.

Noch besser: Sie können einen benutzerdefinierten Build von Modernizr mit nur den benötigten Tests (Eingabetypen und Eingabeattribute) erhalten, wobei Yepnope ebenfalls integriert ist, im Modernizr 2 Beta Builder.

Kombinieren Sie die beiden

Mit beiden großartigen Werkzeugen einsatzbereit können wir ihre Kräfte vereinen.

yepnope({
  test : Modernizr.inputtypes.date,
  nope : [
      // load scripts to simulate date type
  ]
});

Wir brauchen in diesem Fall kein "yep", denn "yep" bedeutet, der Browser unterstützt es, also brauchen wir keine Hilfe.

Was brauchen wir als Fallback?

Da wir bisher das HTML5-Eingabetyp "date" als Beispiel verwendet haben, denken wir über einen Fallback dafür nach. jQuery UI hat einen *ziemlich guten Datepicker*. jQuery wird uns wahrscheinlich helfen, viele Fallback-Probleme zu lösen, daher ist das eine solide Wahl. Um den Datums-Fallback zu realisieren, benötigen wir vier Ressourcen:

  1. jQuery
  2. jQuery UI
  3. jQuery UI's CSS
  4. Unser eigenes Skript, das den Datepicker aufruft

Laden Sie sie hoch

Mit unserer Yepnope/Modernizr-Kombination sieht diese lange Liste so aus:

yepnope({
  test : Modernizr.inputtypes && Modernizr.inputtypes.date,
  nope : [
	'scripts/jquery.js', 
	'scripts/jquery-ui.js',
	'css/jquery-ui.css',
	'scripts/datepicker.js'
  ]
});

Unser benutzerdefiniertes Skript (geladen *zuletzt*, dank Yepnope) ist wahrscheinlich so einfach wie das Aufrufen der Datepicker-Funktion, sobald wie möglich.

// DOM ready function because we should probably
// be doing this in the <head>
$(function() {
	$("input[type='date']").datepicker();
});

Und jetzt bekommen wir

Opera 11

Native Unterstützung, keine zusätzlichen Skripte geladen.

Firefox 4

Keine native Unterstützung, jQuery UI Datepicker verwendet.

Mach weiter so

Der "date"-Typ-Support ist nicht das Einzige, was wir hier tun können. Nehmen wir an, wir wollen auch den "placeholder" verwenden. Rock'n'Roll, verwenden Sie einfach einen weiteren Yepnope-Test.

yepnope({
  test : Modernizr.input.placeholder,
  nope : [
	'scripts/jquery.js', 
	'scripts/placeholder.js'
  ]
});

Beachten Sie, dass wir wieder jQuery verwenden und somit die jQuery-Bibliothek angeben. Nehmen wir an, wir befinden uns in einem Browser, der *weder* "date" noch "placeholder" unterstützt, und wir planen, jQuery für *beide* Fallbacks zu verwenden. Um dies am besten zu tun, fassen wir die Tests, die jQuery benötigen, in einem eigenen Yepnope-Block zusammen, damit wir jQuery nicht mehr als einmal laden.

yepnope([
  {
    test:  Modernizr.input.placeholder || (Modernizr.inputtypes && Modernizr.inputtypes.date),
    nope: 'jquery.js'
  },
  {
    test : Modernizr.inputtypes && Modernizr.inputtypes.date,
    nope : [
	'scripts/jquery-ui.js',
	'css/jquery-ui.css',
	'scripts/datepicker.js'
  ]},
  {
    test : Modernizr.input.placeholder,
    nope : 'scripts/placeholder.js'
  }
]);

Cooler als Polyfills

Polyfills sind im selben Geiste. Sie testen auf Feature-Unterstützung und verwenden native Technologie, wenn möglich, ansonsten "faken" sie es irgendwie. Sie sind großartig. Dies unterscheidet sich von Polyfills, da wir das Testen nicht selbst durchführen müssen, das haben wir bereits mit Modernizr erledigt. Daher können die Skripte, die wir laden, einfach davon ausgehen, dass keine Unterstützung vorhanden ist und von dort aus weitermachen. Ich denke, dies könnte besser sein als Polyfilling, weil:

  1. Wir laden zunächst nur zwei Skripte. Wenn ein Browser super modern ist, ist das alles, was er jemals laden wird. Mit Polyfill-Skripten laden Sie eines für jedes Feature.
  2. Wir lagern die Feature-Erkennung an Modernizr aus, ein Projekt, das sich ganz der optimalen Durchführung widmet. Polyfill-Skripte werden in dieser Hinsicht möglicherweise nicht so gut gepflegt.

Oder...

Ich habe sie nicht viel ausprobiert, aber es gibt ein paar Projekte, die darauf abzielen, jedes einzelne HTML5-Formular-Feature als Polyfill bereitzustellen. Eines davon ist webforms2. Ich mag die Kontrolle, die Feature-Tests und Fallbacks selbst durchzuführen, aber es gibt sicherlich Reiz an einem "Set-it-and-forget-it"-Ansatz.

 


¹ Modernizr testet auf andere schicke Web-Dinge, die technisch nicht HTML5 oder CSS3 sind, aber typischerweise damit gruppiert werden, wie @font-face.