Chosen: prise en charge des attributs html5 requis ?

Créé le 4 mars 2012  ·  80Commentaires  ·  Source: harvesthq/chosen

Lorsque choisi est initialisé sur une entrée select, il ajoute [style=" display:none "] à la balise select et crée les différentes balises div dont il a besoin, comme suit.

<select name="country" id="country" style="display: none; " class="chzn-done">
    <option selected="selected" value=""></option>
    ...
</select>

C'est bien, mais nous avons un problème si j'ajoute l'attribut html5 'required' à ma balise select, qui produit le balisage suivant après l'initialisation choisie :

<select name="country" id="country" required="required" style="display: none; " class="chzn-done">
<option selected="selected" value=""></option>
...
</select>

Le problème se produit lorsque l'utilisateur soumet le formulaire sans sélectionner de valeur. Pour l'utilisateur, le navigateur semble ne rien faire. En fait, il affiche un message d'erreur à l'utilisateur pour sélectionner une valeur, mais comme le CSS demande au navigateur de ne pas afficher l'élément select, le message d'erreur n'apparaît pas non plus.

Cela se produit dans Chrome, je ne suis pas sûr du comportement des autres navigateurs.

Je n'ai pas creusé assez profondément pour suggérer une solution, mais c'est un problème car nous commençons à inclure des attributs html5 dans nos formulaires.

Feature Request

Commentaire le plus utile

+1

Quelqu'un peut-il commettre un correctif pour cela? C'est un problème assez ancien et une fonctionnalité très importante de nos jours. Merci.

Tous les 80 commentaires

J'ai aussi récemment remarqué ce problème.
Obligatoire n'est pas pris en charge dans tous les navigateurs, j'ai donc créé une solution de secours pour parcourir les éléments d'un formulaire lors de la soumission et vérifier qu'il y a une certaine valeur lorsque "requis" est présent.
Le problème existe toujours dans Chrome car la sélection cachée n'a aucune valeur et n'alerte pas l'utilisateur conformément à la documentation du kit Web :
http://trac.webkit.org/wiki/Styling%20Form%20Controls

"Un message de validation se compose de quatre éléments div avec des pseudo-classes et de quelques nœuds pour le texte du message. Vous pouvez personnaliser l'apparence en modifiant le style de ces pseudo-classes."

Je pense que la meilleure façon de gérer cela est d'avoir choisi de générer le balisage supplémentaire à leur sélection rendue avec des classes similaires afin qu'elles soient stylisées par défaut dans le navigateur, ou éventuellement d'ajouter des pseudo-éléments aux éléments qui ont échoué à la validation par en utilisant les conditions d'échec appropriées dans CSS comme :invalid.

Pour l'instant, il semble que votre seule option soit d'avoir une solution de secours au niveau DOM comme ma solution javascript. Je peux le fournir ici si cela peut être utile, mais c'est vraiment une solution de repli à choisi, pas un moyen de corriger le cadre choisi.

Quel est l'état d'avancement de cette question ? J'ai exactement le même problème avec la dernière version de Firefox ( 14.0.1 )

Étant donné que les attributs HTML5 sont de plus en plus utilisés dans les sites Web, cela devrait être abordé d'une manière ou d'une autre.

J'ai le même problème aussi. Je serais curieux de connaître votre solution de repli.

Merci

Il semble qu'il n'y ait qu'un seul problème majeur et un problème secondaire qu'il serait bon de résoudre.

  • Si l'élément de formulaire n'est pas valide (rien n'est sélectionné), les navigateurs afficheront un petit drapeau indiquant la position de l'erreur, avec un message indiquant de remplir ce champ. Avec choisi, dans Firefox, ce drapeau de message est en bas à gauche de la fenêtre du navigateur.
  • Aucun style n'est défini pour les champs de formulaire non valides. Par défaut dans Firefox (cela varie selon les navigateurs, mais ils font tous quelque chose de similaire), vous obtenez un effet de lueur rouge autour de chaque champ de formulaire invalide. Les cases de sélection sélectionnées n'obtiennent rien.

Le premier élément est le plus problématique. Cela pourrait-il être corrigé en utilisant une méthode de masquage d'élément de sélection différente ? Remplacer " display:none " sur l'élément de sélection masqué par "position: Absolute;visibility: hidden;" devient assez proche - bien que cela dépende davantage du CSS environnant ...

Cela ne fonctionne pas pour Webkit cependant. Il semble que l'indicateur d'erreur hérite des styles de la zone de sélection dans le kit Web (Chrome), donc si vous définissez l'opacité : .5, l'indicateur sera également l'opacité .5 (par exemple). dommage.

Encore un - Opera fonctionne correctement tel quel, mais si je le remplace par le CSS basé sur la position ci-dessus, cela ne fonctionnera pas correctement. Quelle douleur.

Désolé d'avoir spammé ça. Je pense que j'ai compris ! Si vous enveloppez l'élément select dans un span et utilisez ce CSS sur le wrapper (et supprimez le display:none sur l'élément select) :

