Code Styling Project

It’s not a bug, it’s always a feature.
  • Deutsch
  • English
  • rss
  • Home
  • Blog
  • Impressum
  • Entwicklungen
  • Fehlerbehebungen
  • Anleitungen

jQuery 1.3.2 verursacht Probleme im IE 8

codestyling | 20. Juni 2009 | 21:44

Ich wurde von einigen Nutzern informiert, das etwas nicht stimmt, wenn man jQuery 1.3.2 mit dem Microsoft Internet Explorer 8 im Normalmodus (nicht im Kompatibilitätsmodus) benutzt. Der Effekt ist erschreckend, denn einige Handler, die Teile der Webseite ein- bzw. ausblenden sollen, reagieren einfach nicht.
Wieder habe ich mich auf die Suche begeben, was dahinter stecken könnte und ob das schon bekannt ist. Ich habe wieder etwas dazu gefunden und zeige hier eine Umgehungslösung.

Als Einstieg in die Problematik möchte ich erst einmal den HTML Markup und den dazu gehörigen jQuery Code zeigen, der Teile des Markups ein- und ausblenden soll.

HTML Markup

HTML
1
2
3
4
5
6
7
8
9
10
<a id="rowtoggler" href="#rowtoggler">Toggle rows</a>
<table>
  <tr><td>First row (always visible)</td></tr>
  <tr class="rowtoggler" style="display:none">
    <td>Second row (hidden initially, can be toggled)</td>
  </tr>
  <tr class="rowtoggler" style="display:none">
    <td>Third row (hidden initially, can be toggled)</td>
  </tr>
</table>
timing: 0.008s

jQuery Code

Javascript
1
2
3
4
5
6
jQuery(document).ready( function($) {
  $('#rowtoggler').click(function() {
     $('.'+$(this).attr('id')).toggle();
     return false;
  });
});
timing: 0.004s

Was passiert nun, wenn man den Link anklickt? Die Tabellenzeilen sollen basierend auf ihrem derzeitigen Zustand angezeigt bzw. versteckt werden. Aber im IE 8 passiert schlicht gar nichts.
Aber welchen Grund gibt es dafür, insbesondere weil der IE8 im Kompatibilitätsmodus (wenn er einen IE 7 simuliert) damit keine Probleme zu haben scheint.

Ich fand schließlich im jQuery Bug Trac folgenden Eintrag: $().toggle() does not work with <tr> in IE 8 und habe daraufhin meine eigene Untersuchung gestartet, basierend auf dieser Meldung.

Ergebnisse der Untersuchung

Ich begann zuerst mit sehr einfachen Tests und habe mir den Sichtbarkeits-Status der Elemente selbst ausgeben lassen mit alert($(elem).is(’:visible’)) und ebenso mit alert($(elem).is(’:hidden’)). Ich war schockiert, also der IE 8 die Zeilen, die per inline style auf display:none gestellt waren, als sichtbar gemeldet hat! Es scheint auch so, daß die normale toggle() Methode diesen Test so macht und deswegen nichts zu passieren scheint. Folgendes kann man also zusammenfassen:

  1. Methode .is(’:visible’) arbeitet nicht wie erwartet
  2. Methode .is(’:hidden’) arbeitet nicht wie erwartet
  3. Methode .toggle() arbeitet nicht wie erwartet (scheint mit den o.g. Methoden zusammen zu hängen)

Ausgehend von diesem schlechten Verhalten des IE 8 habe ich einen Ersatz entwickelt, der bisher funktionierende Browser nicht beeinträchtigt aber den IE 8 dazu befähigt, das auch zu können.

jQuery Ersatzlösung für alle Browser

Dieser Ersatz funktioniert weiterhin in allen Browsern wie bisher nur das nun auch der IE 8 mitspielt und mit der toggle() Methode was anfangen kann. Ich habe für die beiden Methoden is(’:visible’) und is(’:hidden’) keine separate Lösung hier gezeigt, aus dem Nachfolgenden kann man sich die aber leicht selbst ableiten.

