Maison >interface Web >tutoriel CSS >Contrôles de saisie semi-automatique avec le datalist HTML5

Contrôles de saisie semi-automatique avec le datalist HTML5

Jennifer Aniston
Jennifer Anistonoriginal
2025-02-10 15:18:08880parcourir

Contrôles de saisie semi-automatique avec le datalist HTML5

Dans ce tutoriel, nous allons prendre une plongée profonde dans l'élément HTML5 à petit utilisé. Il peut implémenter un contrôle de formulaire léger, accessible et transversal, qui ne nécessite pas JavaScript.

Les plats clés

  • L'élément HTML5 `` offre une solution légère, accessible et croisée pour les commandes de formulaires de saisie automatique sans compter sur JavaScript.
  • Contrairement à `
  • La prise en charge du navigateur pour `` est robuste dans les navigateurs modernes, y compris Internet Explorer 10 et 11, avec des options de repli disponibles pour les navigateurs plus anciens en utilisant une combinaison de `
  • L'élément `` ne peut pas être stylisé directement avec CSS, ce qui limite la personnalisation mais assure la cohérence entre différents navigateurs et plateformes.
  • Les améliorations telles que l'AJAX peuvent être intégrées à `` pour remplir dynamiquement des options en fonction de l'entrée de l'utilisateur, l'amélioration des fonctionnalités et l'expérience utilisateur dans les applications nécessitant des commentaires de données en temps réel.

Quel est le problème avec ?

HTML5 Les contrôles sont idéaux lorsque vous souhaitez que l'utilisateur choisisse parmi une petite gamme d'options. Ils sont moins pratiques quand:

  • Il existe de nombreuses options, telles que les pays ou les titres d'emploi
  • L'utilisateur souhaite entrer sa propre option qui n'est pas sur la liste

La solution évidente est un contrôle de la saisie semi-automatique. Cela permet à l'utilisateur de saisir quelques caractères, ce qui limite les options disponibles pour une sélection plus rapide.

va sauter au bon emplacement lorsque vous commencez à taper, mais ce n'est pas toujours évident. Il ne fonctionnera pas sur tous les appareils (tels que les écrans tactiles), et il se réinitialise dans un deuxième ou deux.

Les développeurs se tournent souvent vers l'une des nombreuses solutions alimentées par JavaScript, mais un contrôle de saisie semi-automatique personnalisé n'est pas toujours nécessaire. L'élément HTML5 est léger, accessible et n'a pas de dépendances JavaScript. Vous avez peut-être entendu que son buggy ou son manque de soutien. Ce n'est pas vrai en 2021, mais il y a des incohérences et des mises en garde.

start rapide

Choisir votre pays dans une liste contenant plus de 200 options est un candidat idéal pour un contrôle de la saisie semi-automatique. Définissez un avec des éléments de

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

L'ID du DATAALIST peut ensuite être référencé par un attribut de liste dans n'importe quel champ :

<span><span><span><label</span> for<span>="country"</span>></span>country<span><span></label</span>></span>
</span>
<span><span><span><input</span> 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>

Confusetment, il est préférable de définir AutoChandPlelet = "OFF". Cela garantit que l'utilisateur est montré des valeurs dans le mais pas des valeurs qu'ils ont précédemment entrées dans le navigateur.

Le résultat:

Contrôles de saisie semi-automatique avec le datalist HTML5

Il s'agit du rendu par défaut dans Microsoft Edge. D'autres applications implémentent des fonctionnalités similaires, mais le look diffère d'une plateforme et des navigateurs.

L'utilisation de l'étiquette comme enfant en texte d'une

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

L'utilisation d'un attribut de valeur produit des résultats identiques:

<span><span><span><label</span> for<span>="country"</span>></span>country<span><span></label</span>></span>
</span>
<span><span><span><input</span> 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>

Remarque: La fermeture /> Slash est facultative dans HTML5, bien qu'elle puisse aider à empêcher les erreurs de codage.

Vous pouvez également définir une valeur selon une étiquette choisie en utilisant l'un des formats suivants.

Option 1:

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

Option 2:

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

