Urba: Selbst erzeugter Hint wird nicht mehr angezeigt

Hallo Leute,

Ich habe folgendes Problem. Auf einer meiner Seiten die nur intern genutzt wird werden beim überfahren mancher Textzüge Hinweise in Form eines selbst erzeugten Hints angezeigt. Code dazu :

<div id="hint" style="position:absolute;visibility:hidden;z-index:999"></div>
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
<!--
        //Hintposition
        Xoffset=+0;
        Yoffset=+20;

var skn;

var ns4 = document.layers
        var ns6 = document.getElementById&&!document.all
        var ie4 = document.all

if (ns4) skn = document.hint; else
        if (ns6) skn = document.getElementById("hint").style; else
        if (ie4) skn = document.all.hint.style;

if(ns4)document.captureEvents(Event.MOUSEMOVE);
        else{
          skn.visibility = "visible"
          skn.display = "none"
        }

document.onmousemove = get_mouse;
        document.onmouseout  = kill;

function popup(msg){
          //Breite festlegen
          var hintsize = "width:250px;";
          if (msg.length < 50) hintsize = "";
          //Inhalt eintragen
          var content= "<table border=0 style='"+hintsize+"border:1px solid;border-color:#87A8C9;' cellpadding=2 cellspacing=0 bgcolor='#E6EDF5'>"+
                 "<tr><td align=left><div style='font-family:Arial,Helvetica,sans-serif;font-size:12px;color:#000000;'>"+msg+"</div></td></tr></table>";
          if(ns4){skn.document.write(content);skn.document.close();skn.visibility="visible"}
          if(ns6){document.getElementById("hint").innerHTML=content;skn.display=''}
          if(ie4){document.all("hint").innerHTML=content;skn.display=''}
        }

function get_mouse(e){
          //Koordinaten auslesen
          var x=(ns4||ns6)?e.pageX:event.x+document.body.scrollLeft;
          skn.left=x+Xoffset;
          var y=(ns4||ns6)?e.pageY:event.y+document.body.scrollTop;
          skn.top=y+Yoffset;

//prüfe ob in Fenster passt
          var fensterbreite = document.body.offsetWidth;
          var divbreite     = parseInt(skn.left) + 250;
          if (divbreite > fensterbreite) {
            skn.left = parseInt(skn.left) - (divbreite - document.body.offsetWidth) - 10;
          }
        }

function kill(){
          if(ns4){skn.visibility="hidden";}
          else if (ns6||ie4) skn.display="none"
        }
-->
</SCRIPT>

Die Seite ist nun noch nicht vollständig validiert. Unter anderem wurde der Doctype noch nicht gesetzt. Das liegt daran daß ich mich mit obigem Code lange genug herumgeschlagen habe und das ganze nur ohne Doctype funktioniert, darüberhinaus war eine vollständige Validierung bisher nicht erforderlich! Wenn ich

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">

der Seite voranstelle wird der Hint nur noch oben link bei 0,0 angezeigt. Kann mir jemand sagen woran das liegt? Ohne Doctype funktioniert es wie gesagt.

Gruß
Urba

  1. hi,

    Die Seite ist nun noch nicht vollständig validiert. Unter anderem wurde der Doctype noch nicht gesetzt. Das liegt daran daß ich mich mit obigem Code lange genug herumgeschlagen habe und das ganze nur ohne Doctype funktioniert,

    Weil die Browser dann deinen Fehler, ungültige CSS-Angaben zu machen, großzügig korrigieren.

    Längenangaben in CSS erfordern _immer_ eine Einheit, sofern der Wert nicht 0 ist.

    darüberhinaus war eine vollständige Validierung bisher nicht erforderlich!

    Sie ist immer erforderlich.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">

    language ist veraltet.

    <!--

    HTML Kommentare sind nur nötig, wenn du mit Browser der 1. Generation rechnest

    var ns4 = document.layers
            var ns6 = document.getElementById&&!document.all
            var ie4 = document.all

    Bei deinem Code würde es durchaus ausreichen, einfach zu testen, was du verwendest.

    if(ns4)document.captureEvents(Event.MOUSEMOVE);
            else{
              skn.visibility = "visible"
              skn.display = "none"
            }

    Also was die Sachen miteinander zu tun haben ist mir rätselhaft und warum der Netscape 4 Browser das Element nicht verstecken darf. Ausserdem würde eine angabe reichen, also entweder mit visibility oder mit display (was in deinem Fall zu bevorzugen ist)

    function popup(msg){
              //Breite festlegen
              var hintsize = "width:250px;";
              if (msg.length < 50) hintsize = "";

    Da du hier die Mindestbreite von der Textlänge abhängig machst, wäre eine Angabe in em sinnvoll.

    //Inhalt eintragen
              var content= "<table border=0 style='"+hintsize+"border:1px solid;border-color:#87A8C9;' cellpadding=2 cellspacing=0 bgcolor='#E6EDF5'>"+
                     "<tr><td align=left><div style='font-family:Arial,Helvetica,sans-serif;font-size:12px;color:#000000;'>"+msg+"</div></td></tr></table>";

    Das ist grausam.
    Wozu denn dieses Konstrukt? Hier ist nichts was eine Tabelle nötig macht, im gegenteil du musst so sogar noch wesentlich mehr Angaben machen um das gewünschte Erscheinungsbild zu erreichen.
    Im Prinzip würde msg reichen, da du die anderen Angaben problemlos über die style Eiegnschaft ändern könntest oder direkt im CSS da sich die Werte ja nicht ändern.

    function get_mouse(e){
              //Koordinaten auslesen
              var x=(ns4||ns6)?e.pageX:event.x+document.body.scrollLeft;
              skn.left=x+Xoffset;
              var y=(ns4||ns6)?e.pageY:event.y+document.body.scrollTop;
              skn.top=y+Yoffset;

    Hier kommen die Probleme warum du keinen DOCTYPE angeben kannst, einmal wie wahsaga schon schrieb, fehlen hier die Einheiten und dann ist document.body im IE nicht richtig, im Standardmode ist es document.documentElement, was sich vor allem bei der Fensterbreitenermittelung bemerkbar macht.
    Wie man es macht kannst du hier nachlesen: http://www.quirksmode.org/viewport/compatibility.html#link2

    Struppi.

    --
    Javascript ist toll (Perl auch!)