formulaires html5 avec polyfills - est-il utile?
malgré tout le buzz autour des formulaires html5, il me semble que vous créez du travail supplémentaire, dans la plupart des scénarios, en empruntant cette voie.
Prenez, par exemple, un champ de curseur de données. L'implémentation native html5 de ceci rend différemment dans chaque navigateur. En outre, votre solution polyfilled (jQuery UI par exemple), pour un navigateur ne supportant pas cette fonctionnalité, affichera également différemment.
maintenant, nous avons introduit plusieurs points de personnalisation et maintenance pour la même forme, lorsque nous avions une solution parfaitement fonctionnelle et unifiée avec jquery!
j'adorerais entendre parler de certaines expériences réelles dans ce domaine, parce que je suis fâché avec tout le buzz!
3 réponses
tout d'Abord, je suis le créateur de webshims lib (un de ces polyfills, qui n'est plus entretenu). Pour répondre à ta question:
est-ce que cela vaut la peine de créer un formulaire polyfill pour un projet?
Non, c'est vraiment difficile de faire ça juste pour un projet. Eh bien, je l'ai fait, tout simplement parce que je veux utiliser les technologies modernes.
est-ce que cela vaut la peine d'utiliser un formulaire polyfill comme webshims lib pour un projet?
Oui, absolument! Et voici pourquoi:
1. Nice standardised declarative Markup API
Après, y compris webshims et le script suivant:
//polyfill forms (constraint validation) and forms-ext (date, range etc.)
$.webshims.polyfill('forms forms-ext');
Vous pouvez simplement écrire vos widgets et vos contraintes dans votre formulaire:
<input type="date" />
<input type="date" min="2012-10-11" max="2111-01-01" />
<input type="range" disabled />
<input type="email" required placeholder="Yo you can use a placeholder" />
cela créera 3 widgets différents et chacun est configuré différemment. Aucun JS supplémentaire nécessaire juste standardisé, propre et lean code.
2. DOM-API standardisé
idem pour L'API DOM. Voici deux exemples: Combinaison de deux champs de date et combinaison d'un champ avec un champ de date.
3. fonctionne sans JS dans les navigateurs modernes
Dégrade gracieusement dans les vieux navigateurs et fonctionne bien dans les modernes.
4. Moins de taille de fichier dans les navigateurs modernes
Particulièrement bon pour mobile (iOS 5, Blackberry n'a pas de support pour la date par exemple)
5. Meilleur UX [la plupart du temps mobile]
meilleur UX mobile (meilleur UI input pour toucher, meilleure performance, s'adapte au système), Si vous l'utilisez: type= "email", type= "number" et type= "date" / type="range"
mais quand même, qu'en est-il de la personnalisabilité?
je suis développeur dans une plus grande agence et vous avez absolument raison la plupart des clients et la plupart des designers ne toléreront pas beaucoup de différences, mais je veux toujours utiliser les technologies modernes, ce qui signifie webshims lib peut vous donner le meilleur des deux mondes.
personnaliser la validation de la contrainte
la partie polyfilling
//polyfill constraint validation
$.webshims.polyfill('forms');
personnalisation de L'interface utilisateur pour la bulle d'erreur:
//on DOM-ready
$(function(){
$('form').bind('firstinvalid', function(e){
//show the invalid alert for first invalid element
$.webshims.validityAlert.showFor( e.target );
//prevent browser from showing native validation message
return false;
});
});
génère le balisage suivant:
<!-- the JS code above will generate the following custom styleable HTML markup for the validation alert -->
<span class="validity-alert-wrapper" role="alert">
<span class="validity-alert">
<span class="va-arrow"><span class="va-arrow-box"></span></span>
<span class="va-box">Error message of the current field</span>
</span>
</span>
personnaliser le style d'un champ de formulaire invalide/valide:
.form-ui-invalid {
border-color: red;
}
.form-ui-valid {
border-color: green;
}
personnaliser le texte de la validité alerte:
<input required data-errormessage="Hey this is required!!!" />
Et maintenant, quel est le point:
- fonctionne toujours sans JS
- les navigateurs modernes ne chargent que le code de personnalisation (3KB min/gzippé) et les vieux navigateurs chargent l'API supplémentaire (environ 13kb min/gzip) (les formulaires comprennent beaucoup plus que la seule API de validation des contraintes, par exemple il y a aussi autofocus, placeholder, output et ainsi de suite)
et ce qui est avec votre exemple spécial, personnaliser le datefield?
Pas de problème:
//configure webshims to use customizable widget UI in all browsers
$.webshims.setOptions('forms-ext', {
replaceUI: true
});
$.webshims.polyfill('forms forms-ext');
Et ici:
- fonctionne toujours sans JS dans les navigateurs modernes
- les navigateurs modernes ne chargent que L'UI et la colle D'API-UI, mais pas L'API DOM-API (valueAsNumber, valueAsDate...)
Et maintenant, voici la meilleure:
//configure webshims to use customizable widget UI in all non mobile browsers, but a customizable one in all desktop and all non-capable mobile browsers
$.webshims.setOptions('forms-ext', {
//oh, I know this is bad browser sniffing :-(
replaceUI: !(/mobile|ipad|iphone|fennec|android/i.test(navigator.userAgent))
});
$.webshims.polyfill('forms forms-ext');
- moins de taille de fichier et un meilleur UX pour les navigateurs mobiles (la plupart des clients et la plupart des concepteurs vous aimeront pour avoir une interface utilisateur différente dans mobile!!!)
- fonctionne toujours sans JS dans les navigateurs modernes
- les navigateurs modernes ne chargent que L'UI et la colle D'API-UI, mais pas L'API DOM-API (valueAsNumber, valueAsDate...)
à l'appui de la réponse D'Alexander sur le webshims, j'ai fait des recherches considérables sur le comportement des entrées HTML5 en travers du navigateur du point de vue UX, UI et front-end. Ma conclusion est que la seule façon d'avoir un comportement préféré à travers les appareils et les navigateurs est d'utiliser un polyfill comme webshims. Une grande partie de cela a à voir avec le fait de ne pas être en mesure d'utiliser les fonctionnalités natives sur des appareils comme les rouleaux de canon pour les dates et les claviers numériques pour les nombres sans avoir également un moyen de soutenir le bureau les navigateurs qui n'implémentent pas ces fonctionnalités.
Voici une analyse du comportement d'une entrée date sur différentes implémentations natives par rapport aux plugins populaires:
Date d'entrée de l'analyse - feuille de calcul Google
(Vous pouvez voir comment webshims obtient le meilleur de toutes les implémentations)
Voici une analyse de la façon dont les types d'entrées du monde réel se comportent dans les navigateurs courants nativement et avec un repli webshim:
analyse des UX Entrées HTML5 avec la retombée de webshim-feuille de calcul Google
Voici la page de démonstration utilisée pour analyser ces entrées:
HTML5 entrées de la page de démo - CodePen
j'étais sceptique aussi, s'il vaut vraiment la peine d'aller à travers la couche de polyfill au lieu d'utiliser jQuery UI droite. Après avoir utilisé webshims lib et HTML5, j'ai pu voir immédiatement qu'il y avait beaucoup moins de code javascript. Plus besoin de plugin de validation. Merci Alexander pour la création et le soutien de ce merveilleux polyfill, webshims lib. Voici un exemple pour faire un appel ajax dans le présenter sur un formulaire.
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.9.1.js" type="text/javascript"></script>
<script src="http://code.jquery.com/ui/1.10.1/jquery-ui.js" type="text/javascript"></script>
<script>
// set options for html5shiv
if(!window.html5){
window.html5 = {};
}
window.html5.shivMethods = false;
</script>
<script src="webshims/js-webshim/minified/extras/modernizr-custom.js"></script>
<script src="webshims/js-webshim/minified/polyfiller.js"></script>
<script class="example">
$.webshims.setOptions({
//we do not use any DOM-/JS-APIs on DOM-ready, so we do not need to delay the ready event <- good against fouc
waitReady: false
});
//load all polyfill features
$.webshims.polyfill('forms forms-ext');
</script>
<script type="text/javascript">
$(function(){
var frm = $('#tstForm');
frm.submit(function () {
var someDate=$('#someDate').val();
alert('someDate:'+someDate);
// you can make your ajax call here.
return false;
});
});
</script>
</head>
<body>
<form id="tstForm">
Some Date:<input id="someDate" name="someDate" type="date" min="2013-01-01" max="2013-06-01" ></input>
Full Name:<input id="fullName" name="fullName" type="text" required></input>
Age:<input id="age" name="age" type="number" required min="18" max="120"></input>
<input type="submit" value="Submit"/>
</form>
</body>
</html>