IE6 und CSS(fka IE6 und Javascipt)

Status
Nicht offen für weitere Antworten.

qwerty12309

Grünschnabel
Edit: Hier ist mein Problem im IE6 zu sehen.

Hi, ich brauche erstmal ein wenig Hilfe, das Problem ueberhaupt einzugrenzen.
Also, ich generiere eine oder mehrere Tabellen pro Seite mit Javascript. Diese Tabelle besitzt nur eine Spalte, enthaelt aber pro Zeile jede Menge Daten und Bilder (jeweils einen Datensatz aus der Datenbank); das genaue Aussehen einer Zeile lege ich mit Hilfe von div-Elementen(CSS) innerhalb der Zeile fest.
Das funktioniert in Firefox und Opera. In IE funktioniert es auch, solange nur eine einzige Tabelle auf der Seite generiert wird. Sobald es mehr Tabellen sind, werden die Zeileninhalte der einzelnen Tabellen nach oben verschoben und liegen aufeinander. Die IE Developer zeigt die Tabellenzeilen in der richtigen Groesse ein, aber der Inhalt liegt teilweise zwischen zwei Zeilen.
Komischerweise repariert sich das Layout von selbst, sobald ich in einer bestimmten Reihenfolge die Icons zum Sortieren anklicke. Ich hab davon mal ein Bildschirmvideo gedreht, sonst glaubt mir das wieder keiner: Video
Ich habe den Quellcode zur Ansicht ausgeschnitten, aber komischerweise hat der IE damit keine Probleme: Link
An den Sortier-Icons kann es aber nicht liegen; das Problem blieb das selbe, nachdem ich diesen Codeteil auskommentiert hatte.
Ich bekomme hier langsam die Krise; wenn ich den Bug nicht finde, werd ich das Praktikum nie beenden koennen ;(
Hier die verwendete Javascript-Datei: Datei
Und noch ein wenig mehr Code (PHP):
PHP:
<?
    $groups = array();
    $groupDate = null;
    foreach($headlines as $headline) {
      $headline["body"] =  str_replace("\r\n", "x", $headline['body']);
      $postDate = strftime('%B %Y', $headline["post_time"]);
      if($postDate != $groupDate) {
        $groupDate = $postDate;
        $groups[] = array('header' => $groupDate,
                          'headlines' => array($headline));
      }
      else {
        $groups[count($groups)-1]['headlines'][] = $headline;
      }
    }

    echo '<script src="javascript/search.js"></script>';
    echo "<div id='headlines' class='headlines'>\n";
    $first_group = true;
    $gnr = 0;
    foreach($groups as &$group) {
      echo '<script type="text/javascript">';
      echo 'origDataSet['.$gnr.'] = '.$this->convertArrayToJS( $group["headlines"] ) . ";\n";
      $rows = array ();
      echo 'resultRows['.$gnr.']  = ';
      foreach($group['headlines'] as $key => $headline) {
        $index = 0;
        $index = $headline['post_time'] . $headline['summary_content'];
        $rows["'" . $index . "'"] = $this->printHeadline($headline, $category, $legend);
      }
      echo $this->convertAssocToJS( $rows ) . ";\n";
      echo '</script>';

      echo '<table id="resultsTable'.$gnr.'"><tr><td>';
      echo "<div class='dayheader'>";
      if(sizeof($group["headlines"]) > 2 and $category->rating) {
        echo "<img src='http://www.gamer.nl/images/but_search_sortup.png' id='img_time_sort".$gnr."' ";
        echo " style='vertical-align:middle;padding-right:3px;padding-left:5px;' ";
        echo "onclick=\"javascript:reSortTable('post_time',document.getElementById( 'resultsTable' + ".$gnr." ),'reviews',".$gnr.");\">";
        echo "<span style='padding-right:30px;padding-bottom:3px;position:absolute;right:10px;font-weight:normal;font-size:12px;'>";
        echo "<img src='http://www.gamer.nl/images/but_search_unsort.png' id='img_rating_sort".$gnr."' style='padding-right:3px;vertical-align:middle;' ";
        echo "onclick=\"javascript: reSortTable( 'summary_content', document.getElementById( 'resultsTable' + ".$gnr." ), 'reviews', ".$gnr." );\">";
        echo "rating</span>";
      }
      echo $group['header']."</div>\n";
      echo "<div class='dayblock'>\n";
      echo "<noscript>";
      foreach($group['headlines'] as &$headline) { // show reviews even if javascript is deactivated
        $this->printHeadlineWithoutJS($headline, $category, $legend);
      }
      echo "</noscript>";
      echo "</td></tr></div></table>\n";
      if ($first_group){
        $first_group = false;
      }
      $gnr++;
    }
    ?>
    <script type="text/javascript">
       curSettings.column    = "post_time"
        curSettings.direction = directions.UP;
      window.onload = function() {
        for (var i = 0; i < <?=sizeof($groups)?>; i++) {
          var resultsTable = document.getElementById( "resultsTable" + i );
          showGames( resultsTable, "reviews", i ); // IE6 messes the layout up if we call this function during rendering.
          }
      }
    </script>
    <?
    echo "</div>";
    $o = ob_get_contents();
    ob_end_clean();

    return $o;
PHP:
  function convertArrayToJS( $array ) {
    $totalArray = array();
    foreach( $array AS $item ) {
      if( is_array( $item )) {
        $totalArray[] = $this->convertAssocToJS( $item );
      }
      else {
        $totalArray[] = $item;
      }
    }
    return "new Array( " . implode( $totalArray, ", " ) . " )";
  }

  function convertAssocToJS( $array ) {
    $totalArray = array();

    $item = current( $array );
    do {
      if( is_array( $item )) {
        $totalArray[] = key( $array ) . " : " . $this->convertAssocToJS( $item );
      }
      else if( $item ){
        $item = ( ereg("[^0-9]", $item )? "\"" . addslashes( $item ) . "\"" : $item );
        $totalArray[] = key( $array ) . " : " . $item;
      }
    }
    while( FALSE !== ( $item = next( $array )));

    return "{ " . implode( $totalArray, ", " )  . " }";
  }

Sagt einfach, was ich noch vergessen bzw. nicht beachtet habe.
Und was noch auffaellt, ist dass im IE ein leerer Tag vor der ersten Resultatzeile generiert wird, der ein <div> als Kindelement enthaelt. Kann mir nicht erklaeren, wo der herkommt.

Vielen Dank schon mal fuer eure Hilfe!
 
Zuletzt bearbeitet:
Moin,

nach einigem Probieren bin ich der Überzeugung, dass es sich dabei nicht um ein JS-Problem handelt.

Der IE hat offensichtlich Probleme mit den Angaben "position:relative" bei den div.blockContainer und deren Kindelementen.

Nehme ich diese Angabe bspw. nur mal testhalber bei div.blockContainer heraus, sind zumindest die Texte schon sauber in den Zellen.
Dass die Tabelle von der Struktur her da ist, kannst du sehen, wenn du den Zellen mal testhalber Rahmen verpasst...es sind nur die Inhalte, welche durch deine CSS-Angaben verschoben angezeigt werden.
 
Ja, ich glaube, du hast Recht. Aber je mehr ich versuche ohne position:relativ auszukommen, desto grausamer sieht die Seite aus. Position:absolute zum Beispiel packt mir zum Teil alles auf einen Haufen. Welche anderen Moeglichkeiten gibt es, das Design in dieser Art zu erhalten (ohne noch mal alles neu schreiben zu muessen)? Ich meine, irgendwelche Tricks fuer den IE6? Ich nutze ungern Tabellen zum Positionieren.

Vielen Dank :)
 
Wow, das funktioniert fantastisch! Wie hast du das herausgefunden? Jetzt ist nun nur noch das rechte Sortier-Icon verschoben.

So, back to work...
 
Status
Nicht offen für weitere Antworten.
Zurück