Seltsamer Js-Fehler auf meiner Seite...
KD-one
- javascript
Hallo an alle,
Wenn der Link "Gästebuch gewählt wird, tritt im IE 6, im Opera 7.2 und Mozilla 1.5 folgende Fehlermeldung auf:
IE:
Zeile 64:
Fehler:'document.all[...].style ist null oder kein Objekt'
Der MS-Debugger markiert eine Zeile in der das Script hide_it()[onMouseOut] auf dieser Seite zum 4.male!!! (bei divMenu2) aufgerufen wird. ein für mich unverständlicher Vorgang.
Syntaktisch ist alles in Ordnung, ich habe das Script x-mal kontrolliert, sowie auch den Aufruf.
Opera:
Event thread: onmouseover
Error:
name: TypeError
message: Statement on line 62: Expression evaluated to null or undefined and is not convertible to Object: document.getElementById(id)
Backtrace:
Line 62 of linked script http://faq.united-web.at/_test/scripte/faq.js
document.getElementById(id).style.visibility = "hidden";
In unknown script
hide_it("divMenu1");
Line 74 of linked script http://faq.united-web.at/_test/scripte/faq.js
eval("hide_it('divMenu" + cnt[i] + "');");
In unknown script
clean(1, 2, 3, 5);
At unknown location
{event handler trampoline}
Mozilla 1.5
Fehler: document.getElementById(id) has no properties
Quelldatei: http://faq.united-web.at/_test/scripte/faq.js
Zeile: 62
Die betroffenen Funktionen:
function hide_it(id)
{
if(window.opera || (document.getElementById && !document.all))
document.getElementById(id).style.visibility = 'hidden';
else if(document.all)
document.all[id].style.visibility = 'hidden';
else if(document.layers)
document.layers[id].visibility = 'hide';
}
function clean()
{
var i,cnt=clean.arguments;
for(i=0;i<cnt.length;i++)
{
eval("hide_it('divMenu"+cnt[i]+"');");
}
}
Ich vermute mal, daß irgendwas zum Zeitpunkt des Einlesens der Layer noch nicht geladen ist, der Fehler tritt_nur_bei diesem_einen_Link auf.
Kann man den Fehler irgendwie verhindern oder aber, wenn nicht, abfangen, sodaß keine Fehlermeldung erscheint?
Nach Laden der Seite funktioniert ja alles wie gewünscht und es gibt auch keine Fehlermeldungen mehr.
Firebird 0.7 hat übrigens keine Probleme mit dem Link.
Gruß
Kurt
Hallo an alle,
Wenn der Link "Gästebuch gewählt wird, tritt im IE 6, im Opera 7.2 und Mozilla 1.5 folgende Fehlermeldung auf:
IE:
Zeile 64:
Fehler:'document.all[...].style ist null oder kein Objekt'
Der MS-Debugger markiert eine Zeile in der das Script hide_it()[onMouseOut] auf dieser Seite zum 4.male!!! (bei divMenu2) aufgerufen wird. ein für mich unverständlicher Vorgang.
Syntaktisch ist alles in Ordnung, ich habe das Script x-mal kontrolliert, sowie auch den Aufruf.
Sorry, der MS-Debugger markiert den 12. Aufruf der Funktione change() bei onmouseOut in divMenu2
die Funktion:
function change(id,klasse)
{
if(window.opera || (document.getElementById && !document.all))
document.getElementById(id).className = klasse;
else if(document.all)
document.all[id].className = klasse;
else if(document.layers)
document.layers[id].className = klasse;
}
Wie gesagt, die Fehlermeldung weist auf die Funktion hide_it(es wird der Aufruf von document.all[...].style bemängelt), der Debugger markiert aber den Aufruf von change(). ???
Gruß
Kurt
Gugugg,
entweder ich bin blind, oder ich kann keinen Link Gästebuch auf deiner HP entdecken. Anmeckern tun doch alle dasselbe: Nämlich dass das Element mit der übergebenen id nicht existiert. Da du ja die id mit this.id übergibst, solltest du vielleicht mal gucken, was denn das Gästebuch tatsächlich für eine id hat und ob es eine hat. Und ob da nicht vielleicht irgendein fieses kleines Anführungszeichen fehlt oder ähnliches.
Gruß, Uschi
Hallo Uschi,
Gugugg,
entweder ich bin blind, oder ich kann keinen Link Gästebuch auf deiner HP entdecken. Anmeckern tun doch alle dasselbe: Nämlich dass das Element mit der übergebenen id nicht existiert. Da du ja die id mit this.id übergibst, solltest du vielleicht mal gucken, was denn das Gästebuch tatsächlich für eine id hat und ob es eine hat. Und ob da nicht vielleicht irgendein fieses kleines Anführungszeichen fehlt oder ähnliches.
Sorry, hier der Link: http://faq.united-web.at/_test/index.php?body=1&content=guestbook
Tatsächlich geht es ja um den Relauch der Site, die ist zur Zeit noch in einem Testverzeichnis.
this.id spricht ja nur das div an, das das Menü enthält. Das Gästebuch oder auch sonstiger anderer Content ist ja nicht von dem JS betroffen, die Seite wird serverseitig zusammengestellt.
Die Scripte dienen alleine dazu, die Divs des JS-Menüs anzuzeigen,bzw. zu verbergen.
Nochmals sorry, daß ich den Link vergessen habe.
Gruß
Kurt
Verflixt und zugenäht,
ich suche jetzt auch schon eine halbe Stunde und Finde den Bock nicht. Ich habe mir den Kram auf die Platte gezogen, mit Mozi 1.3 getestet (kein Fehler).
Der IE6 liefert hier lokal auch keinen Fehler. Die anzuzeigenden Elemente existieren tatsächlich alle. Gehe ich aber online auf die Seite, kriege ich Fehlermeldungen, allerdings völlig erratisch, mal ja, mal nein.
Wenn es aber lokal geht, und online nicht ist es vielleicht Timer-Problem? Ich bin ratlos. Aber wenn, sollte man die Fehlermeldungen dadurch abfangen können, dass du in in change, show_it und hide_it das ändern, verstecken etc nur ausführt, wenn das Element nach Ansicht des Browsers existiert, also z.B.
function hide_it(id)
{
if(window.opera || (document.getElementById && !document.all))
if(document.getElementById(id)) {
document.getElementById(id).style.visibility = 'hidden';
}
else if(document.all) {
if(document.all[id]) {
document.all[id].style.visibility = 'hidden';
}
} else if(document.layers) {
if(document.layers['id']) {
document.layers[id].visibility = 'hide';
}
}
}
Gruß, Uschi
Hallo Uschi Renziehausen,
Verflixt und zugenäht,
Ja, was denkst du, hab ich dazu gesagt. ;-)
ich suche jetzt auch schon eine halbe Stunde und Finde den Bock nicht. Ich habe mir den Kram auf die Platte gezogen, mit Mozi 1.3 getestet (kein Fehler).
Der IE6 liefert hier lokal auch keinen Fehler. Die anzuzeigenden Elemente existieren tatsächlich alle. Gehe ich aber online auf die Seite, kriege ich Fehlermeldungen, allerdings völlig erratisch, mal ja, mal nein.
Wenn es aber lokal geht, und online nicht ist es vielleicht Timer-Problem? Ich bin ratlos.
Ja, ich auch. Inzwischen konnte ich vermutlich die Fehlerquelle eingrenzen [pref:t=66542&m=379888].
Aber wenn, sollte man die Fehlermeldungen dadurch abfangen können, dass du in in change, show_it und hide_it das ändern, verstecken etc nur ausführt, wenn das Element nach Ansicht des Browsers existiert, also z.B.
function hide_it(id)
{
if(window.opera || (document.getElementById && !document.all))
if(document.getElementById(id)) {
document.getElementById(id).style.visibility = 'hidden';
}
else if(document.all) {
if(document.all[id]) {
document.all[id].style.visibility = 'hidden';
}
} else if(document.layers) {
if(document.layers['id']) {
document.layers[id].visibility = 'hide';
}
}
}
Jau, das wäre eine Idee!
Ich muss jetzt weg, aber abends werde ich das ganze gleich mal testen.
Ich habe ja auch schon an das try-catch http://www.selfhtml.teamone.de/javascript/beispiele/fehlerbehandlung_try_catch.htm Statement gedacht, das scheint mir aber bei meinen Kenntnissen doch etwas schwierig zu werden.
Ich versuche erst mal deinen Weg! :-)
Danke für die Mühe, die du dir gemacht hast!
Gruß
Kurt
Hallo Uschi,
Mit deinem workaroun funktioniert es nun in Opera7.2, Firebird 0.7 und Mozilla 1.5, aber dafür steigt der IE 6 aus.
Da funktioniert das Menü als Ganzes nicht mehr.
Werde mich dann doch wohl an die Try-catch Methode ranwagen müssen... :-(
Gruß
Kurt
Hallo Kurt,
Werde mich dann doch wohl an die Try-catch Methode ranwagen müssen... :-(
Das Prinzip ist eigentlich relativ einfach.
<script type="text/javascript">
<!--
try {
alert("Start");
var a = document.getElementById("gibtsNicht").kannNichtgehen;
alert("Das wird nicht mehr passieren. " + a);
} catch(e) {
//hierher kommt das Script nur bei einem Fehler im try-Block
alert(e);
}
alert("Hier gehts dann trotz Fehler weiter ...");
//-->
</script>
viele Grüße
Axel
Hallo Axel Richter,
Hallo Kurt,
Werde mich dann doch wohl an die Try-catch Methode ranwagen müssen... :-(
Das Prinzip ist eigentlich relativ einfach.<script type="text/javascript">
<!--
try {
alert("Start");
var a = document.getElementById("gibtsNicht").kannNichtgehen;
alert("Das wird nicht mehr passieren. " + a);
} catch(e) {
//hierher kommt das Script nur bei einem Fehler im try-Block
alert(e);
}
alert("Hier gehts dann trotz Fehler weiter ...");
//-->
</script>
Danke dir für die Erklärung.
Das Problem hat sich zwar bereits erübrigt(Eigenfehler), aber ich werde es trotzdem mal zu Übungszwecken versuchen.
Danke nochmals!
Gruß
Kurt
Hallo Uschi,
Sorry, das war zu schnell.
Ich hatte einen Schachtelungsfehler, an dem sich nur der IE gestoßen hat.
Nun funktioniert es wieder überall! :-)
Danke dir!
Gruß
Kurt
Gugugg Kurt,
Mir fällt da so im Nachgang noch ein: Warum haust du das Hauptmenü eigentlich über document.write raus?
Uschi
Hallo Uschi,
Gugugg Kurt,
Mir fällt da so im Nachgang noch ein: Warum haust du das Hauptmenü eigentlich über document.write raus?
Weil das Menü nur bei aktiviertem JS angezeigt werden soll.
Als Alternative dient ein Listenmenü, das aber bereits eine beträchtliche Länge besitzt.
Mit display:none und anschliessendem display:block per JS ginge es auch, das Menü anzuzeigen, aber leider kann dies Opera 6.* nicht handeln.
Mit Visibility geht es nicht, da sonst der Platz reserviert würde, der sowieso schon sehr begrenzt ist. Das Listenmenü würde dann erst etwa dort beginnen, wo bei aktiviertem JS der Link zum Listenmenü ist.
Deshalb die Entscheidung, das Menü per document.write reinzuschreiben, dann sind alle zufrieden. :-)
Gruß
Kurt
Hallo Uschi,
Weil das Menü nur bei aktiviertem JS angezeigt werden soll.
Als Alternative dient ein Listenmenü, das aber bereits eine beträchtliche Länge besitzt.
Mit display:none und anschliessendem display:block per JS ginge es auch, das Menü anzuzeigen, aber leider kann dies Opera 6.* nicht handeln.
Mit Visibility geht es nicht, da sonst der Platz reserviert würde, der sowieso schon sehr begrenzt ist. Das Listenmenü würde dann erst etwa dort beginnen, wo bei aktiviertem JS der Link zum Listenmenü ist.
Deshalb die Entscheidung, das Menü per document.write reinzuschreiben, dann sind alle zufrieden. :-)
Ursprünglich war das Menü ja relativ zu der Zelle positioniert, als die Entscheidung gefallen ist, erst, als ich merkte, daß der IE bei Schriftgrößenänderung die Submenüs verschob, habe ich das Hauptmenü absolut positioniert.
Danach habe ich aber am Menü selbst nichts mehr verändert.
Gruß
Kurt
Nochmal re,
das mit Opera 6.x und Schwierigkeiten bei display:block respektive none wusste ich nicht. Wieder was gelernt. Ich bastel gerade an einem Administrations-Tool. Da ich dort bei display: none auf Probleme mit der Übertragung von Formulardaten stoßen würde, bin ich darauf verfallen die Unsichtbarkeit über visibility zu erzeugen und Breite und Höhe bei Unsichtbarkeit auf 1px zu setzen. Beim Sichtbarmachen ändere ich dann einfach die css-Klasse. Würde der eine Pixel was ausmachen?
Uschi
Hallo Uschi,
»
das mit Opera 6.x und Schwierigkeiten bei display:block respektive none wusste ich nicht. Wieder was gelernt.
Sei getröstet, ich wusste es auch erst, als der 6er Opera mein Menü nicht und nicht anzeigen wollte. :o)
»Ich bastel gerade an einem Administrations-Tool. Da ich dort bei display: none auf Probleme mit der Übertragung von Formulardaten stoßen würde, bin ich darauf verfallen die Unsichtbarkeit über visibility zu erzeugen und Breite und Höhe bei Unsichtbarkeit auf 1px zu setzen. Beim Sichtbarmachen ändere ich dann einfach die css-Klasse. Würde der eine Pixel was ausmachen?
Nein, würde er natürlich nicht.
Jetzt schon gar nicht, da das Menü nun absolut positioniert ist, aber da es nun so schön funktioniert und ich damit auch noch überflüssigen Quelltext einspare, werde ich es vermutlich nicht mehr ändern. ;-)
Der Vorteil bei der Geschichte ist ja der, daß bei fehlender Funktionalität kein Byte davon im Browser auftaucht, im Gegensatz zu der Lösung mit visibility.
Gruß
Kurt
Hallo an alle,
Der Auslöser dürfte die http://faq.united-web.at/_test/scripte/menu.js Datei sein.
Diese Datei schreibt per document.write das Menü in die Seite und ist bereits im Cache.
Ich vermute mal, da das Laden des Gästebuches relativ lange dauert, daß die divs noch nicht im Speicher sind, die von dem Script angesprochen werden.
Auf sämtlichen anderen Seite tritt dieser Fehler nämlich nicht auf.
http://faq.united-web.at/_test/index.php?body=1&content=guestbook
onError="return false" funktioniert nicht, da dieser event Handler ja nur für <img> vorgesehen ist und nicht als eigenständiger Eventhandler notiert werden kann?!?
Weiss jemand vielleicht eine Lösung?
Abfangen wäre ja ok, da es sich nur um ein Timingproblem handelt, nur weiss ich nicht, wie.
Gruß
Kurt