PHP
1
2
3
4
5
6
7
8
jQuery(document).ready( function($) {
  $('#rowtoggler').click(function() {
     $('.'+$(this).attr('id')).each(function(i, elem) {
	$(elem).toggle($(elem).css('display') == 'none');
     });
     return false;
  });
});
timing: 0.036s

Ich hoffe, daß dies vom jQuery Team schnellst möglich gefixet wird. Ich befürchte aber auch, das Projekte wie WordPress nicht so schnell updaten werden, wenn jQuery eine bereinigte Version verfügbar hat. Deshalb ist es derzeit der einzige Weg, solche Probleme zu umgehen, indem man mehr Code schreibt als nötig ist.

Ergänzung: Mir ist bewusst, das es nicht nur ein jQuery Problem ist, sondern auch Microsoft eine gehörige Aktie an diesem Problem trägt. Nur leider ist es im IE 8 nun mal passiert und das Script-Framework muss es Wohl oder Übel abfangen. Denn man kann immer mal wieder auf einen Browser treffen, der im aktuellen IE 8 Zustand ist. Dort sollte es aber trotzdem funktionieren.

Kategorien
Deutsch, jQuery in WordPress
RSS Kommentare
RSS Kommentare

« “WP System Health” - wie geht’s meinem WordPress WordPress Plugins und “Changelog” - eine sinnvolle Erweiterung »

13 Antworten    Schreib einen Kommentar

Alexander

Alexander

21.06.2009 | 10:28

Danke für die schnelle Reaktion auf das gemeldete Problem.

Natürlich auch, dass du die Probleme, sowie die Lösung der Allgemeinheit zur Verfügung stellst.

Wie gesagt,

Danke

Gruß Alexander

Antworten »

Dennis

Dennis

21.06.2009 | 23:51

Die Probleme mit Tabellen im IE und jQuery sind lange bekannt. Die sauberere Lösung ist, wie auch die meisten Codes im jQuery-Doc, alles über Listen und Divs zu realisieren.

Antworten »

codestyling

codestyling

22.06.2009 | 01:01

Tabellen sind nun mal dazu da, tabellarische Daten auszugeben. Solange die Browser nicht das CSS 5 Tabellen DIV Styling alle kennen, macht es keine Freude, sich damit zu befassen. Sobald die Browser (oder der überweigend genutzte Teil) das können, keine Frage.
Nur sollten JS Bibliotheken das mittlerweile auch im Griff haben. Und es ist bei Weitem nicht nur der IE betroffen. Opera und jQuery 1.2.6 zertrümmert Tabellen dabei, Safari 4 ist reagiert unvorhergesehen und kann keine nachgeladenen SELECT’s ausklappen, Chrome kann nicht mit Prototype.js usw.

Antworten »

Philip

Philip

29.06.2009 | 09:08

Bin vor kurzem auf den Blog gestoßen, und fand es gut, und jetzt gerade hatte ich das Problem mit dem IE8 und habe mich an dein Blog erinnert. Klasse. Danke. Du hast mir echt super viel Arbeit erspart.

Antworten »

Matthias

Matthias

08.07.2009 | 09:52

Vielen Dank für diesen Eintrag =)

Antworten »

Olaf

Olaf

08.07.2009 | 12:23

Vielen Dank für den Blog… hat mir geholfen!!

Antworten »

sxs

sxs

27.07.2009 | 12:15

Hi,

genau Dein Problem ist der Grund, warum man DOM-Elemente nicht per inline Style auf display: none stellen soll.

Ich habe das ganze mal korrekt nach jQuery-Art nachgebaut:

		First row (always visible)
		Second row (hidden initially, can be toggled)
		Third row (hidden initially, can be toggled)
		/*  */

Fazit: funktioniert einwandfrei im IE8 :-)

Antworten »

codestyling

codestyling