width: 0px;
height: 0px;
overflow: hidden;
display: inline-block;
position: absolute;

Vous obtiendrez le message d'erreur et aucune interruption du flux de page en même temps. Le seul problème est que vous devez laisser la case visible pour voir le message d'erreur car Firefox et WebKit masqueront le message si vous ne le faites pas. Cela provoque la zone de sélection pour recevoir des onglets via le formulaire.

Le moyen de contourner cela pourrait être de basculer l'affichage de aucun à un bloc en ligne lors de la soumission (ou de l'événement « invalide »), puis de le rétablir sur certains événements d'entrée (comme la souris enfoncée ou la touche enfoncée).

Il y a aussi un petit problème de positionnement, résolvable en forçant la position à être directement sous la case choisie.

Ce serait bien de voir une sorte de support intégré pour cela, si possible.

J'ai écrit un patch ici : https://github.com/adcSTUDIO/chosen

Il n'est peut-être pas assez robuste pour être inclus, mais n'hésitez pas à le tester.

Merci @CaptainN ! Je vérifierai!

@CaptainN , je l'ai fait fonctionner - merci d'avoir apporté ces modifications. Cependant, savez-vous comment autoriser la largeur des fenêtres contextuelles d'erreur à dépasser la largeur des zones de sélection elles-mêmes ? Sur certains de mes éléments de sélection plus petits, le message d'erreur est vraiment mince, ce qui n'a pas vraiment l'air très bon, et peut même être difficile à lire sur certains.

Si ce n'est pas le cas, ce n'est pas grave, vous avez déjà beaucoup aidé avec ça. Merci encore!

@caderade Je ne sais pas comment résoudre ce problème. J'ai essayé overflow:visible et quelques autres choses, et ça s'affiche toujours, je vais essayer quelques autres choses, mais cela ressemble à un problème avec Firefox qui n'a peut-être pas de solution de contournement (ces indicateurs sont généralement assez difficiles à gérer avec, avec cette lueur, que je n'ai pas encore trouvé un moyen de coiffer complètement).

@CaptainN : Très sympa.

Cela fonctionne assez bien pour moi dans Firefox 17 et Chrome 23.

Dans IE 8+9 (qui ne prend pas du tout en charge la validation de formulaire HTML5), lors de la modification de la valeur du champ, j'obtiens une erreur JavaScript en raison du sélecteur inconnu :valid utilisé. Ainsi, le script est abandonné et le formulaire ne s'envenime en aucune façon, ce à quoi je m'attendais dans IE. :smirk: Ne pas déclencher d'erreur serait plus agréable, cependant. Une idée?

Oh frere. En fait, j'imagine que jQuery me protégerait davantage ! Je vais devoir ajouter un contrôle IE ou quelque chose comme ça...

Kévin N.

@CaptainN Il a également le problème pour moi dans Chrome. Je ne savais pas si vous pensiez qu'il s'agissait uniquement d'un problème de Firefox ou non. Mais mec, merci encore une tonne mec. Super travail! Faites-nous savoir si vous êtes jamais en mesure de résoudre le problème de la largeur.

Il semble que jQuery ait un support de pseudo-sélecteur intégré, et un système de crochets pour que les plugins puissent ajouter les leurs, et s'il n'en trouve pas, il le transmet à l'implémentation sous-jacente - donc : requis et : valide génèrent une erreur dans IE (et probablement certaines versions de Safari) s'ils n'ont pas été polyremplis. Je vais voir si je peux lancer un autre type de vérification, au lieu d'utiliser les pseudo-sélecteurs. Il semble que je puisse simplement vérifier attr("requis") pour remplacer :required - Je devrai probablement faire une sorte de détection de fonctionnalité pour :valid cependant - peut-être une vérification pour une propriété .oninvalid ?