Dans les deux cas, le champ de saisie est défini sur 1, 2 ou 3 lorsqu'une option valide est choisie, mais l'interface utilisateur varie à l'autre des navigateurs:

  • Chrome affiche une liste avec la valeur et l'étiquette. Seule la valeur reste une fois qu'une option est choisie.
  • Firefox affiche une liste avec l'étiquette uniquement. Il passe à la valeur une fois qu'une option est choisie.
  • Le bord montre la valeur uniquement.

L'exemple de codePen suivant montre toutes les variations:

Voir le stylo
HTML5 Exemples de saisie semi-automatique par SitePoint (@SitePoint)
sur Codepen.

Les implémentations évolueront mais, pour l'instant, je vous conseille de ne pas utiliser de valeur et d'étiquette car il est susceptible de confondre les utilisateurs. (Une solution de contournement est discutée ci-dessous.)

Prise en charge du navigateur et secours

L'élément est bien pris en charge dans les navigateurs modernes ainsi que dans Internet Explorer 10 et 11:

Contrôles de saisie semi-automatique avec le datalist HTML5

Il existe plusieurs notes de mise en œuvre, mais elles n'affecteront pas la plupart des utilisations. Le pire qui pourrait arriver est qu'un champ revient à une entrée de texte standard.

Si vous devez absolument prendre en charge IE9 et ci-dessous, il existe un motif de repli qui utilise un standard en conjonction avec une entrée de texte lorsque le échoue. Adapter l'exemple du pays:

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

Voir le stylo
HTML5 Fallback Assomple de secours par SitePoint (@SitePoint)
sur Codepen.

Dans les navigateurs modernes, les éléments font partie de l'étiquette et "ou autre" n'est pas affichée. Il semble identique à l'exemple ci-dessus, mais une valeur de forme de campagne sera définie sur une chaîne vide.

Dans IE9 et ci-dessous, les champs d'entrée (très longs) et le texte sont actifs:

Contrôles de saisie semi-automatique avec le datalist HTML5

Les deux valeurs pourraient être saisies dans les anciens IES. Votre application doit soit:

  • décider lequel est le plus valide, ou
  • Utilisez une petite fonction JavaScript pour en réinitialiser l'une lorsque l'autre est modifié

Utilisation de sur les contrôles non texte

Les navigateurs à base de chrome peuvent également appliquer des valeurs à:

  1. une entrée avec le type de "date". L'utilisateur peut choisir parmi une gamme d'options définies comme des valeurs Yyyy-mm-dd mais présentées dans son format local.

  2. une entrée avec le type de "couleur". L'utilisateur peut choisir parmi une sélection d'options de couleurs définies comme des valeurs hexagonales à six chiffres (les valeurs à trois chiffres ne fonctionnent pas).

  3. une entrée avec un type de "plage". Le curseur montre les marques de tiques, bien que cela ne limite pas quelle valeur peut être saisie.

Voir le stylo
HTML5 sur d'autres types d'entrée par SitePoint (@SitePoint)
sur Codepen.

CSS Styling

Si vous avez déjà eu du mal à styliser une boîte , … vous avez eu la tâche facile!

Un peut être stylisé comme normal, mais un lié ​​et ses éléments d'enfant