27.07.2009 | 12:52

Sorry, aber falls da Code dabei war, der ist nicht nicht übermittelt worden. Ich habe nichts enfernt.
Du kannst mir das ja per Mail schicken, dann korrigier ich den Kommentar.

Antworten »

Poul

Poul

12.01.2010 | 18:04

Warum erwähnt hier keiner was von ?
So hab ich das nämlich gelöst. Ist zwar mehr HTML aber das war dann Meine Lösung zu diesem Problem :-)
Einfach alle TRs nochmal mit TBODY umhüllen und darauf den toggle anwenden!

aber ich suche grade nach einer Lösung für ein anderes Probem (Deshalb bin ich hier “gelandet”) und der IE wirft ich mit meiner Arbeit schon wieder 2 Tage zurück und ich müsste schon längst fertig sein.. Wenn ich einen Microsoft-Entwickler treffe und der mir sagt das er im “IE-Team” ist dann Gnade Gott!

Antworten »

Poul

Poul

12.01.2010 | 18:05

ach und schon mal was von htmlspecialchars() gehört?

Antworten »

Yggxx

Yggxx

05.04.2010 | 21:49

Hallo,

ich bin auf der Suche nach einer Lösung für das Problem “IE8 + jQuery + Accordeon-Skript” auf diesen Blog gestossen. Wenn ich dich richtig verstehe, soll deine Lösung das Problem beheben. Könntest du evtl. noch ausführen, was wie wo gemacht werden muss, um den Fehler zu korrigieren?
Mich interessieren die Probleme an sich nicht (mehr) wirklich, und ich will auch gar nicht (mehr) verstehen, warum wo was wie gemacht werden muss. Mich ärgert einfach nur noch die für solche Korrekturen verplemperte Zeit.

Deswegen gilt dir (und auch allen anderen, die sich damit auseinandersetzen) umso mehr mein Respekt!

Antworten »

Detlef

Detlef

20.06.2011 | 10:27

Hallo,

mein Problem im Zusammenhang mit dem IE8, sämtliche Animationen laufen stockend,
auch ohne Video.

Fährt man mit der Maus auf das Bildmenü (6 Bilder), werden Hintergrundbilder umgefadet.
http://typo3.p141561.mittwaldserver.info/startseite.html

Im Firefox läuft wie zu erwarten alles so wie es soll.

Auch im nächsten Beispiel, ein Ticker, der im Firefox fließend funktioniert stockt im IE unzumutbar.
http://typo3.p140294.mittwaldserver.info/

Kann man das Problem irgendwie beheben?

Antworten »

codestyling

codestyling

22.06.2011 | 06:10

Ich hab leider zu wenig Erfahrung mit Typo 3 und auch kein lokales Testsystem dafür. Um dieses Problem lösen zu können, müsste ich es nachstellen, dazu fehlt mir momentan aber leider die Zeit, weil ich in High Risk Projekten gefangen bin.

Antworten »

Du kannst diese Tags verwenden : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Navigation

  • Allgemein
  • jQuery in WordPress
  • Politik
  • WordPress (DE)

Suche

Neuere Beiträge ...

  • WordPress 2.8 - Sprachdatei Speicherverbrauch minimieren
  • Sprache der Administration - wie hätten Sie es denn gern ?
  • WordPress Lokalisierung - entdecke die Möglichkeiten
  • Neue Profile für Plugin Autoren auf wordpress.org
  • WordPress Plugins und “Changelog” - eine sinnvolle Erweiterung

Ältere Beiträge ...

  • “WP System Health” - wie geht’s meinem WordPress
  • Probleme mit WordPress 2.8 lösen
  • WordPress 2.8 und das jQuery Update
  • “Page Columnist” - Artikel & Seiten in Spaltenformat
  • Plugin Kompatibilitäts-Check von BraveNewCode
rss RSS Kommentare valid xhtml 1.0 design by jide powered by Wordpress get firefox