D'accord, j'ai reçu un nouveau correctif qui corrige l'erreur IE (et devrait également le corriger dans tous les autres navigateurs). Ce patch change quelques petites choses (rien que vous ne devriez remarquer). Voici mes notes :

  • correspond au style de codage des gestionnaires d'événements présents dans la version jquery (bind au lieu de on, etc.)
  • Je ne peux pas obtenir la version prototype pour masquer l'élément select lorsqu'il est validé - il semble que l'événement de modification de l'élément de formulaire soit supprimé d'une manière ou d'une autre (cela fonctionne autrement) - je pense que c'est un bogue, mais pas celui que j'ai introduit. Besoin d'enquêter plus loin.
  • Il existe quelques petites bizarreries concernant le positionnement de l'élément invalide qui peut parfois nécessiter une intervention manuelle de l'utilisateur via CSS (un problème uniquement si la fonctionnalité requise est utilisée).
  • les zones de sélection de faible largeur se retrouvent avec des drapeaux requis lissés dans le navigateur (également un problème avec les éléments de sélection vanille si vous définissez la largeur via css). Je ne trouve pas de solution de contournement (faites-moi savoir si vous le faites !) Aussi, peut-être vérifier leurs extensions CSS ? https://developer.mozilla.org/en-US/docs/CSS/CSS_Reference/Mozilla_Extensions?redirectlocale=en-US&redirectslug=CSS_Reference%2FMozilla_Extensions (je n'ai rien trouvé en un coup d'œil)
  • Je n'arrive pas à faire fonctionner uglifyjs sous Windows (donc les builds .min.js ne sont pas mis à jour dans mon référentiel) - j'essaierai une build à partir d'OSX demain.

@CaptainN Pour votre problème avec UglifyJS, assurez-vous d'installer la version 1 car la version 2 n'est pas BC. #915 met à jour le package.json

Comment changer de version avec npm ?

@CaptainN npm install uglify-js@1 pour forcer la version 1 IIRC (mais je ne suis pas un expert en nœuds). L'autre solution consiste à extraire ma branche et à exécuter npm install avec le fichier packages.json mis à jour.

J'ai pu créer les versions uglified sur mon mac professionnel (peut-être qu'il a une ancienne version de uglify-js ?). Ils sont maintenant à jour dans mon repo.

Je n'utilise actuellement que la saveur jQuery. Plus aucune erreur de script dans IE8/9. :+1: pour voir cette fonctionnalité en amont bientôt.

Nous sommes également confrontés à ce problème. Existe-t-il une solution de contournement à l'exception de la désactivation de la validation HTML5 ?
@CaptainN l'a corrigé d'après ce que j'ai lu. J'ai donc essayé son fichier selected.jquery.js dans la branche master. Mais cela donne une erreur js de msie indéfini.

Je pensais avoir réglé ça. Cette fourche était il y a quelque temps, et peut-être besoin d'être mis à jour. Je vais voir si je peux y arriver cette semaine et examiner le bogue d'IE.

J'ai synchronisé cela en amont et je n'ai vu aucun avis d'erreur non défini dans IE. Essayez à nouveau mon dépôt et faites-moi savoir si vous voyez toujours ce problème. (désolé ça a pris si longtemps)

Merci!

:+1:

Quelqu'un pourrait-il me résumer cela ? Existe-t-il un fork ou un patch prêt pour la production ?

Il y a une demande d'extraction qui va de pair avec cela - # 900 qui tirerait mon fork adcSTUDIO/Chosen.

Au lieu de masquer la zone de sélection d'origine - lorsque la sélection est requise et lorsqu'il y a une erreur, le correctif positionne la zone de sélection sous la zone de sélection Chosen, de sorte que le message d'erreur HTML5 intégré apparaisse au bon endroit. Edit : Je devrais probablement noter que si la case n'est pas marquée comme "requise" et n'est jamais invalidée, le comportement existant est préservé.

Cette demande d'extraction n'ajoute aucune fonctionnalité supplémentaire en dehors de l'affichage des avis d'erreur HTML5 intégrés.

Merci Kévin !

2013/7/29 Kevin Newman [email protected]

