2014-01-25 5 views
13

Ich versuche ein Formular zu erstellen, das eine Liste von Standardoptionen enthält und das auch erweitert werden kann, um einige EXTA-Optionen anzuzeigen. Ich tue dies mit dem folgenden CSS-Code:Wie man vorgeht: Geprüfte Arbeit am Android Browser?

.myForm .moreOpts {display:none;} 
.myForm #more:checked +*+ .moreOpts {display:block;} 

mit folgendem HTML:

<form action="#" class="myForm"> 
    <ul> 
    <li> 
     <input type="checkbox" id="pref-1" name="pref-1" value="1"> 
     <label for="pref-1">Foo</label> 
    </li> 
    <li> 
     <input type="checkbox" id="pref-2" name="pref-2" value="2"> 
     <label for="pref-2">Bar</label> 
    </li> 
    <li> 
     <input type="checkbox" id="more" name="more" value="true"> 
     <label for="more">More options</label> 
     <ul class="moreOpts"> 
     <li> 
      <input type="checkbox" id="pref-3" name="pref-3" value="3"> 
      <label for="pref-3">Baz</label> 
     </li> 
     <li> 
      <input type="checkbox" id="pref-4" name="pref-4" value="3"> 
      <label for="pref-4">Qux</label> 
     </li> 
     </ul> 
    </li> 
    </ul> 
</form> 

Demo

Dieser Code funktioniert perfekt in jedem Browser, mit Ausnahme von Android Browser und Dolphin. Ich habe an article gefunden, das this "Bugfix", aber das nur fixes my problem in Dolphin empfiehlt.

Gibt es eine Möglichkeit, dies auch für den Standard-Android-Browser funktionieren zu lassen?

+0

Wirklich? Das funktioniert in jedem Browser? Sogar IE? Ich empfehle die Verwendung einiger König von JavaScript/jQuery Skript/Plugin –

+0

