Chosen: html5 erforderliche Attributunterstützung?

Erstellt am 4. März 2012  ·  80Kommentare  ·  Quelle: harvesthq/chosen

Wenn selected an einem select-Eingang initialisiert wird, fügt es [style=" display:none "] zum select-Tag hinzu und erstellt die verschiedenen benötigten div-Tags wie folgt.

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

Das ist in Ordnung, aber wir haben ein Problem, wenn ich das html5-Attribut "erforderlich" zu meinem select-Tag hinzufüge, das nach der ausgewählten Initialisierung das folgende Markup erzeugt:

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

Das Problem tritt auf, wenn der Benutzer das Formular sendet, ohne einen Wert auszuwählen. Für den Benutzer scheint der Browser nichts zu tun. Tatsächlich zeigt es dem Benutzer eine Fehlermeldung an, um einen Wert auszuwählen, aber da das CSS den Browser anweist, das select-Element nicht anzuzeigen, wird die Fehlermeldung auch nicht angezeigt.

Dies geschieht in Chrome, ich bin mir beim Verhalten anderer Browser nicht sicher.

Ich habe nicht tief genug gegraben, um eine Lösung vorzuschlagen, aber dies ist ein Problem, wenn wir beginnen, HTML5-Attribute in unsere Formulare aufzunehmen.

Feature Request

Hilfreichster Kommentar

+1

Kann jemand einen Fix dafür festlegen? Es ist ein ziemlich altes Problem und heutzutage eine sehr wichtige Funktionalität. Dankeschön.

Alle 80 Kommentare

Mir ist dieses Problem auch erst vor kurzem aufgefallen.
Erforderlich wird nicht in allen Browsern unterstützt, daher habe ich einen Fallback erstellt, um die Elemente eines Formulars beim Senden zu durchlaufen und zu überprüfen, ob dort ein Wert vorhanden ist, wenn "erforderlich" vorhanden ist.
Das Problem besteht weiterhin in Chrome, da die versteckte Auswahl keinen Wert hat und den Benutzer nicht gemäß den Webkit-Dokumenten benachrichtigt:
http://trac.webkit.org/wiki/Styling%20Form%20Controls

"Eine Validierungsnachricht besteht aus vier div-Elementen mit Pseudoklassen und einigen Knoten für den Nachrichtentext. Sie können das Erscheinungsbild anpassen, indem Sie den Stil dieser Pseudoklassen ändern."

Ich denke, der beste Weg, damit umzugehen, besteht darin, das zusätzliche Markup zu ihrer gerenderten Auswahl mit ähnlichen Klassen zu generieren, sodass sie standardmäßig im Browser formatiert werden, oder möglicherweise Pseudoelemente an Elemente anzuhängen, deren Validierung fehlgeschlagen ist Verwenden der entsprechenden fehlgeschlagenen Bedingungen in CSS wie :invalid.

Im Moment sieht es so aus, als ob Ihre einzige Option darin besteht, einen Fallback auf DOM-Ebene wie meine Javascript-Lösung zu haben. Ich kann es hier bereitstellen, wenn das hilfreich wäre, aber es ist wirklich ein Fallback für das gewählte und keine Möglichkeit, das gewählte Framework zu reparieren.

Wie ist der Status zu diesem Thema? Ich habe genau das gleiche Problem mit der letzten Firefox-Version ( 14.0.1 )

Da HTML5-Attribute immer häufiger in Webseiten verwendet werden, sollte dies so oder so adressiert werden.

Ich habe das gleiche Problem auch. Mich würde deine Fallback-Lösung interessieren.

Vielen Dank