Il y a une pull request qui va avec - #900 https://github.com/harvesthq/chosen/issues/900qui tirerait mon adcSTUDIO/Chosen fork.

Au lieu de masquer la boîte de sélection d'origine - lorsque la sélection est requise,
et lorsqu'il y a une erreur, le patch positionne la case de sélection en dessous
la case de sélection Chosen, de sorte que le message d'erreur HTML5 intégré apparaisse dans
le bon emplacement.

Cette demande d'extraction n'ajoute aucune fonctionnalité supplémentaire en dehors de
faire afficher les avis d'erreur HTML5 intégrés.

-
Répondez directement à cet e-mail ou consultez-le sur Gi tHubhttps://github.com/harvesthq/chosen/issues/515#issuecomment -21750086
.

Urs Bräm
Sites Web macht

lic. phil. je

Theaterplatz 2
3011 Berne
Tél. Bureau : +41 31 311 73 61
Tél. Mobil & Combox : +41 76 327 01 51
http://www.ursbraem.ch

Privé :
Beundenfeldstr. 50
3013 Berne
T +41 31 301 41 90

Salut,
Je viens de recevoir la dernière version (1.0) et je rencontre toujours ce problème. Lorsque choisi est ajouté à une zone de sélection avec l'attribut requis, dans Firefox, l'info-bulle « veuillez sélectionner un élément dans la liste » apparaît dans le coin supérieur gauche de l'écran. Dans Chrome, rien ne se passe du tout. La pull request n'est-elle pas intégrée à la version 1.0 ? Comment puis-je télécharger ce correctif ? Désolé je ne connais pas mieux Github et merci d'avance !

Je ne pense pas que mes modifications ont été fusionnées. Ma fourche a probablement besoin d'être mise à jour aussi - ça fait un moment.

Ah, c'est dommage. Une idée si c'est sur le pipeline de la branche principale ? Des suggestions pour que cela fonctionne en attendant?

Je ne sais pas s'ils prévoient d'intégrer cela dans master, mais ce que vous pouvez faire est d'utiliser mon fork et de le synchroniser avec master, et cela vous donnera une mise à jour à ce jour extraite de leur repo, avec mes modifications appliquées (en supposant pas de conflits) - ou utilisez simplement mon fork un peu obsolète. Malheureusement, je n'aurai pas le temps de mettre à jour ma fourche à court terme.

Voici ma fourchette d'ailleurs : https://github.com/adcSTUDIO/chosen

Merci, Kévin.


Yaron Guez
Architecte logiciel en chef
MedAdaptics - http://medadaptics.com
(781) 767-7434

Le mercredi 27 novembre 2013 à 12h35, Kevin Newman [email protected] a écrit :

Voici ma fourchette d'ailleurs : https://github.com/adcSTUDIO/chosen

-
Répondez directement à cet e-mail ou consultez-le sur Gi tHubhttps://github.com/harvesthq/chosen/issues/515#issuecomment -29403732
.

@CaptainN Avez-vous ouvert un PR avec vos modifications ? Je ne vois aucun lien vers un PR dans cette discussion. Et s'il n'y a pas de PR pour l'examiner, il est peu probable que votre fork soit examiné (les responsables examinent les contributions soumises, ce qui prend déjà du temps, ils n'essaieront donc pas de trouver des contributions non soumises)

Il y a un PR # 900 - c'est un peu le bordel - je pourrais probablement le rebaser à un moment donné et le nettoyer si cela pouvait aider.

<select required> prise en charge des attributs pour le plugin choisi

Salut!
Tout est très, très simple, et vous n'avez pas besoin d'avoir 2 ans pour en discuter :)
@CaptainN @yaronguez @stof @kenearley

Pour ajouter correctement l'affichage d'un message d'erreur du navigateur avec choisi pour <sélectionner requis> lorsque l'utilisateur ne choisit aucune option,

  1. Supprimer l' affichage : aucun paramètre pour la balise de sélection du code JS du plug-in.
  2. Enveloppez la balise <select> dans l'enveloppement <div> , puis ajoutez la position CSS pour ce <div> dans votre CSS.
  3. Ajouter la position : absolue ; clip : rect (0,0,0,0); pour masquer la balise <select> dans le code du plugin JS.

Si vous ne voulez pas perdre de temps à éditer le code du plugin, ajoutez simplement quelque chose comme après avoir initialisé le plugin choisi.

