JavaScript Spielereien
Christoph
- zur info
Moin.
Ich bin gerade dabei, Dinge, die ich im stillen Kämmerlein zusammengefrickelt habe der Allgemeinheit zugänglich zu machen. Bisher gibt es:
* den target-Selektor für Opera und IE
* das 1001. JavaScript-Objektsystem
Für (sinnvolle) Verbesserungsvorschläge wäre ich dankbar.
Und wenn wir gerade dabei sind: Hat hier schon jemand Erfahrung mit Dean Edwards' base2 Framework gesammelt?
Christoph
Hallo,
Opera implementiert den target-Selektor in Version 9.5, die wird in absehbarer Zeit veröffentlicht. Solche Browsererkennung hat daher nur eine geringe Halbwertszeit:
return navigator.appName == 'Microsoft Internet Explorer' ||
window.opera;
Den IE kann man mit Conditional Compilation beikommen. Das ist so ziemlich das zuverlässigste. Und man sollte möglichst bekannte und stabile, d.h. gegenwärtige und vergangene Versionen adressieren.
Mathias
Moin.
Solche Browsererkennung hat daher nur eine geringe Halbwertszeit [...] Und man sollte möglichst bekannte und stabile, d.h. gegenwärtige und vergangene Versionen adressieren.
Der Patch ist vorwärts-kompatibel, daher halte ich es für wenig problematisch, wenn zuküntige Versionen halt ein klein bisschen JavaScript zu viel ausführen müssen. Wobei es natürlich kein Problem darstellt, die Abfrage (window.opera) durch (window.opera && (Versionskontrolle)) zu ersetzen, sobald eine Browser-Version erscheint, die die entsprechende Eigenschaft unterstützt.
Das Problem wird sich in Zukunft eventuell auch gar nicht mehr stellen, da ich vorhabe, statt Browser-Versionen abzufragen direkt zu überprüfen, ob in document.styleSheets[#] ein Eintrag mit :target-Selektor auftaucht. Falls ich tatsächlich die Zeit finden sollte, die 'Bibliothek' (etwas hochtrabend, da sie bisher nur eine einzige Funktionalität bietet ;)) zu erweitern, wird es wohl ein dummy-Stylesheet geben, das eingebunden werden muss und Einträge für alle zu patchenden CSS-Eigenschaften enthält.
Christoph
Hallo,
Der Patch ist vorwärts-kompatibel
Ja, insofern, dass dieselbe Style-Regel gleich zweimal greift. Dann wird »nur« unnötigerweise ein wenig JavaScript ausgeführt, das stimmt.
Mein Einspruch ist auch eher grundsätzlicher. Ich sehe keinen Sinn darin, im Jahr 2008 immer noch Code in die Welt zu setzen, der genau das falsch macht, was Scripte vor zehn Jahren auch schon falsch gemacht haben. Damals hieß es if (document.layers) else if (document.all). Die Sache ist die, kein Nutzer aktualisiert fremde Fertigscripte regelmäßig und die wenigsten Autoren pflegen ihre Scripte über Jahre hinweg, sodass z.B. hier im Forum immer noch Leute mit zehn Jahre alten Scripten ankommen. Ich würde daher eher Scripte auf die Welt loslassen, die bekannte Fehler in bekannten Browserversionen beheben und sich in der ungewissen Zukunft sicherheitshalber selbst ausschalten. Dann kann man immer noch bewusst Aktualisierungen vornehmen, um weitere bekannte Versionen zu unterstützen.
Das Problem wird sich in Zukunft eventuell auch gar nicht mehr stellen, da ich vorhabe, statt Browser-Versionen abzufragen direkt zu überprüfen, ob in document.styleSheets[#] ein Eintrag mit :target-Selektor auftaucht.
Manche Browser handhaben das so, vermutlich abgeleitet aus http://www.w3.org/TR/CSS21/syndata.html#rule-sets bzw. http://www.w3.org/TR/css3-syntax/#rule-sets. Aber eigentlich sollen demnach nicht standardkonforme Selektoren ignoriert werden, nicht konforme, aber noch nicht unterstützte Selektoren.
Mathias
Moin.
Manche Browser handhaben das so, vermutlich abgeleitet aus http://www.w3.org/TR/CSS21/syndata.html#rule-sets bzw. http://www.w3.org/TR/css3-syntax/#rule-sets. Aber eigentlich sollen demnach nicht standardkonforme Selektoren ignoriert werden, nicht konforme, aber noch nicht unterstützte Selektoren.
Ich habe mir jetzt eine testRule()-Funktion gebastelt, die versucht, eine CSS-Regel per insertRule()/addRule() hinzuzufügen. Statt auf Browser-Versionen teste ich jetzt darauf, ob die Regel erfolgreich erstellt werden kann und der Selektor den Ausdruck /\b:target\b/i matcht (vgl. hier).
Das scheint in Opera 9.27, IE7, FF2 (jeweils Windows) wie gewünscht zu funktionieren. Hat dieser Ansatz in dieser Form noch konzeptionelle Probleme?
Christoph
Hi,
Das scheint in Opera 9.27, IE7, FF2 (jeweils Windows) wie gewünscht zu funktionieren. Hat dieser Ansatz in dieser Form noch konzeptionelle Probleme?
Sofern das Stylesheet bereits existiert, machen diese Browser keine Probleme. Wenn es noch nicht existiert, dann wird's beim IE kritisch.
Aber auch wenn das Stylesheet existiert, kann es Probleme geben. Browser mit einer auf KHTML-basierenden Engine (Konqueror & Safari) haben (u.a.) mit insertRule() Probleme. Ich weiß jetzt aber nicht, inwieweit das mit der aktuellen Version erledigt ist.
Aber aus Kompatiblitätsgründen ist mein Weg (s. addStyle()) ein anderer: W3C-Browser bekommen ein neues Stylesheet mit createElement() und die Regeln als Textknoten, IEs mit createStyleSheet() und addRule().
Gruß, Cybaer
Moin.
Aber aus Kompatiblitätsgründen ist mein Weg (s. addStyle()) ein anderer: W3C-Browser bekommen ein neues Stylesheet mit createElement() und die Regeln als Textknoten, IEs mit createStyleSheet() und addRule().
Danke für den Hinweise. Ich werde aber wohl beim derzeitigen Mechanismus bleiben: Hänge ich die Eigenschaften einfach als Textknoten in ein style-Element ein, geht mir die Information verloren, ob insertRule()/addRule() Fehler werfen; der IE z.B. weigert sich anscheinend, Selektoren, die er nicht versteht, überhaupt erst anzunehmen...
Christoph