Es sieht so aus, als gäbe es nur ein Hauptproblem und ein sekundäres Problem, das behoben werden könnte.

  • Wenn das Formularelement ungültig ist (nichts ausgewählt ist), werden Browser ein kleines Flag auslösen, das die Position des Fehlers anzeigt, mit einer Meldung, die besagt, dass dieses Feld ausgefüllt werden soll. Wenn ausgewählt, befindet sich in Firefox dieses Nachrichten-Flag unten links im Browserfenster.
  • Für ungültige Formularfelder ist kein Stil definiert. Standardmäßig erhalten Sie in Firefox (es variiert zwischen Browsern, aber alle tun etwas Ähnliches) um jedes ungültige Formularfeld herum ein rotes Leuchten. Ausgewählte Auswahlboxen erhalten nichts.

Der erste Punkt ist der problematischere. Könnte dies behoben werden, indem eine andere Methode zum Ausblenden von ausgewählten Elementen verwendet wird? Ersetzen von " display:none " auf dem ausgeblendeten Auswahlelement durch "position: absolute;visibility: hidden;" kommt ziemlich nahe - obwohl das mehr vom umgebenden CSS abhängt ...

Es funktioniert jedoch nicht für Webkit. Es scheint, dass das Fehler-Flag die Stile der Auswahlbox in Webkit (Chrome) erbt. Wenn Sie also opacity: .5 einstellen, wird das Flag auch opacity .5 sein (als ein Beispiel). schade.

Noch eins - Opera funktioniert wie es ist korrekt, aber wenn ich es in das obige positionsbasierte CSS ändere, funktioniert es nicht richtig. Was für ein Schmerz.

Tut mir leid, dass ich das spamme. Ich glaube, ich habe es trotzdem! Wenn Sie das select-Element in einen Span einschließen und dieses CSS für den Wrapper verwenden (und das display:none für das select-Element entfernen):

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

Sie erhalten die Fehlermeldung und unterbrechen den Seitenfluss nicht gleichzeitig. Das einzige Problem ist, dass Sie das Feld sichtbar lassen müssen, um die Fehlermeldung zu sehen, da Firefox und WebKit die Meldung ausblenden, wenn Sie dies nicht tun. Dadurch erhält das Auswahlfeld Registerkarten über das Formular.

Der Umweg könnte darin bestehen, die Anzeige beim Senden (oder beim 'ungültigen' Ereignis) von Keine auf Inline-Block umzuschalten und dann bei bestimmten Eingabeereignissen (wie Maus-Down oder Tastendruck) wieder zurückzuschalten.

Es gibt auch ein kleines Positionierungsproblem, das gelöst werden kann, indem die Position erzwungen wird, sich direkt unter der ausgewählten Box zu befinden.

Wäre schön, wenn überhaupt, eine eingebaute Unterstützung dafür zu sehen.

Ich habe hier einen Patch geschrieben: https://github.com/adcSTUDIO/chosen

Es ist möglicherweise nicht robust genug für die Aufnahme, aber Sie können es gerne testen.

Danke @CaptainN! Ich werde das überprüfen!

@CaptainN , ich habe es zum

Wenn nicht, ist das in Ordnung, Sie haben damit schon eine Menge geholfen. Danke noch einmal!

@caderade Ich bin mir nicht sicher, wie ich dieses Problem beheben kann. Ich habe overflow:visible und ein paar andere Dinge ausprobiert, und es wird immer noch kurz angezeigt. Ich werde noch ein paar Dinge ausprobieren, aber das sieht nach einem Problem mit Firefox aus, für das möglicherweise keine Problemumgehung besteht (diese Flags sind im Allgemeinen ziemlich schwer zu beheben .) mit, zusammen mit diesem Glanz, den ich noch nicht vollständig stylen kann).

@CaptainN : Sehr schön.

Bei mir funktioniert es ziemlich gut in Firefox 17 und Chrome 23.

Im IE 8+9 (der HTML5-Formularvalidierung überhaupt nicht unterstützt) erhalte ich beim Ändern des Werts des Felds einen JavaScript-Fehler, da der unbekannte :valid Selektor verwendet wird. Dadurch wird das Skript abgebrochen und das Formular wird in keiner Weise verhätschelt, was ich im IE erwartet hatte. :smirk: Es wäre jedoch schöner, keinen Fehler auszulösen. Irgendeine Idee?