@AdrianFlorescu gut nicht IE8 und niedriger, aber das ist zu erwarten. Mein Problem ist, dass Android Browser dies unterstützen soll, aber es funktioniert nicht dort. [dieses Beispiel] (http://jsbin.com/ojOwUYA/1) funktioniert gut im Android Browser, daher sehe ich nicht, warum der Code in meiner Frage nicht funktioniert. Für IE8- werde ich automatisch alle Optionen als Fallback anzeigen. – Joeytje50

+0

Android Gingerbread funktioniert nicht. Gut, dass ich JellyBean habe. +1 –

Antwort

6

Sie dies mit Hilfe des details Element erreichen eine große Sache ist. Android supports it seit Version 4. Allerdings müssen Sie mit IE und Firefox beschäftigen, aber fortunatly diese Browser unterstützen die CSS3 Pseudo-Staaten, einschließlich :checked.

Zwei verbinden diese beiden, verwenden Sie einfach das Kontrollkästchen hacken in Browsern, die details nicht unterstützen. Hier ist der Prozess in Code erklärt: http://jsfiddle.net/hF6JP/1/

EDIT: dies ist die endgültige Lösung, in der Zusammenfassung setzt Etikett löst das Problem der erzwungenen Checkbox mit den Optionen wechseln: http://jsfiddle.net/mYdsT/

+0

Ihr zweiter Link scheint auf Android nicht zu funktionieren. Das click -Ereignis auf der "label" scheint nicht von der "Zusammenfassung" geerbt zu werden. Ich werde nur die Browser-Erkennung implementieren (da Feature-Erkennung für diesen Fehler nicht funktioniert, da [der Selektor scheint zu funktionieren, wenn er beim ersten Pagerender verwendet wird] (http://jsbin.com/IvicihIM/1/) .Ich werde dann das DOM für den Standard-Android-Browser und Dolphin (die beide die gleiche User-Agent-Zeichenfolge verwenden) ändern. Ich werde dies als akzeptiert markieren, wenn es keine besseren Antworten gibt (was ich nicht wirklich erwarte, aber ich möchte zuerst darauf warten). Vielen Dank! – Joeytje50

2

Ich würde :checked für alle Browser nicht vertrauen. Ich würde das Ereignis click von #more erfassen und einfach eine Klasse zum übergeordneten Element hinzufügen. Es ist einfach mit jQuery. Diese Option funktioniert in Android und IE8.

$("#more").on("click", toggleCheckboxes); 
var toggleCheckboxes = function(evt){ 
    var $this = $(this); 
    $this.parents("li").toggleClass("show-more-options"); 
    evt.preventDefault() 
} 



.myForm .moreOpts { 
    display:none; 
} 
.myForm .show-more-options .moreOpts { 
    display:block; 
} 

:checked nicht in IE8 unterstützt, die leider immer noch

kann

https://developer.mozilla.org/en-US/docs/Web/CSS/:checked

+0

Danke für diesen Vorschlag, aber ich bin auf der Suche nach einer Möglichkeit, dies ohne JavaScript zu machen. – Joeytje50

1

http://quirksmode.org/css/selectors/mobile.html#t60

:checked funktioniert anscheinend in keiner Android-Version. Ich bin mir nicht sicher, warum so viele Webseiten berichten, dass es funktionieren sollte (anscheinend von 2.1 aufwärts), aber das ist falsch.

Das Schöne an QuirksMode ist, dass jedes Feature tatsächlich in einem echten Browser getestet wird, bevor es im Internet veröffentlicht wird.

JavaScript scheint die beste Lösung zu sein. Ich würde sogar Javascript empfehlen, denn wenn ein Benutzer das "mehr" Feld anschaut, dann wählt er einige der zusätzlichen Optionen aus und deaktiviert dann das "mehr" Feld ... die zusätzlichen Auswahlen werden immer noch "überprüft" und werden gesendet, wenn a Benutzer trifft einen "Senden" -Button. Sie müssen die Kontrollkästchen jedes Mal deaktivieren, wenn das Kontrollkästchen "Mehr" deaktiviert ist. Der einzige Weg, dies zu tun, ist mit Javascript.

UPDATE: Quirksmode hat einen fehlerhaften Test für den :checked Selektor geschrieben:

:checked { 
    display: inline-block; 
    width: 3em; 
} 

Sie werden feststellen, dass auf Android die Breite ändert mich nie ... aber dies ist aufgrund der Tatsache, dass Android nicht Wenden Sie eine Breite auf Checkboxen und Radios an (während Desktop-Browser dies tun).

Die folgende tut Arbeit, auch in meinem Android 2.3:

:checked { 
    display: inline-block; 
    margin: 3em; 
} 

So, wie es in anderen Kommentaren erwähnt, ist das Problem mit der Kombination des geprüften Selektor und dem benachbarten Geschwister-Selektor:

:checked + .test { /* does not work on android :(*/ } 
:checked ~ .test { /* does not work on android :(*/ } 
+0

Dann ist Quirksmode teilweise falsch. Ich habe 'checked' selbst getestet, und es funktioniert gut, wenn es nicht in komplizierten Situationen wie in dieser Frage verwendet wird. [This JSBin] (http://jsbin.com/IZOZeDe/1/edit/) rendert als [this] (http://i.imgur.com/apPjCdr.png), und es wird sogar [dynamisch geändert] (http://i.imgur.com/XeA57RQ.png), da in diesem Bin so einfache Selektoren verwendet werden. [This JSBin] (http://jsbin.com/IZOZeDe/2/edit/) verwendet jedoch ': checked' zusammen mit' ~ ', so dass Android Browser [einfach nicht mehr damit umgehen kann] (http: // i .imgur.com/6OY6c3a.png). Also, ': checked' funktioniert, nur nicht vollständig. – Joeytje50

+0

Als Antwort auf Ihre spätere Bearbeitung bezüglich der Tatsache, dass die Checkboxen immer noch aktiviert sind, wenn der Benutzer das Feld "Weitere Optionen" versteckt, ist es wirklich einfach, auf dem Server nach einem "if" zu suchen Block, der überprüft, ob der Parameter 'more' des Formulars auf' 'true '' gesetzt ist (deshalb hat dieser Eingang auch einen' name' und einen 'wert' gesetzt). Das ist überhaupt kein Problem. – Joeytje50

+0

Cool, ich habe Sie gerade darauf aufmerksam gemacht, dass sich versteckt! == un-checking;). Und QuirksMode schreibt Tests für jeden der Selektoren, aber ihre Tests für diese Funktion sind fehlerhaft. Ich habe meine Antwort aktualisiert. –