Exemple:

 function InitChosen() {
  $('select.chzn').each(function(index) {
  $(this).chosen({
  disable_search_threshold : 5,
  no_results_text: "Ничего не найдено!"
  });
  this.setAttribute('style','display:visible; position:absolute; clip:rect(0,0,0,0)');
  });
 }

C'est tout. Aaaaa et maintenant... DISCO ! :)
** Pour les navigateurs prenant en charge l'attribut "requis".

Chrome

--2

FireFox

--1

@Aharito N'allons- nous pas résoudre le problème de l'ordre de tabulation en le faisant?

Merci @Aharito, cela fonctionne très bien avec la version 1.1.0 choisie, remplacez simplement $('select.chzn') par $('.chosen-select') .

Je pensais avoir essayé ce clip: rect trick, et j'ai trouvé un problème avec. Peut-être avec un navigateur plus ancien ? Je suppose que si ça marche maintenant, c'est super.

Je pense qu'il peut également y avoir des problèmes d'onglet avec ma solution (je ne me souviens pas, cela fait un moment) - J'ai réduit l'impact en appliquant uniquement le correctif aux champs qui posent l'attribut requis.

Nous avons standardisé cela pour tous les appels à $().chosen()

$.fn.oldChosen = $.fn.chosen
$.fn.chosen = function(options) {
  var select = $(this)
    , is_creating_chosen = !options || _.isObject(options)

  if (is_creating_chosen && select.css('position') === 'absolute') {
    // if we are creating a chosen and the select already has the appropriate styles added
    // we remove those (so that the select hasn't got a crazy width), then create the chosen
    // then we re-add them later
    select.removeAttr('style')
  }

  var ret = select.oldChosen(options)

  if (is_creating_chosen) {
    // https://github.com/harvesthq/chosen/issues/515#issuecomment-33214050
    // only do this if we are initializing chosen (no params, or object params) not calling a method
    select.attr('style','display:visible; position:absolute; clip:rect(0,0,0,0)');
  }
  return ret
}

@ghiculescu Cela ne résout pas le problème de tabulation ou de décalage dans la sélection, n'est-ce pas?

@DASPRiD Nope .

qu'en est-il de cela comme solution de dissimulation possible.

ce n'est pas parfait, mais en fait, cela empêche la sélection d'origine d'apparaître en passant le focus à la prochaine boîte de dialogue choisie, mais c'est peut-être un pas de plus

"chosen-select" n'est qu'un sélecteur pour les sélections que j'ai avec une classe particulière, je ne sais pas si "click focus" couvre tous les événements respectifs auxquels je devrais m'accrocher, mais peut-être que quelqu'un peut dire ce qui manque?

il est également possible que j'aie mal compris quelque chose à propos de la structure html choisie et que find("a") soit trop libéral, quelqu'un a-t-il plus d'expérience ?

$(".chosen-select").on("click focus",function(event){
    $(this).next(".chosen-container").find("a").trigger(event.type);
});

oh, et sûrement " display:visible " devrait être " display: block " ou quelque chose ? car la visibilité : visible est valide, mais l' affichage : visible, je suis sûr que ce n'est pas le cas

ce que j'ai trouvé, c'est que si vous avez plusieurs sélections côte à côte dans le même conteneur, cela les déplace toutes au mauvais endroit, donc la position : absolue fait alors apparaître le message de validation dans la mauvaise position.

J'ai résolu ce problème en me détachant et en me rattachant au conteneur choisi, comme si

$(".chosen-select").each(function(){
    $(this).next(".chosen-container").prepend($(this).detach());
});

la solution ci-dessus, après une enquête plus approfondie, montre qu'elle désactive complètement la tabulation dans les champs et que je ne parviens pas à résoudre le problème, mais elle élimine le problème de la sélection qui apparaît lorsque vous parcourez, c'est donc le plus problème important dans mon esprit, je peux vivre sans tabulation si je peux l'avoir afin que cela ne casse pas l'affichage, vu que de plus en plus de personnes utilisent des appareils mobiles et ne tabulent pas de toute façon, cela n'affecte que les utilisateurs de bureau, toujours important, mais relativement parlant, gérable.

Cependant, si quelqu'un résout ce problème d'une manière ou d'une autre, je suis très intéressé de le savoir.

