Bonjour à tous.
Je viens avec une question pour expert.
J'ai un formulaire HTML simple avec un champ texte équipé d'une datalist alimentée par une table de données de plus de 13000 lignes.
Sur mon ordi tout va bien, mais quand je teste ce formulaire sur mon iPhone les 13000 lignes sont un problème : il faut plusieurs secondes pour faire apparaitre la liste lorsque je la déroule.
Si je saisis quelques lettres dans le champ texte avant de dérouler la liste, ça la diminue, donc ça va, mais je ne peux pas empêcher un utilisateur de dérouler la liste sans saisir des lettres. Donc, je cherche un moyen de résoudre ce problème (et je suis ouvert à toutes les suggestions).
Pour tenter de le résoudre, j'ai essayé cette idée :
- Je double mon champ texte principal d'un deuxième qui n'est pas lié à la liste.
- En css, je masque le champ texte principal (display none, width 0 ou autre) pour forcer l'utilisateur à saisir d'abord des lettres dans le champ texte secondaire.
- Avec un onchange et une fonction JS, je transfert la valeur du champ secondaire au champ principal, je masque le champ secondaire et je fais apparaitre le champ principal (avec la datalist). Comme ça, l'utilisateur se retrouve avec le champ principal et la liste portée par la datalist, mais restreinte par le texte qu'il a été forcé de saisir d'abord.
Précision importante : comme il s'agit de forcer la diminution du volume de la liste, je conditionne l'essentiel du code de ma fonction JS à un minimum de 3 caractères saisis. Donc, si l'utilisateur efface des caractères dans le champ principal, ce dernier est de nouveau masqué et le champ secondaire réapparait.
Et ainsi de suite...
Ca fonctionne, mais croyez le croyez le pas, quand le champ principal apparait pour la deuxième fois, le contenu de la datalist disparait littéralement !
Exemple :
- L'utilisateur tape "bif" dans le champ secondaire => le champ principal apparait
- Il efface le f => "bi" => le champ secondaire réapparait
- Il tape un d => "bid" => le champ principal réapparait... et la liste a disparu
Comme la liste est très longue, il faut du temps à mon navigateur pour la dissoudre. Donc, si j'affiche l'outil de développement pour voir le code HTML de ma page, je vois disparaitre la datalist ligne par ligne sous mes yeux !
Une idée pour résoudre mon problème ? D'avance merci
Le PHP qui génère mes champs texte et la datalist :
La fonction JS :
Modifié par louisss (07 Mar 2023 - 13:40)
Je viens avec une question pour expert.
J'ai un formulaire HTML simple avec un champ texte équipé d'une datalist alimentée par une table de données de plus de 13000 lignes.
Sur mon ordi tout va bien, mais quand je teste ce formulaire sur mon iPhone les 13000 lignes sont un problème : il faut plusieurs secondes pour faire apparaitre la liste lorsque je la déroule.
Si je saisis quelques lettres dans le champ texte avant de dérouler la liste, ça la diminue, donc ça va, mais je ne peux pas empêcher un utilisateur de dérouler la liste sans saisir des lettres. Donc, je cherche un moyen de résoudre ce problème (et je suis ouvert à toutes les suggestions).
Pour tenter de le résoudre, j'ai essayé cette idée :
- Je double mon champ texte principal d'un deuxième qui n'est pas lié à la liste.
- En css, je masque le champ texte principal (display none, width 0 ou autre) pour forcer l'utilisateur à saisir d'abord des lettres dans le champ texte secondaire.
- Avec un onchange et une fonction JS, je transfert la valeur du champ secondaire au champ principal, je masque le champ secondaire et je fais apparaitre le champ principal (avec la datalist). Comme ça, l'utilisateur se retrouve avec le champ principal et la liste portée par la datalist, mais restreinte par le texte qu'il a été forcé de saisir d'abord.
Précision importante : comme il s'agit de forcer la diminution du volume de la liste, je conditionne l'essentiel du code de ma fonction JS à un minimum de 3 caractères saisis. Donc, si l'utilisateur efface des caractères dans le champ principal, ce dernier est de nouveau masqué et le champ secondaire réapparait.
Et ainsi de suite...
Ca fonctionne, mais croyez le croyez le pas, quand le champ principal apparait pour la deuxième fois, le contenu de la datalist disparait littéralement !
Exemple :
- L'utilisateur tape "bif" dans le champ secondaire => le champ principal apparait
- Il efface le f => "bi" => le champ secondaire réapparait
- Il tape un d => "bid" => le champ principal réapparait... et la liste a disparu
Comme la liste est très longue, il faut du temps à mon navigateur pour la dissoudre. Donc, si j'affiche l'outil de développement pour voir le code HTML de ma page, je vois disparaitre la datalist ligne par ligne sous mes yeux !
Une idée pour résoudre mon problème ? D'avance merci
Le PHP qui génère mes champs texte et la datalist :
echo "<label>Produit</label><input type=\"text\" name=\"produit2\" id=\"produit2\" maxlenght=300 value=\"\" autocomplete=\"off\" onchange=\"active_liste('#produit2', '#produit');\">";
echo "<input type=\"text\" name=\"produit\" id=\"produit\" maxlenght=300 value=\"\" autocomplete=\"off\" onchange=\"active_liste('#produit2', '#produit'); verif_produit('#produit');\" list=\"produits\">"; // style=\"display: none;\"
echo "<datalist id=\"produits\">";
$req = "SELECT Nom FROM Produit ORDER BY Nom;";
$resp = $connexion->query($req);
while($lp = $resp->fetch_object())
echo "<option>".$lp->Nom."</option>";
echo "</datalist>";
La fonction JS :
function active_liste(champ1, champ2)
{
if($(champ1).css('width') == '690px')
$(champ2).val($(champ1).val());
else
$(champ1).val($(champ2).val());
if($(champ1).val().length >= 3)
{
$(champ1).css('width', '0');
$(champ2).css('width', '690px');
}
else
{
$(champ1).css('width', '690px');
$(champ2).css('width', '0');
}
}
Modifié par louisss (07 Mar 2023 - 13:40)