J'espère que cette situation s'améliore, mais pour l'instant, une solution est proposée chez MDN qui:

  1. remplace le comportement du navigateur par défaut
  2. traite efficacement le comme un
    afin qu'il puisse être stylé dans CSS
  3. reproduit toutes les fonctionnalités de la saisie semi-automatique dans JavaScript
  4. Je l'ai amélioré davantage et le code est disponible sur GitHub. Pour l'utiliser, chargez le script n'importe où dans votre page HTML en tant que module ES6. L'URL CDN JSDelivr peut être utilisée:

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

    ou vous pouvez l'installer avec NPM si vous utilisez un bundler:

    <span><span><span><label</span> for<span>="country"</span>></span>country<span><span></label</span>></span>
    </span>
    <span><span><span><input</span> 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>

    Vos éléments doivent utiliser le format de valeur . Par exemple:

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

    Remarque: ne peut pas être utilisé, car il se traduit par un élément vide qui ne peut pas être stylé!

    CSS peut ensuite être ajouté pour styliser certains ou tous les éléments et . Par exemple:

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

    Exemple:

    Voir le stylo
    HTML5 Style CSS Assomple de secours par SitePoint (@SitePoint)
    sur Codepen.

    Le style fonctionne, mais cela vaut-il l'effort? Je soupçonne pas…

    • La réimplémentation du clavier standard, de la souris et des commandes tactiles du navigateur avec une accessibilité raisonnable est difficile. L'exemple de MDN ne prend pas en charge les événements du clavier et, bien que j'essayais de l'améliorer, il y aura inévitablement des problèmes sur certains appareils.
    • Vous comptez sur 200 lignes de JavaScript pour résoudre un problème CSS. Il diminue à 1,5 Ko, mais pourrait introduire des problèmes de performances si vous avez besoin de nombreux éléments longs sur la même page.
    • Si JavaScript est une exigence, serait-il préférable d'utiliser un composant JavaScript plus joli, plus cohérent et testé au combat?

    Le contrôle retombe à un HTML5 standard sans styler lorsque JavaScript échoue, mais c'est un avantage mineur.

    Création d'un amélioré Ajax>

    En présumant que votre concepteur est heureux d'accepter les différences de style de navigateur, il est possible d'améliorer les fonctionnalités standard à l'aide de JavaScript. Par exemple:

    1. Implémentez la validation facultative qui n'accepte qu'une valeur connue dans le .
    2. Définir
    3. Définissez d'autres valeurs de champ lorsqu'une option est choisie. Par exemple, la sélection des «États-Unis d'Amérique» définit «nous» dans une entrée cachée.

    Le code doit principalement redéfinir

    • Une demande API AJAX ne devrait se produire qu'une fois qu'un nombre minimum de caractères a été entré.
    • Les événements de frappe doivent être Debounced . C'est-à-dire qu'un appel ajax n'est déclenché qu'une fois que l'utilisateur a cessé de taper pendant au moins une demi-seconde.
    • Les résultats de la requête doivent être mis en cache afin qu'il ne soit pas nécessaire de répéter ou d'analyser les appels identiques.
    • Les requêtes inutiles doivent être évitées. Par exemple, entrer «Un» renvoie 12 pays. Il n'est pas nécessaire de faire des appels AJAX davantage pour "unité" ou "United" parce que toutes les options résultantes sont contenues dans les 12 résultats originaux.

    J'ai créé un composant Web standard pour cela, et le code est disponible sur GitHub. L'exemple de codepen ci-dessous vous permet de sélectionner un pays valide après avoir entré au moins deux caractères. Un artiste musical Assomple automatique renvoie ensuite des artistes qui sont originaires de ce pays avec des noms correspondant à la chaîne de recherche:

    Voir le stylo
    HTML5 avec AJAX Assomplement par SitePoint (@SitePoint)
    sur Codepen.

    • L'API de recherche du pays est fournie par RestCountries.eu.
    • L'API de recherche d'artiste musical est fournie par musicbrainz.org.

    Pour l'utiliser dans votre propre application, chargez le script n'importe où dans votre page HTML en tant que module ES6. L'URL CDN JSDelivr peut être utilisée:

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

    ou vous pouvez l'installer avec NPM si vous utilisez un bundler:

    <span><span><span><label</span> for<span>="country"</span>></span>country<span><span></label</span>></span>
    </span>
    <span><span><span><input</span> 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>

    Créez un élément avec un enfant à utiliser comme champ de données de données. Par exemple, la recherche de pays utilise ceci:

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

    Attributs d'élément:

    attribut Description API L'URL de l'API REST (requise) respectdata Le nom de la propriété contenant un tableau de résultat d'objets dans l'API retourné JSON (non requis si seuls les résultats sont retournés) Nom de résultat Le nom de la propriété dans chaque objet de résultat qui correspond à l'entrée de recherche et est utilisé pour les éléments de Datalist

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Qu'est-ce que SVG? Votre guide des fichiers SVGArticle suivant:Qu'est-ce que SVG? Votre guide des fichiers SVG

Articles Liés

Voir plus