Patrick Andrieu: Opera: document.write in mit display:none verstecktem Element

Hallo alle!

Ich möchte die von einem Page-Views-Counter-Script zurückgegebene Graphik nicht anzeigen lassen (auch wenn dies ein transparentes GIF ist), weil das Script immer eine gewisse Bearbeitungszeit braucht, und in dieser Zeit wird ja ein Platzhalter gezeigt.

Also habe ich den JavaScript-Code in einem Container gepackt, dem ich die CSS-Eigenschaft display:none zuweise:

#nothing_to_see {
display:none;
}

<div id="nothing_to_see">
<script type="text/javascript">
<!--
document.write('<img src="http://example.com/cgi-bin/counter.pl?seite=testseite&ref=',escape(document.referrer),'" alt="">')
//-->
</script>
<noscript>
<img src="http://example.com/cgi-bin/counter.pl?seite=testseite">
</noscript>
</div>

Versuche mit Mozilla, FF, IE und Opera (8.54 und 9.01) und eine Auswertung der Statistik zeigen, dass bis auf die Operas alle die Anweisung ausführen: Der Besuch der "testseite" wird gezählt. Wenn ich statt display:none visibility:hidden angebe - was in diesem Fall den gleichen Effekt hat: die Graphik wird nicht gezeigt - dann sehe ich die Operas (und die anderen auch) in der Statistik.

Als neugieriger Mensch möchte ich einfach wissen, warum document.write von den Operas in diesem Fall ignoriert wird. Andere JavaScript-Anweisungen wie ein alert oder mittels getElementById geänderte style-Eigenschaften sichtbarer Elemente funktioniert tadellos.

Viele Grüße aus Frankfurt/Main,
Patrick

--

_ - jenseits vom delirium - _
  1. Hallo Patrick,

    Als neugieriger Mensch möchte ich einfach wissen, warum document.write von den Operas in diesem Fall ignoriert wird. Andere JavaScript-Anweisungen wie ein alert oder mittels getElementById geänderte style-Eigenschaften sichtbarer Elemente funktioniert tadellos.

    Elemente, die per display:none; ausgeblendet werden, bilden keine "Box" mehr. Opera denkt sich nun "Wenn keine Box da ist, dann muß ich mich auch um ihren Inhalt nicht weiter kümmern." Dein Problem ist daher hauptsächlich auch, daß das Bild gar nicht erst geladen wird (Du würdest denselben Effekt beobachten, wenn Du den Code für das Bild nicht per JavaScript generieren würdest, sondern es direkt per HTML-Code innerhalb des versteckten div-Elementes eingebunden werden würde.

    Deine übrigen Tests (alert, Änderung der Style-Eigenschaften sichtbarer Elemente) haben nichts mit dem Inhalt der nicht vorhandenen Box zu tun und werden daher normal ausgeführt.

    Eine weitere Mögglichkeit, Elemente zu verstecken, ohne daß sie Platz einnehmen, aber weiterhin "da" sind wäre die folgende (oder ähnliches):

    #nothing_to_see {  
      height:0;  
      width:0;  
      overflow:hidden;  
      position:absolute;  
      left:-10000px;  
    }
    

    Viele Grüße
    Carsten

    1. Hallo Carsten!

      Und danke für die Antwort!

      Elemente, die per display:none; ausgeblendet werden, bilden keine "Box" mehr. Opera denkt sich nun "Wenn keine Box da ist, dann muß ich mich auch um ihren Inhalt nicht weiter kümmern."

      Ja, sowas dachte ich mir ja auch. Mich wundert's nur, dass die anderen drei es doch machen.

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --

      _ - jenseits vom delirium - _