Bug in jQuery + Safari

Gestern gefunden, mal wieder simpel, aber dennoch doof. Die WebKit-Engine vergisst beim Hinzufügen von neuen Elementen in den DOM-Baum einige Attribute, mindestens aber display und die visibility.

Oder mit anderen Worten: Versteckt man mit jQuery ($.hide()) ein Element vor dem Hinzufügen in den DOM-Baum, so hat dies in allen Browsern ausser Safari eine Wirkung (nämlich versteckt). Versteckt man das Element erst nach dem Hinzufügen, dann funktionierts in allen.

Ich poste anbei ein Script, wo sich jeder davon überzeugen kann..

„Bug in jQuery + Safari“ weiterlesen

jQuery + IE = *würg*

Das Javascript-Framework jQuery hat einen kleinen, aber entscheidenen Bug – bzw. der Internet Explorer einschließlich 7 (8 ungetestet). Da aber beim Letzteren eh schon Hopfen und Malz verloren ist, schiebe ich es auf ein Fehlverhalten des entsprechenden jQuery-Core-Modules.

Um dynamisch ein DIV-Element zu erzeugen, macht man in jQuery mit dem Core-Constructor folgendes:

var jQueryElement = jQuery(‚<div></div>‘).text(‚Text‘);

Natürlich kann man auch direkt „<div/>“ verwenden.

Dies erzeugt ein jQuery-Element, in welchem das DOM-Element verpackt ist. Als Textknoten wird wie erwartet „Text“ gespeichert. Davon kann man sich überzeugen, indem man ein

jQueryElement.text()

ausführt.

Auch wenn ich auf Anhieb in der offiziellen Dokumention (jQuery API) kein Beispiel zeigen kann, ist folgender Code prinzipiell auch erlaubt:

var jQueryElement = jQuery(‚<div>‘).text(‚Text‘);

Das „kaputte“ XML bzw. HTML bzw. XHTML wird automatisch repariert.

Denkste – zwar funktioniert das auf allen Browsern, aber nicht im Internet Explorer. Tatsächlich scheint der Internet Explorer ausgerechnet hier nur valides XML zu erwarten.

Im IE erwartet uns das:

jQuery(‚<div>‘).text(‚Text‘).length == 0

Währenddessen uns Firefox korrekterweise

jQuery(‚<div>‘).text(‚Text‘).length == 1

eine 1 zurückgibt.

Korrekt in beiden:

jQuery(‚<div/>‘).text(‚Text‘).length == 1