Oh, Mühe. Ich denke tatsächlich, jQuery würde mich mehr schützen! Ich muss einen IE-Check oder so hinzufügen...

Kevin N.

@CaptainN Es hat das Problem für mich auch in Chrome. Ich war mir nicht sicher, ob Sie dachten, es sei nur ein Firefox-Problem oder nicht. Aber Alter, vielen Dank nochmal, Mann. Gute Arbeit! Lassen Sie es uns wissen, wenn Sie die Sache mit der Breite jemals ansprechen können.

Es sieht so aus, als ob jQuery eine eingebaute Pseudo-Selektor-Unterstützung und ein Hook-System hat, damit Plugins ihre eigenen hinzufügen können, und wenn es keine findet, gibt es es an die zugrunde liegende Implementierung weiter - also :erforderlich und :valid geben einen Fehler aus im IE (und wahrscheinlich in einigen Versionen von Safari), wenn sie nicht mehrfach gefüllt wurden. Ich werde sehen, ob ich dort eine alternative Art von Check-in einfügen kann, anstatt die Pseudo-Selektoren zu verwenden. Es sieht so aus, als ob ich einfach attr("erforderlich") überprüfen kann, um :required zu ersetzen - ich werde wahrscheinlich eine Art Feature-Erkennung für :valid durchführen müssen - vielleicht eine Überprüfung auf eine .oninvalid-Eigenschaft?

Ok, ich habe einen neuen Patch, der den IE-Fehler behebt (und ihn auch in allen anderen Browsern beheben sollte). Dieser Patch ändert ein paar Dinge (nichts, was Sie bemerken sollten). Hier meine Notizen:

  • entsprach dem Codierungsstil der in der jquery-Version vorhandenen Event-Handler (bind statt on usw.)
  • Ich kann die Prototypversion nicht dazu bringen, das Select-Element bei der Validierung auszublenden - es sieht so aus, als ob das Änderungsereignis des Formularelements irgendwie unterdrückt wird (es funktioniert sonst) - Ich denke, dies ist ein Fehler, aber keiner, den ich eingeführt habe. Muss weiter untersuchen.
  • Es gibt einige kleinere Macken bei der Positionierung des ungültigen Elements, die manchmal manuelle Eingriffe des Benutzers durch CSS erfordern (nur ein Problem, wenn die erforderliche Funktion verwendet wird).
  • Auswahlboxen mit kurzer Breite führen zu geglätteten erforderlichen Flags im Browser (auch ein Problem mit Vanilla-Select-Elementen, wenn Sie die Breite über CSS festlegen). Ich kann keinen Workaround finden (lass es mich wissen, wenn du es tust!) Vielleicht nimm es mit Mozilla auf, da es auch mit Vanilla-Boxen passieren wird. Schauen Sie sich vielleicht auch ihre CSS-Erweiterungen an? https://developer.mozilla.org/en-US/docs/CSS/CSS_Reference/Mozilla_Extensions?redirectlocale=en-US&redirectslug=CSS_Reference%2FMozilla_Extensions (ich konnte auf einen Blick nichts finden)
  • Ich kann uglifyjs unter Windows nicht zum Laufen bringen (also werden die .min.js-Builds in meinem Repository nicht aktualisiert) - Ich werde morgen einen Build von OSX ausprobieren.

@CaptainN Stellen Sie bei Ihrem Problem mit UglifyJS sicher, dass Sie Version 1 installieren, da Version 2 nicht BC ist. #915 aktualisiert die package.json

Wie wechsle ich die Version mit npm?

@CaptainN npm install uglify-js@1 um die Version 1 IIRC zu erzwingen (aber ich bin kein Knotenexperte). Die andere Lösung besteht darin, meinen Zweig auszuchecken und npm install mit der aktualisierten Datei package.json auszuführen.