ok, donc suite à ce que j'essayais auparavant, j'ai trouvé que les événements choisis utilisaient et j'ai décidé que lorsque je faisais un événement sur la sélection maintenant cachée, je pouvais le détourner et déclencher un événement choisi pour l'ouvrir.

je pense que ça marche bien.

$(".chosen-select").each(function(){
    //    take each select and put it as a child of the chosen container
    //    this mean it'll position any validation messages correctly
    $(this).next(".chosen-container").prepend($(this).detach());

    //    apply all the styles, personally, I've added this to my stylesheet
    $(this).attr("style","display:block!important; position:absolute; clip:rect(0,0,0,0)");

    //    to all of these events, trigger the chosen to open and receive focus
    $(this).on("click focus keyup",function(event){
        $(this).closest(".chosen-container").trigger("mousedown.chosen");
    });
});

Je pense que c'est la meilleure version que j'ai à ce jour. Heureusement, cela résout le problème de tabulation vers l'avant, il y a toujours la tabulation inversée, vous ne pouvez pas reculer dans une sélection choisie car à la seconde où vous tabulez dans l'élément de sélection, vous vous recentrez immédiatement sur le conteneur choisi, ce qui signifie que vous ' re piégé dans le seul fait de pouvoir tabuler vers l'avant.

Ce peut être une idée de garder une trace de l'élément précédent et si l'élément qui avait auparavant le focus de tabulation était devant l'élément focalisé actuel, vous reculez, puis passez de manière appropriée le recentrage sur l'onglet choisi et sélectionnez l'onglet précédent, mais je ne sais pas comment faire.

Après une très longue lecture, j'ai pensé avoir essayé les suggestions soumises au fil des ans.

