pcworld: Opera: TypeError: Cannot convert 'element' to object

Hallo!

Ich habe ein Userscript geschrieben, welches im Firefox einwandfrei funktioniert.
Im Opera kommt allerdings folgende Fehlermeldung:

Uncaught exception: TypeError: Cannot convert 'element' to object
Error thrown at line 13, column 1 in searchCodeTags(element) in ...

Auszug aus meinem JavaScript:

function searchCodeTags(element) {  
// die folgende Zeile "wirft" die Fehlermeldung:  
 if (element.className == "asm" || element.className == "c" || element.className == "cpp" /* || ... */) {  
  codeTags[codeTags.length] = element;  
 }  
 if (element.hasChildNodes()) {  
  for(var i = 0; i < element.childNodes.length; i++) {  
   child = element.childNodes[i];  
   searchCodeTags(child);  
  }  
 }  
 return codeTags;  
}  
  
// diese Funktion wird folgendermaßen aufgerufen:  
var body = document.getElementsByTagName("body")[0];  
searchCodeTags(body);

Hat jemand eine Idee, wie man dieses Problem beseitigen könnte?
Bzw. wie genau meint er das, dass er die Variable "element" nicht zu einem Object "casten" könne?

Danke für eure Hilfe! :-)

Gruß,
pcworld

  1. Hallo pcworld,

    Hat jemand eine Idee, wie man dieses Problem beseitigen könnte?

    Wenn ich das richtig sehe, bekommst Du mit http://de.selfhtml.org/javascript/objekte/node.htm#child_nodes@title=childNodes zwar alle Kinder von einem Element aber diese müssen nicht zwangsläufig auch (HTML-)Elemente sein: "Gemäß dem DOM stellt bereits ein Zeilenumbruch oder ein Leerzeichen im Quelltext zwischen Elementknoten einen eigenen Text-Kindknoten dar"

    Bzw. wie genau meint er das, dass er die Variable "element" nicht zu einem Object "casten" könne?

    Opera kann aus einem Text kein Objekt machen, wie Du es gern hättest. Du kannst mit http://de.selfhtml.org/javascript/sprache/operatoren.htm#typeof@title=typeof mal prüfen, was "element" in Deiner searchCodeTags Funktion ist. Hier sollte vermutlich dann string anstatt object kommen.

    Mit freundlichem Gruß
    Micha

    1. Ich würde an dieser Stelle eher auf den nodeType (1 für HTML-Nodes vs. 3 für Text-Nodes) prüfen, der bei beiden vorhanden und vor allem browserübergreifend gleich ist.

      Gruß, LX

      --
      RFC 1925, Satz 2: Egal, wie fest man schiebt, ganz gleich, wie hoch die Priorität ist, man kann die Lichtgeschwindigkeit nicht erhöhen.
      1. Danke für eure Hilfe!
        Das Problem war einfach, dass das Script schon ausgeführt wurde, bevor die Seite überhaupt geladen war.
        Habe es jetzt durch ein "unsauberes" <body onload="meinefunction();"> lösen können.

        Gruß,
        pcworld

        1. Liebe(r) pcworld,

          Habe es jetzt durch ein "unsauberes" <body onload="meinefunction();"> lösen können.

          so geht es besser: Autostart eines JavaScriptes (besser gleich ein mit anderen Scripten kompatibler Autostart)

          Liebe Grüße,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
        2. Danke für eure Hilfe!
          Das Problem war einfach, dass das Script schon ausgeführt wurde, bevor die Seite überhaupt geladen war.
          Habe es jetzt durch ein "unsauberes" <body onload="meinefunction();"> lösen können.

          einfacher wäre es, wenn du das Skript vor dem schliessenden body-Tag platzierst, dort kannst du schon auf document.body zugreifen ohne auf den load Event warten zu müssen.

          Aufruf:

          var  body = document.body;  
          searchCodeTags(body);  
          
          

          und in der Funktion searchCodeTags() würde ich den Parameter prüfen, dann hättest du den Fehler gleich einkreisen können:

          function searchCodeTags(element) {  
          if (!element) throw('element existiert nicht!');  
          ....  
          
          

          Struppi.