Ich konnte die uglified-Versionen auf meinem Arbeits-Mac erstellen (vielleicht hat er eine ältere Version von uglify-js?). Sie sind jetzt in meinem Repo aktuell.

Ich verwende derzeit nur die jQuery-Variante. Kein Skriptfehler in IE8/9 mehr. :+1: um diese Funktion bald im Upstream zu sehen.

Auch wir stehen vor diesem Problem. Gibt es eine Problemumgehung, außer die HTML5-Validierung zu deaktivieren?
@CaptainN hat es nach dem, was ich gelesen

Ich dachte, ich hätte das behoben. Diese Gabelung ist eine Weile her und muss möglicherweise aktualisiert werden. Ich werde sehen, ob ich diese Woche dazu komme, und den IE-Bug untersuchen.

Ich habe diesen Upstream synchronisiert und im IE keine undefinierten Fehlermeldungen gesehen. Versuchen Sie mein Repo erneut und lassen Sie es mich wissen, wenn dieses Problem weiterhin auftritt. (Entschuldigung, dass es so lange gedauert hat)

Vielen Dank!

:+1:

Könnte das jemand für mich zusammenfassen? Gibt es eine Gabel oder einen Patch, der zur Produktion bereit ist?

Es gibt eine Pull-Anfrage, die damit einhergeht - # 900, die meine adcSTUDIO/Chosen-Fork ziehen würde.

Anstatt die ursprüngliche Auswahlbox auszublenden - wenn die Auswahl erforderlich ist und ein Fehler auftritt, positioniert der Patch die Auswahlbox unter der Auswahlbox "Ausgewählt", sodass die integrierte HTML5-Fehlermeldung an der richtigen Stelle angezeigt wird. Bearbeiten: Ich sollte wahrscheinlich beachten, dass das vorhandene Verhalten beibehalten wird, wenn die Box nicht als "erforderlich" markiert und niemals ungültig gemacht wird.

Dieser Pull-Request fügt keine zusätzlichen Funktionen hinzu, außer dass die integrierten HTML5-Fehlerbenachrichtigungen angezeigt werden.

Danke Kevin!

29.07.2013 Kevin Newman [email protected]

Dazu gibt es eine Pull-Anfrage - # 900 https://github.com/harvesthq/chosen/issues/900 , die meine adcSTUDIO/Chosen-Fork ziehen würde.

Anstatt das ursprüngliche Auswahlfeld auszublenden - wenn die Auswahl erforderlich ist,
und wenn ein Fehler auftritt, positioniert der Patch die Auswahlbox darunter
das Auswahlfeld Gewählt, damit die eingebaute HTML5-Fehlermeldung in
die richtige Stelle.

Diese Pull-Anfrage fügt keine zusätzlichen Funktionen außerhalb von . hinzu
Anzeige der integrierten HTML5-Fehlerbenachrichtigungen.


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf Gi tHub anhttps://github.com/harvesthq/chosen/issues/515#issuecomment -21750086
.

Urs Bräm
macht Websites

lic. phil. ich

Theaterplatz 2
3011 Bern
Tel.-Nr. Büro: +41 31 311 73 61
Tel.-Nr. Mobil & Combox: +41 76 327 01 51
http://www.ursbraem.ch

Privat:
Beundenfeldstr. 50
3013 Bern
T +41 31 301 41 90

Hi,
Ich habe gerade die neueste Version (1.0) erhalten und dieses Problem tritt immer noch auf. Wenn "Ausgewählt" zu einem Auswahlfeld mit dem erforderlichen Attribut hinzugefügt wird, erscheint in Firefox in der oberen linken Ecke des Bildschirms der Tooltip "Bitte wählen Sie ein Element aus der Liste aus". In Chrome passiert gar nichts. Ist der Pull Request nicht in Version 1.0 integriert? Wie kann ich diesen Patch herunterladen? Tut mir leid, ich kenne mich mit Github nicht besser aus und danke im Voraus!

