Volker: mouseover fromelement Exception

Hi,

ich habe hier ein Problem bei einem Mouseover. Ich arbeite mit fromElement und toElement um das Bubbling abzufangen. Befindet sich in der Unterstruktur ein Inputfeld und verlasse ich dieses mit der Maus wird ein Mouseover gemeldet, bei dem die Maus aus einem Div Element kommt das eigentlich gar nicht existiert und auf dessen Attribute man nicht zugreifen kann. Jeglicher Versuch das unbekannte Element aufzufinden ist gescheitert, obwohl es laut element.contains voprhanden ist. Ich denke das hier irgendwo ein implizietes DIV in den Baum gesetzt wird, warum aber? Die Seite ist XHTML strict valide und somit sollte auch der DOM Baum valide sein sollte.

Ich habe hier mal ein reduziertes Beispiel, in diesem arbeite ich mit einem UL als übergeordnetes Objekt (mit divs daselbe Problem). Im ganzen Code gibt es kein div. Warum also die Exception "Fehler: uncaught exception: Die Erlaubnis für das Lesen der Eigenschaft HTMLDivElement.id wurde verweigert"?

  
<?xml version="1.0" encoding="iso-8859-1"?>  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<title>Test</title>  
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />  
  
<script type="text/javascript">  
//<![CDATA[  
  
function over(event) {  
 event = event || window.event;  
 var fromElement = event.relatedTarget || event.fromElement || false;  
 document.getElementById('debug').innerHTML += "<br>";  
 document.getElementById('debug').innerHTML += fromElement.id;  
}  
  
//]]>  
</script>  
<style type="text/css">  
img { display: block; border: 0; width: 95px; height:20px; background-color:gray}  
li {list-style:none inside}  
</style>  
</head>  
<body id="body" onload="document.getElementById('ul').onmouseover = over;">  
 <ul id="ul">  
  <li id="li1"><a href=""><img id="img1" alt="" src="" /></a></li>  
  <li id="li2"><form id="form" action="" method="post">  
  <p id="p" style="display:inline">  
   <input id="input" name="" type="text" style="width: 91px;"/>  
  </p>  
  </form></li>  
  <li id="li3"><a href=""><img id="img2" alt="" src="" /></a></li>  
 </ul>  
<p id="debug"></p>  
</body>  
</html>  

  1. Hallo,

    var fromElement = event.relatedTarget || event.fromElement || false;
    document.getElementById('debug').innerHTML += "<br>";
    document.getElementById('debug').innerHTML += fromElement.id;

      
     if (fromElement)  
        document.getElementById('debug').innerHTML += fromElement.id;  
    
    

    macht's sicherer ...

    Gruß plan_B

    --
         *®*´¯`·.¸¸.·
  2. Hallo,

    das ist ein sehr obskurer Gecko-Bug. Das anonymous-div liegt *im* input. Wie man das umgehen kann? Dummerweise gar nicht, weil die Eigenschaften des Elements nicht lesbar sind (wie du festgestellt hast) und die Methoden nicht ausführbar. Also müsstest du wohl mit try {...} catch (e) {...} arbeiten und die Exception abfangen. Wenn das Attribut nicht lesbar ist, einfach die Funktion beenden.

    Wahrscheinlich gibts noch was eleganteres, aber ich weiß ja nicht, worauf du letztendlich hinaus willst.

    Mathias

    1. das ist ein sehr obskurer Gecko-Bug. Das anonymous-div liegt *im* input.

      Danke, das hat mir sehr geholfen. Ich war echt verzweifelt. Ich werde mir dann ein Workaround überlegen.

      Also müsstest du wohl mit try {...} catch (e) {...} arbeiten

      Was leider nicht funktioniert. Idee?

      Wahrscheinlich gibts noch was eleganteres, aber ich weiß ja nicht, worauf du letztendlich hinaus willst.

      Ich habe verschiedene Menüelemente gruppiert (per Attribut) und möchte beim mouseover/out wissen ob ich eine Gruppe betrete/verlasse. Da die Elemente teilweise parallel angeordnet sind kann ich mit contains() nicht arbeiten. Ich denke, wenn es gelänge die Exception abzufangen wäre mir geholfen, da ich ja weiß welches Element die Exception wirft.

      Danke und Gruß

      1. Hallo,

        Also müsstest du wohl mit try {...} catch (e) {...} arbeiten
        Was leider nicht funktioniert. Idee?

        »Funktioniert nicht« ist keine Fehlerbeschreibung, mit der ich dir weiterhelfen könnte... ;)

        In den try-Block setzt du den Code, der die Exception auslöst. Wenn du ein Attribut zur Gruppierung nutzt, dann kommt in den try-Block die Anwendung, in der versucht, das Attribut auslesen (im Beispiel die Zeile mit fromElement.id). Wenn das nämlich schiefgeht, dann wird eine Exception geworfen.

        Im Catch-Block kannst du irgendeinen Flag setzen, sodass du nach dem Block weißt, dass ein Fehler passiert ist (wenn ja, dann willst du wahrscheinlich die Event-Verarbeitung abbrechen, weil es sich um einen für die Logik nicht relevanten Event handelt).

        Ich habe verschiedene Menüelemente gruppiert (per Attribut) und möchte beim mouseover/out wissen ob ich eine Gruppe betrete/verlasse. Da die Elemente teilweise parallel angeordnet sind kann ich mit contains() nicht arbeiten.

        Zeig am besten Mal den relevanten Code, so kann ich mir das besser vorstellen.

        Mathias

        1. »Funktioniert nicht« ist keine Fehlerbeschreibung, mit der ich dir weiterhelfen könnte... ;)

          Hi,

          ich hatte einfach die entsprechende Anweisung in einen try-catch-Block gesetzt, aber die Exception wurde trotzdem geworfen.

          Allerdings hatte sich noch an anderer Stelle im Code ein Zugriff auf das anonyme Div versteckt, da hatte ich nicht mehr dran gedacht. Diesen ebenfalls eingeklammert und es läuft. Im catch Block liegt jetzt mein Workaround, denn wenn die Exception geworfen wird weiß ich ja auf welchem Element ich war ...

          Also nochmal besten Dank

          Volker