Malheureusement, je n'ai pas pu faire fonctionner le code de @christhomas . Je l'invoque dans une fonction de soumission sans résultats visibles (pas d'erreurs non plus).

La bonne nouvelle est que la nouvelle fonction de @ghiculescu fonctionne comme un régal car je peux toujours utiliser le fichier CDN choisi et simplement utiliser la fonction dans mon fichier js.

@DASPRiD @charettes que veux-tu dire par onglet ne fonctionne pas avec la fonction modifiée ? Cela semble fonctionner pour moi

Assez facile pour ajouter tabindex: -1 à l' extrait de @ghiculescu , résolvant le problème de tabulation.

Exemple : http://jsfiddle.net/hq7b426j/

Je pouvais voir le problème maintenant! Votre ajout fonctionne très bien @andreialecu

Il y avait un autre ajout nécessaire en passant. Sur l'iPhone ou d'autres appareils non pris en charge, le violon ne fonctionnerait pas correctement. Chosen se désactive sur iPhone et laisse le <select> inchangé, et le code dans le violon ci-dessus le masquerait, ne laissant aucun moyen d'interagir avec le select.

Ce violon le corrige (en ajoutant un affichage : aucun contrôle) :
http://jsfiddle.net/hq7b426j/1/

Ah c'est encore mieux !! Merci! Je teste toujours aussi, mais je posterai si quelque chose d'autre arrive

@CaptainN s'il vous plaît bref, j'ai le même problème. wr je dois mettre ce code. J'utilise le thème inspina de wrapbootstrap.

@ vidhyaprakash85 Je ne sais pas ce que vous voulez dire. J'avais forké il y a longtemps et j'ai écrit une pull request (#900) mais les dépôts ne sont plus synchronisés maintenant, et mon fork est très obsolète. Vous pouvez le trouver ici si cela vous aide : https://github.com/adcSTUDIO/chosen

j'utilise déjà https://github.com/harvesthq/chosen comment faire ça :(

@andreialecu ton code fonctionne bien ! Merci!!!

Merci @christhomas votre code a très bien fonctionné :dancer:

Ni @christhomas ni n'ont fonctionné pour moi en utilisant une sélection multi-groupe. le laisser à la validation du serveur pour l'instant.

Lorsque j'ai essayé le patch @ghiculescu , cela a fonctionné sauf qu'un défilement était affiché tout le temps, sous la boîte de sélection.
Lorsque j'ai essayé le correctif @christhomas , la fenêtre contextuelle est apparue sans que le champ de recherche ne s'ouvre.

J'ai dû modifier le script de @ghiculescu pour pouvoir appeler choisi deux fois comme tel :

target.find('select')
        .chosen('destroy')
        .chosen({disable_search_threshold: 10})

Sinon, 2nd trip a supprimé le style qui avait été ajouté dans le premier :

$.fn.oldChosen = $.fn.chosen
$.fn.chosen = function(options) {
  var select = $(this)
    , is_creating_chosen = !!options

    var style = 'display:visible; position:absolute; clip:rect(0,0,0,0);'

        if (is_creating_chosen && select.css('position') === 'absolute' && select.attr('style') != style) {
            // if we are creating a chosen and the select already has the appropriate styles added
            // we remove those (so that the select hasn't got a crazy width), then create the chosen
            // then we re-add them later
            select.removeAttr('style')
        }

        var ret = select.oldChosen(options)

        // only act if the select has display: none, otherwise chosen is unsupported (iPhone, etc)
        if (is_creating_chosen && select.css('display') === 'none') {
            // https://github.com/harvesthq/chosen/issues/515#issuecomment-33214050
            // only do this if we are initializing chosen (no params, or object params) not calling a method
            select.attr('style', style);
            select.attr('tabindex', -1);
        }
        return ret
}

Je viens d'ajouter cette condition supplémentaire au 1er if : && select.attr('style') != style

@doganmeh Fonctionne très bien dans Chrome et mobile (avec Chrome) mais testé dans Firefox 53.0 où cela ne fonctionne pas

Même ce http://jsfiddle.net/hq7b426j/1/ ne fonctionne pas dans Firefox 53.0

Hmmm, mais cela ressemble plus à un problème de Firefox car si vous cliquez plusieurs fois sur le bouton, vous verrez que Firefox essaie d'afficher le message (mais celui-ci n'est jamais rendu complètement)

J'ai utilisé cette solution. C'est très simple et fonctionne parfaitement :

<style>
    select.submitted:invalid + .chosen-container{
        border-color: red !important;
    }
</style>
$('#yourSelector').chosen({
                no_results_text: "yourText",
                disable_search_threshold: 9,
                search_contains: true
                //your parameters
    }).on('invalid', function(){
        $(this).addClass('submitted');
    });

il semble que cela ne fonctionne pas si vous avez choisi avec plusieurs sélections :
http://jsfiddle.net/jeromax/o5a8aogh/

Je l'ai corrigé.

`
$.fn.oldChosen = $.fn.chosen
$.fn.chosen = fonction (options) {
var select = $(this),
is_creating_chosen = !!options;

if (is_creating_chosen && select.css('position') === 'absolu') {
// si nous créons un choisi et que le select a déjà ajouté les styles appropriés
// nous les supprimons (pour que le select n'ait pas une largeur folle), puis créons le choisi
// puis nous les rajoutons plus tard
select.removeAttr('style');
}

var ret = select.oldChosen(options)

// n'agit que si le select a un affichage : aucun, sinon le choix n'est pas supporté (iPhone, etc)
if (is_creating_chosen && select.css('display') === 'none') {
// https://github.com/harvesthq/chosen/issues/515#issuecomment-33214050
// ne le faisons que si nous initialisons choisi (pas de paramètres ou de paramètres d'objet) sans appeler de méthode

  $(this).each(function(index){
      if($(this)[0].multiple==true){
          $(this).attr('style','display:visible; width:0px; height:0px; margin-top:25px; position:absolute; clip:rect(0,0,0,0)');
      }else{
          $(this).attr("style","display:visible; position:absolute; clip:rect(0,0,0,0)");
      }
  })

select.attr('tabindex', -2);

}
retour ret
}
`

+1

Quelqu'un peut-il commettre un correctif pour cela? C'est un problème assez ancien et une fonctionnalité très importante de nos jours. Merci.

Ne fonctionne pas sur la dernière version.

Cela semble rompre la validation du formulaire angular.js lorsque vous utilisez également angular-chosen.

Nous sommes en 2018 et nous avons toujours le même problème. C'est un enfer comment les normes HTML ne peuvent pas fonctionner correctement et intégrées avec des plugins externes. Temps fou :)

Cela casse également le plugin choisi par Drupal. Voir https://www.drupal.org/project/chosen/issues/2705891

Je n'ai pas trouvé de solution appropriée à cela autre qu'une solution de contournement :

<div class="form__select">
  <select class="chosen">
    <!-- options -->
  </select>
</div>
.form__select {
    position: relative;
}

.form__select .chosen {
    display: block !important;
    height: 0;

    position: absolute;
    left: 35px;
    bottom: 0;

    outline: none;
    border-color: white;

    pointer-events: none;
}

Si vous utilisez Chosen pour tous les éléments select , vous pouvez utiliser ce CSS pour le rendre visible (au DOM), mais pas d'opacité, pas de hauteur, position absolue.

Ces sélecteurs CSS ciblent les éléments de sélection non valides, l'un d'entre eux ciblant multiple ajoutant un 15px margin-top pour le centrer sur les éléments à sélection multiple.

select:invalid {
    height: 0px !important;
    opacity: 0 !important;
    position: absolute !important;
    display: flex !important;
}

select:invalid[multiple] {
   margin-top: 15px !important;
}

Démo : http://jsfiddle.net/tripflex/2zdeu9oc/

MAIS VRAIMENT ... cela devrait déjà être géré par la lib Chosen.JS

Voici ma solution de contournement, si elle est utile:

// Initialise Chosen
$(function () {
    $('select').chosen();
});

// Place the original input behind the Chosen input, matching the height and width so that the warning appears in the correct position
$('select').on('chosen:ready', function () {
    const height = $(this).next('.chosen-container').height();
    const width = $(this).next('.chosen-container').width();

    $(this).css({
            'position': 'absolute',
            'height': height,
            'width': width,
            'opacity': 0
        })
        .show();
});

@jonathanbull pouvez-vous le montrer dans son contexte ? J'ai essayé votre solution et cela n'a pas fonctionné.

@AndrewSouthpaw Ceci est mon code, les correctifs fonctionnent bien pour moi :)