Ich glaube nicht, dass meine Änderungen zusammengeführt wurden. Meine Gabel muss wahrscheinlich auch aktualisiert werden - es ist eine Weile her.

Ach, das ist schade. Irgendeine Idee, ob es sich in der Master-Zweigpipeline befindet? Irgendwelche Vorschläge, um dies in der Zwischenzeit zum Laufen zu bringen?

Ich habe keine Ahnung, ob sie vorhaben, dies in den Master zu integrieren, aber Sie können meinen Fork verwenden und mit dem Master synchronisieren keine Konflikte) - oder verwende einfach meinen etwas veralteten Fork. Leider werde ich in naher Zukunft nicht die Zeit haben, meine Gabel zu aktualisieren.

Hier ist übrigens meine Gabel: https://github.com/adcSTUDIO/chosen

Danke, Kevin.


Yaron Guez
Chef-Softwarearchitekt
MedAdaptics - http://medadaptics.com
(781) 767-7434

Am Mittwoch, den 27. November 2013 um 12:35 Uhr schrieb Kevin Newman [email protected] :

Hier ist übrigens meine Gabel: https://github.com/adcSTUDIO/chosen


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf Gi tHub anhttps://github.com/harvesthq/chosen/issues/515#issuecomment -29403732
.

@CaptainN Haben Sie eine PR mit Ihren Änderungen geöffnet? Ich sehe keinen Link zu einer PR in dieser Diskussion. Und wenn es keine PR gibt, um es zu überprüfen, ist es unwahrscheinlich, dass Ihr Fork überprüft wird (Betreuer überprüfen eingereichte Beiträge, was bereits Zeit erfordert, damit sie nicht versuchen, nicht eingereichte Beiträge zu finden).

Es gibt einen PR #900 - es ist ein bisschen durcheinander - ich könnte ihn wahrscheinlich irgendwann umbasieren und ihn bereinigen, wenn es helfen würde.

<select required> Attributunterstützung für das gewählte Plugin

Hallo!
Alles ist sehr, sehr einfach, und Sie müssen nicht 2 Jahre Zeit haben, um darüber zu diskutieren :)
@CaptainN @yaronguez @stof @kenearley

Um das Hinzufügen richtig eine Browser Fehlermeldung mit ausgewählten zur Anzeige <erforderlich wählen> , wenn der Benutzer keine Option wählen,

  1. Entfernen Sie die Einstellung select tag aus dem Plugin-JS-Code.
  2. Fügen Sie das <select> -Tag in das <div> ein und fügen Sie dann die CSS- Position hinzu: relative; für dieses <div> in Ihrem CSS.
  3. Position hinzufügen Clip: Rechteck (0,0,0,0); um das <select> -Tag im Plugin-JS-Code auszublenden.

Wenn Sie keine Zeit damit verbringen möchten, den Plugin-Code zu bearbeiten, fügen Sie einfach etwas hinzu wie setAttribute ('style', 'display: visible; position: absolut; clip: rect (0,0,0,0)'); nach der Initialisierung des gewählten Plugins.

Beispiel:

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

Das ist alles. Aaaaaund jetzt... DISCO! :)
** Für Browser, die das Attribut "erforderlich" unterstützen.

Chrom

--2

Feuerfuchs

--1

@Aharito Werden wir damit nicht das Tab-Reihenfolge-Problem lösen?

Danke @Aharito, es funktioniert super mit der gewählten v1.1.0, ersetze einfach $('select.chzn') durch $('.chosen-select') .

Ich dachte, ich hätte diesen Clip ausprobiert: Rec-Trick und habe ein Problem damit gefunden. Vielleicht mit einem älteren Browser? Ich denke, wenn es jetzt funktioniert, ist das großartig.

Ich denke, dass es bei meiner Lösung auch Probleme mit Registerkarten geben kann (ich kann mich nicht erinnern, es ist eine Weile her) - Ich habe die Auswirkungen reduziert, indem ich den Patch nur auf Felder angewendet habe, die das erforderliche Attribut aufweisen.

