Was ist an dem Code falsch?
Jörg Dutschke
- javascript
Hallo!
Ich habe ein wenig Sourcecode, der nicht das tut was er soll. Da ich nicht mehr weiß, was ich tun soll,
stelle ich ihn mal hier rein. Viele Augen sehen mehr als zwei :-)
In der HTML-Datei steht folgendes (nur das relavante) im HEAD-Tag:
<SCRIPT LANGUAGE="JavaScript1.2" TYPE="text/javascript">
<!--
if (window.name != 'nav')
{location.href='index.htm'};
// Browser-Check
NS4 = (document.layers);
IE4 = (document.all);
ver4 = (NS4 IE4);
isMac = (navigator.appVersion.indexOf("Mac") != -1);
isMenu = (NS4 (IE4 && !isMac));
/* die folgenden Funktionen werden von den Links aufgerufen und schon hier vordefiniert,
damit auch "alte" Browser das verstehen können.
Die eigentlichen Funktionen werden später im Menüscript re-declared .... */
function popUp(){return};
function popDown(){return};
if (!ver4) event = null;
-->
</script>
<SCRIPT LANGUAGE="JavaScript1.2" TYPE="text/javascript">
<!--
if (isMenu) {
document.write("<SCRIPT LANGUAGE='JavaScript1.2' SRC='menu.js'></SCRIPT>");
}
//-->
</SCRIPT>
....... usw ..............
Die Datei menu.js enthält folgenden Code:
isFrames = true;
mainFrName = "wmain";
TopPosition = 0;
loader = (isFrames) ? (NS4) ? parent : parent.document.body : window;
loader.onload = startIt;
isLoaded = false;
areCreated = false;
menuLoc = null;
function NSunloaded()
{
isLoaded = false;
}
function NSloaded(e)
{
if (e.target.name == mainFrName)
{
startIt();
}
}
function IEunloaded()
{
isLoaded = false;
setTimeout("keepTrack()",50);
}
function keepTrack()
{
if (menuLoc.document.readyState == "complete")
{
startIt();
}
else
{
setTimeout("keepTrack()",50);
}
}
function startIt()
{
isLoaded = true;
menuLoc = eval("parent.frames." + mainFrName);
if (NS4)
{
loader.captureEvents(Event.LOAD);
loader.onload = NSloaded;
menuLoc.onunload = NSunloaded;
}
if (IE4)
{
menuLoc.document.body.onunload = IEunloaded;
}
}
function CreateLayer() {
if (isMenu) {
if (!isLoaded) return;
elStr = "<DIV ID='div1' style='position:absolute; top:30px; left:300px; width:300px; height:400px; background-color:#FFDDDD; color:#660000; font-size:9pt;'></DIV>";
menuLoc.document.body.insertAdjacentHTML("BeforeEnd",elStr);
eval("div1" + "= menuLoc." + "div1");
}
}
************** ENDE menu.js ************************
So ... beim Laden der Seite enthält die Variable "menuLoc" wirklich ein Objekt vom Typ "window" (alert spuckt das wunderbar aus)... prima.
Wird die Funktion CreateLayer() durch ein OnMouseOver-Event aufgerufen .... wird z.B. durch ein alert eine irre Fehlermeldung ausgegeben.
Netscape sagt über javascript: folgendes.
menuLoc.document.body has no properties.
Bezogen auf die Zeile
menuLoc.document.body.insertAdjacentHTML("BeforeEnd",elStr);
in der Funktion CreateLayer.
Warum verliert menuLoc seine Eigenschaften?
Ich werde noch wahnsinnig weil ich den Fehler nicht finde .....
Vielleicht habt ihr ja ne Idee .... wäre wirklich klasse!
Danke schon mal für die Mühen.
Ciao
Jörg
Hi Joerg!
Ich hab mir Deinen Code nicht genauer angeschaut, aber ein document.body gibt es in Netscape nicht,
das ist wohl ein Element aus Microsofts Dokumentmodell.
So long, Calocybe
Hi Calocybe!
Bleibt die Frage, warum menuLoc beim zweiten Aufruf der Funktion kein Window-Objekt mehr ist .... :-(
Übrigens: Der Code ist quasi kopiert und ein wenig angepaßt ... er funktioniert im Prinzip .... oder sollte zumindest ;-)
Ciao
Jörg
Hi again!
Bleibt die Frage, warum menuLoc beim zweiten Aufruf der Funktion kein Window-Objekt mehr ist .... :-(
Woran merkst Du, das menuLoc auf einmal kein window-Objekt mehr ist?
Du hast nur geschrieben, dass menuLoc.document.body keine properties hat, was daran liegt, dass menuLoc.document.body eben undefined ist, was wiederum daran liegt, dass ein document-Objekt in Netscape nun mal keine Eigenschaft namens body hat. Das sagte ich Dir ja auch schon.
Calocybe
Und wieder Hi :-)
Thx für die Antwort!
Bleibt die Frage, warum menuLoc beim zweiten Aufruf der Funktion kein Window-Objekt mehr ist .... :-(
Woran merkst Du, das menuLoc auf einmal kein window-Objekt mehr ist?
Du hast nur geschrieben, dass menuLoc.document.body keine properties hat, was daran liegt, dass menuLoc.document.body eben undefined ist, was wiederum daran liegt, dass ein document-Objekt in Netscape nun mal keine Eigenschaft namens body hat. Das sagte ich Dir ja auch schon.
Ich habe geschnackelt worum es ging ....
Die verwendete Function ist für den IE geeignet ...
Frage: Wie bekomme ich ähnlich umfangreich (von der Styleangaben her gesehen) einen Nescape-Layer in den Contentframe?
Oder sind da mehr Einzlschritte nötig?
Wäre toll, wenn Du dazu noch ein paar Infos hättest.
Ciao + einen taufrischen guten Morgen
Jörg
Auch nochmal hi
Frage: Wie bekomme ich ähnlich umfangreich (von der Styleangaben her gesehen) einen Nescape-Layer in den Contentframe?
Oder sind da mehr Einzlschritte nötig?
Leider bin ich in Sachen DHTML nicht so der Ahnungs-Inhaber. Sicher gibt es auch eine Weg, die Sache in Netscape zu erledigen. Notfalls musst Du vielleicht den Layer (bzw. das DIV) schon von Anfang an in den Source schreiben mit Style = unsichtbar und spaeter einfach sichtbar machen. Aber da kann Dir jemand anderes (Antje *wink* :-) ) sicher mehr drueber sagen.
So lange