$("#select").val([]); // disable default selection by browser
$('#select').on('chosen:ready', function(evt, params, chosen) {
    $(this).css({'position': 'absolute', 'height': 0, 'opacity': 0}).show();
});
$("#select").chosen();

J'utilise un code légèrement différent (basé sur le code ici):

$('.chosen-select').on("chosen:ready", function (evt, data) {
  $(this)
    .addClass('chosen_hidden')
    .attr('tabindex', '-1')
    .prependTo(data.chosen.container)
    .show()
  })
  .chosen({width: '100%'})
.chosen_hidden {
  position: absolute;
  top: 0;
  bottom: 0;
  max-height: 100%; // required for IE 10
  // **not required** opacity: 0;
}

Il ne gère pas l'action "détruire", mais il positionne bien le message d'erreur et semble fonctionner sur Firefox et Chromiun. Comme le sélecteur d'origine n'est pas masqué, la bordure de surbrillance d'erreur est visible. Mise à jour : avec max-height ça marche aussi sur IE. Autre mise à jour : ajout de tabindex -1 pour s'assurer qu'il ne reçoive pas le focus. (tout en étant focalisable et recevoir des messages d'erreur).

Il y a eu un PR ouvert qui résout ce problème, mais je pense qu'il s'est perdu depuis que l'autre fil ciblé a été fermé. Voir #2594

@jhedstrom aimerait voir cela fusionné. Savez-vous si cette bibliothèque est toujours maintenue ?

J'ai utilisé quelque chose de similaire à la solution de

https://github.com/harvesthq/chosen/pull/2594#issuecomment-714806139

Merci @jhedstrom de m'avoir orienté dans la bonne direction !

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

engintekin picture engintekin  ·  8Commentaires

zerocrates picture zerocrates  ·  7Commentaires

vpode picture vpode  ·  5Commentaires

gandarez picture gandarez  ·  5Commentaires

asvetlenko picture asvetlenko  ·  3Commentaires
bleepcoder.com utilise des informations sous licence publique GitHub pour fournir aux développeurs du monde entier des solutions à leurs problèmes. Nous ne sommes pas affiliés à GitHub, Inc. ni à aucun développeur qui utilise GitHub pour ses projets. Nous n'hébergeons aucune des vidéos ou images sur nos serveurs. Tous les droits appartiennent à leurs propriétaires respectifs.
Source pour cette page: Source

Langages de programmation populaires
Projets GitHub populaires
Plus de projets GitHub

© 2024 bleepcoder.com - Contact
Made with in the Dominican Republic.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.