Wir haben dies für alle Anrufe auf $().chosen() standardized standardisiert

$.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 Das löst nicht das Problem des Tabulators oder Shift-Tabulators in die Auswahl, oder?

@DASPRiD nein .

Was ist damit als mögliche Vertuschung-Lösung.

es ist nicht perfekt, aber tatsächlich verhindert es, dass die ursprüngliche Auswahl angezeigt wird, indem der Fokus auf das nächste ausgewählte Dialogfeld übertragen wird, aber vielleicht ist es ein weiterer Schritt näher

"chosen-select" ist nur ein Selektor für die Selects, die ich mit einer bestimmten Klasse habe, ich bin mir nicht sicher, ob "click focus" alle entsprechenden Ereignisse abdeckt, an denen ich mich anschließen sollte, aber vielleicht kann jemand sagen, was noch fehlt?

es ist auch möglich, dass ich etwas über die gewählte html-Struktur falsch verstanden habe und find("a") zu liberal ist, hat jemand mehr Erfahrung?

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

oh, und " display:visible " sollte doch " display:block " sein oder so? Ursache v isibility:visible ist gültig, display:visible ist es sicher nicht

Was ich gefunden habe, ist, dass, wenn Sie mehrere Auswahlen nebeneinander im selben Container haben, dies alle an die falsche Position verschiebt, sodass die Position: absolute dann die Validierungsmeldung an der falschen Position erscheinen lässt.

Ich habe dies gelöst, indem ich sie abgenommen und wieder in den ausgewählten Container eingefügt habe, wie so

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

Die obige Lösung zeigt nach weiteren Untersuchungen, dass die Tabulatortaste durch die Felder vollständig deaktiviert wird und ich das Problem nicht lösen kann. Sie beseitigt jedoch das Problem des Popup-Auswählens beim Durchblättern, also ist das mehr wichtiges Problem in meinen Augen, ich kann ohne Tabs leben, wenn ich es haben kann, damit das Display nicht kaputt geht. Da immer mehr Leute mobile Geräte verwenden und sowieso nicht Tabs verwenden, betrifft es nur Desktop-Benutzer, immer noch wichtig, aber relativ gesehen überschaubar.

Wenn das jedoch jemand irgendwie löst, bin ich sehr daran interessiert, es herauszufinden.

ok, weiter zu dem, was ich zuvor versucht habe, fand ich heraus, dass die ausgewählten Ereignisse verwendet wurden, und entschied, dass ich, wenn ich ein Ereignis auf der jetzt ausgeblendeten Auswahl durchführte, es entführen und ein ausgewähltes Ereignis auslösen konnte, um es zu öffnen.

ich denke, es funktioniert gut.

$(".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");
    });
});

Ich denke, das ist die beste Version, die ich bisher hatte. Glücklicherweise löst dies das Vorwärts-Tabbing-Problem, es gibt immer noch das Reverse-Tabbing, Sie können nicht rückwärts durch ein Selected-Select blättern, da Sie beim zweiten Tab in das Select-Element sofort wieder auf den Selected-Container fokussieren, d. wieder gefangen, nur in der Lage zu sein, vorwärts zu tippen.

Es könnte eine Idee sein, das vorherige Element im Auge zu behalten, und wenn das Element, das zuvor den Tabulatorfokus hatte, vor dem aktuell fokussierten Element lag, gehen Sie zurück, überspringen dann die Neufokussierung auf das ausgewählte und wählen Sie den vorherigen Tab aus, aber ich bin mir nicht sicher wie das geht.

Nach einer sehr langen Lektüre dachte ich, ich hätte die Vorschläge, die im Laufe der Jahre eingereicht wurden, ausprobiert.

Leider konnte ich den Code von @christhomas nicht zum

Die gute Nachricht ist, dass die neue Funktion von @ghiculescu wie ein Leckerbissen funktioniert, da ich immer noch die vom CDN ausgewählte Datei verwenden und einfach die Funktion in meiner js-Datei verwenden kann.

@DASPRiD @charettes was meinst du damit, dass die Registerkarte nicht mit der geänderten Funktion funktioniert? Bei mir scheint es zu funktionieren

Einfach genug, um tabindex hinzuzufügen: -1 zur Auswahl des Snippets von

Beispiel: http://jsfiddle.net/hq7b426j/

Ich konnte das Problem jetzt sehen! Deine Ergänzung funktioniert super @andreialecu

Übrigens war noch eine weitere Ergänzung nötig. Auf dem iPhone oder anderen nicht unterstützten Geräten funktionierte die Geige nicht richtig. Chosen deaktiviert sich selbst auf dem iPhone und lässt <select> unverändert, und der Code in der obigen Geige würde es verbergen, sodass keine Möglichkeit besteht, mit der Auswahl zu interagieren.

Diese Geige behebt es (indem Sie eine Anzeige hinzufügen: keine Prüfung):
http://jsfiddle.net/hq7b426j/1/

Ach das ist noch besser!! Vielen Dank! Ich teste auch noch, aber ich werde posten, wenn noch etwas kommt

@CaptainN bitte kurz, ich habe das gleiche Problem. wr Ich muss diesen Code setzen. Ich verwende das Inspina-Theme von Wrapbootstrap.

@vidhyaprakash85 Ich bin mir nicht sicher, was du meinst. Ich hatte vor langer Zeit geforkt und einen Pull-Request (#900) geschrieben, aber die Repos sind jetzt nicht mehr synchron und mein Fork ist sehr veraltet. Sie finden es hier, wenn es hilft: https://github.com/adcSTUDIO/chosen

Ich verwende bereits https://github.com/harvesthq/chosen, wie das geht:(

@andreialecu dein Code funktioniert

Danke @christhomas dein Code hat

Weder @christhomas noch @ghiculescu funktionierten bei mir mit einer mehrfach gruppierten Auswahl. überlasse es vorerst der Servervalidierung.

Als ich den @ghiculescu- Patch
Als ich den @christhomas- Patch ausprobierte,

Ich musste das Skript von @ghiculescu ändern, damit ich

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

Andernfalls hat die zweite Reise den Stil entfernt, der in der ersten hinzugefügt wurde:

$.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
}

Ich habe gerade diese zusätzliche Bedingung zur ersten hinzugefügt, wenn: && select.attr('style') != style

@doganmeh Funktioniert hervorragend in Chrome und mobil (mit Chrome), aber in Firefox 53.0 getestet, wo es nicht funktioniert

Auch dieses http://jsfiddle.net/hq7b426j/1/ funktioniert nicht in Firefox 53.0

Hmmm, aber das scheint eher ein Firefox-Problem zu sein, denn wenn Sie mehrmals auf die Schaltfläche klicken, werden Sie sehen, dass Firefox versucht, die Nachricht anzuzeigen (diese wird jedoch nie vollständig gerendert).

Ich habe diese Lösung verwendet. Es ist ganz einfach und funktioniert perfekt:

<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');
    });

es scheint, dass dies nicht funktioniert, wenn Sie mit Mehrfachauswahl ausgewählt haben:
http://jsfiddle.net/jeromax/o5a8aogh/

Ich habe es repariert.

`
$.fn.oldChosen = $.fn.chosen
$.fn.chosen = Funktion (Optionen) {
var select = $(dieses),
is_creating_chosen = !!Optionen;

if (is_creating_chosen && select.css('position') === 'absolut') {
// wenn wir einen Auserwählten erstellen und der Auswahl bereits die entsprechenden Stile hinzugefügt hat
// wir entfernen diese (damit die Auswahl keine verrückte Breite hat), dann erstellen wir die ausgewählten
// dann fügen wir sie später wieder hinzu
select.removeAttr('style');
}

var ret = select.oldChosen(Optionen)

// nur handeln, wenn die Auswahl die Anzeige hat: keine, andernfalls wird die Auswahl nicht unterstützt (iPhone usw.)
if (is_creating_chosen && select.css('display') === 'none') {
// https://github.com/harvesthq/chosen/issues/515#issuecomment -33214050
// tue dies nur, wenn wir ausgewählte (keine Parameter oder Objektparameter) initialisieren und keine Methode aufrufen

  $(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);

}
zurück
}
`

+1

Kann jemand einen Fix dafür festlegen? Es ist ein ziemlich altes Problem und heutzutage eine sehr wichtige Funktionalität. Dankeschön.

Funktioniert nicht mit der neuesten Version.

Dies scheint auch bei der Verwendung von angle-chosen die Formularvalidierung von angle.js zu unterbrechen.

Es ist 2018 und wir haben immer noch das gleiche Problem. Es ist eine Hölle, wie HTML-Standards nicht richtig funktionieren und mit externen Plugins integriert werden können. Verrückte Zeiten :)

Dies bricht auch das von Drupal gewählte Plugin. Siehe https://www.drupal.org/project/chosen/issues/2705891

Konnte keine richtige Lösung dafür finden, außer einer Problemumgehung:

<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;
}

Wenn Sie Chosen für alle select Elemente verwenden, können Sie dieses CSS verwenden, um es sichtbar zu machen (für DOM), aber keine Deckkraft, keine Höhe, absolute Position.

Diese CSS-Selektoren zielen auf ungültige Auswahlelemente ab, wobei einer von ihnen auf multiple abzielt und ein 15px margin-top hinzufügt, um es auf die Mehrfachauswahlelemente zu zentrieren.

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

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

Demo: http://jsfiddle.net/tripflex/2zdeu9oc/

ABER WIRKLICH ... dies sollte bereits von der Chosen.JS-Lib übernommen werden

Hier ist mein Workaround, falls es von Nutzen ist:

// 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 kannst du es im Kontext zeigen? Ich habe deine Lösung ausprobiert und es hat nicht funktioniert.

@AndrewSouthpaw Dies ist mein Code, Fixes funktioniert gut für mich :)

$("#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();

Ich verwende einen etwas anderen Code (basierend auf dem Code hier):

$('.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;
}

Es behandelt nicht die Aktion 'Zerstören', aber es positioniert die Fehlermeldung gut und scheint auf Firefox und Chromiun zu funktionieren. Da der ursprüngliche Selektor nicht ausgeblendet ist, ist der Fehlerhervorhebungsrahmen sichtbar. Update : mit max-height funktioniert es auch im IE. Anderes Update : Fügen Sie tabindex -1 hinzu, um sicherzustellen, dass es keinen Fokus erhält. (während sie noch fokussierbar sind und Fehlermeldungen erhalten).

Es gab eine offene PR, die dies behebt, aber ich denke, sie ist verloren gegangen, seit der andere Thread, auf den sie abzielte, geschlossen wurde. Siehe #2594

@jhedstrom würde das gerne zusammenführen. Wissen Sie, ob diese Bibliothek noch gepflegt wird?

Ich habe etwas Ähnliches wie die Lösung von @eloyesp oben verwendet und das hier geteilt:

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

Danke @jhedstrom, dass du mich in die richtige Richtung

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen
bleepcoder.com verwendet öffentlich lizenzierte GitHub-Informationen, um Entwicklern auf der ganzen Welt Lösungen für ihre Probleme anzubieten. Wir sind weder mit GitHub, Inc. noch mit anderen Entwicklern affiliiert, die GitHub für ihre Projekte verwenden. Wir hosten keine der Videos oder Bilder auf unseren Servern. Alle Rechte gehören ihren jeweiligen Eigentümern.
Quelle für diese Seite: Quelle

Beliebte Programmiersprachen
Beliebte GitHub Projekte
Mehr GitHub Projekte

© 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.