Opera 7 und getElementById()
mikeg
- javascript
0 wahsaga0 Gernot Back
Hallo,
kanns sein, dass Opera 7 Probleme mit getElementById() oder so Sachen wie parent.frames.Framename macht und sowas einfach ignoriert?
Mein Opera 7.54 führt komischerweise einige Sachen in meinen JS nicht aus, obgleich eigentlich alles richtig geschrieben sein müsste (zumindest funktioniert es in IE, Firefox, Opera 8, usw. und die JS-Konsolen zeigen auch keine Fehler oder Warnungen an).
Danke schon mal und viele Grüße
mikeg
hi,
kanns sein, dass Opera 7 Probleme mit getElementById() oder so Sachen wie parent.frames.Framename macht und sowas einfach ignoriert?
nein, eigentlich nicht.
Mein Opera 7.54 führt komischerweise einige Sachen in meinen JS nicht aus, obgleich eigentlich alles richtig geschrieben sein müsste (zumindest funktioniert es in IE, Firefox, Opera 8, usw. und die JS-Konsolen zeigen auch keine Fehler oder Warnungen an).
hast du JS aktiviert ...?
gruß,
wahsaga
Hallo,
hast du JS aktiviert ...?
Ja klar. Es sind auch alle JS-features aktiviert. Trotzdem werden einige Teile einfach nicht ausgeführt und mir kommt es so vor, als wären das solche, die Objekte beeinflussen, die ich über getElementById oder via top.../bzw. parent.frames.Framename ansprechen will.
zB. bringt sowas in meinem Opera 7 keinen Effekt: document.getElementById("td1").setAttribute("height", "100%");
sowas hingegen schon:
var t = document.getElementById("test").style.display; alert(t);
wie erwartet alertet opera hier was (sinnvolles).
Laut SELFHTML Bsp. müsste aber obiges auch funktionieren.
??????? irgendwie bin ich da jetzt wirklich ziemlich ratlos, was da los ist...
greets und Dank
mikeg
hi,
zB. bringt sowas in meinem Opera 7 keinen Effekt: document.getElementById("td1").setAttribute("height", "100%");
von welchem elementtyp ist td1?
warum setzt du nicht die passende style-eigenschaft, anstatt ein HTML-attribut zur formatierung zu nutzen?
gruß,
wahsaga
Hallo,
von welchem elementtyp ist td1?
Table ...und ich bin mir der Tatsache dass ein Table kein height-Attribut hat durchaus bewusst. Leider kann ich in diesem Fall dieses Problem nicht anders lösen, als einen solch unangenehmen und unschönen Weg zu gehen, einem table ein solches Attribut unterzuschieben (sobald die css-Eigenschaft min-height unterstützt wird kann ich das ja ändern). Leider brauche ich Tabellen, die, ungeachtet des Contents, 100% hoch sind und bis dato kenne ich keinen Weg dieses Problem anders zu lösen. Da ich trotzdem nicht auf einen validen DOM-Parsebaum verzichten will, schiebe ich dieses Attribut erst nachträglich unter.
(Das ist auch der Grund, warum ich es nicht via css oder direkt mit dem Attribut im HTML formatieren kann. Sorry, dass ich dieses Detail bisher offen gelassen habe, aber ich wollte nicht Gefahr laufen, hier diverse Grundsatzdiskussionen anzustoßen.)
viele nachtschlafende Grüße
mikeg
Hallo mikeg,
Table ...und ich bin mir der Tatsache dass ein Table kein height-Attribut hat durchaus bewusst.
Das Table-Element darf aber ein Style-Attribut mit der Eigenschaft Height bekommen, dagegen spricht nichts!
(Das ist auch der Grund, warum ich es nicht via css oder direkt mit dem Attribut im HTML formatieren kann. Sorry, dass ich dieses Detail bisher offen gelassen habe, aber ich wollte nicht Gefahr laufen, hier diverse Grundsatzdiskussionen anzustoßen.)
Ich kann deinen Grund was CSS betrifft, nicht nachvollziehen.
Gruß Gernot
Hallo,
Ich kann deinen Grund was CSS betrifft, nicht nachvollziehen.
Ich auch nicht mehr ;-)
In einer früheren Version hatte ich es mal mit CSS probiert, was aber "damals" nicht funktioniert hat. Vermutlich hatte ich da entweder vergessen, body auf 100% zu setzen, oder ich hatte im html noch irgendwelche Fehler, die es zum scheitern brachten. Wie auch immer, deshalb war ich fälschlicherweise der Meinung, dass es mit CSS nicht funktioniert.
Jetzt habe ich es in allen Dokumenten ausgebessert und es funktioniert natürlich.
Danke für den Hinweis.
Allerdings funktionieren komischerweise gewisse Skriptteile immer noch nicht (bei meinem Opera) und was noch komischer ist, auf dem Opera gleicher Version am Rechner eines Kumpels funktioniert es. Es scheint mir jetzt auch nicht mehr als läge der Fehler daran, wie ich Elemente od. Funktioinen anspreche.
(habe jetzt auch mal alles von parent.frames.Framename auf parent.Framename umgestellt, blieb aber ohne Effekt).
Vielleicht hat mein Opera einen Fehler?
Vielleicht liegt der Fehler aber auch im "Kontrollfluss"? - welcher i.e. so aussieht:
In meinem Opera wird das Intervall nicht unterbrochen, da im Submenü ein Funktionsaufruf (onload), der die globale var ändern soll einfach nicht stattfindet. Es scheint fast, als würde das durch das ablaufen der Intervall-Schleife in parent verhindert.??? - kann das sein?
Danke und viele Grüße
mikeg
Hi,
In meinem Opera wird das Intervall nicht unterbrochen, da im Submenü ein Funktionsaufruf (onload), der die globale var ändern soll einfach nicht stattfindet.
Zum fehlenden onload-Event & co. kann ich zwar nichts sagen, aber ein Intervall ist i.d.R. hier nicht notwendig, ggf. kann man sogar auf den onload verzichten.
Gruß, Cybaer
Hallo Cybaer,
In meinem Opera wird das Intervall nicht unterbrochen, da im Submenü ein Funktionsaufruf (onload), der die globale var ändern soll einfach nicht stattfindet.
Schau Dir doch noch mal meinen Post mit dem Kontrollfluss an...
Ich brauche das Intervall nämlich um zu warten, bis die Subnavigation geladen ist. Wenn ich in dieser von der Hauptnavigation aus Funktionsaufrufe machen will muss sie ja erst geladen sein da ansonsten der Funktionsaufruf nicht ausgeführt werden kann...
Deshalb muss die Subnavigation ihrerseits erst an die Hauptnav melden, dass sie da ist (indem in dieser mit onload eine Funktion aufruft, die in der Hauptnav eine globale var ändert).
viele Grüße
mikeg
Hi,
Ich brauche das Intervall nämlich um zu warten, bis die Subnavigation geladen ist.
Ich weiß nicht, was Du genau wo warum wann machst.
Ich weiß aber, daß ich für eine solche Aufgabenstellungen bislang noch *nie* einen timeout gebraucht habe. Und ggf. ist sogar der onLoad nicht notwendig. Ich wollte dir damit also nur mitteilen, daß dein derzeitiger Lösungsansatz mit Sicherheit "suboptimal" ist. =;-)
Wenn ich in dieser von der Hauptnavigation aus Funktionsaufrufe machen will muss sie ja erst geladen sein da ansonsten der Funktionsaufruf nicht ausgeführt werden kann...
Natürlich.
Deshalb muss die Subnavigation ihrerseits erst an die Hauptnav melden, dass sie da ist (indem in dieser mit onload eine Funktion aufruft, die in der Hauptnav eine globale var ändert).
Wozu soviel Aufwand? Du denkst *zu* komplex! Keep it simple!
subFunc soll aufgerufen werden von HauptNav?
Also ist subFunc im Header (der SubNav) definiert und am *Ende* der SubNav-Seite (mindestens aber direkt hinter dem nachträglich zu ändernden Element) ist ein Script, das eine mainFunc in der HauptNav aufruft (so die HauptNav bzw. die dortige mainFunc existiert) die wiederum die (ja nun definitiv existente) subFunc aufruft (schließlich wurde mainFunc ja von SubNav aufgerufen - aber sicherheitshalber kann man das ja nochmal vorher überprüfen).
Kein Timeout, kein onLoad und schneller ist es sowieso. Ggf. sind so alle dynamischen Änderungen an der SubNav bereits erledigt, bevor der Browser diese Seite überhaupt anzeigt.
Gruß, Cybaer
Hallo,
Deshalb muss die Subnavigation ihrerseits erst an die Hauptnav melden, dass sie da ist (indem in dieser mit onload eine Funktion aufruft, die in der Hauptnav eine globale var ändert).
Wozu soviel Aufwand? Du denkst *zu* komplex! Keep it simple!
Die Subnavigation ist als iframe eingebettet, ebenso der Contentbereich. Damit a) der Content nicht ohne Navigation aufgerufen werden kann und b) die Navigation die aktuelle Position im Content wiederspiegelt, brauche ich eine Möglichkeit, die das gewährleistet. Wenn also zb. jemand durch externe oder interne Suche direkt auf eine Contentseite zugreift, muss der Rest der Seite nachgeladen werden (also zb. Haupt- und Subnavigation). Wie auch immer müsste zum Highlighten von Buttons in der SubNav diese erstmal geladen sein. Wenn ich einen entsprechenden Funktionsaufruf nun mache, ehe sie galaden ist, geht dieser direkt ins Nirvana und es passiert einfach garnichts.
greets
mikeg
Hi,
Wenn ich einen entsprechenden Funktionsaufruf nun mache, ehe sie galaden ist, geht dieser direkt ins Nirvana und es passiert einfach garnichts.
[ ] Du hast verstanden
Es ist egal, ob Du zuerst den Content hast, oder zuerst das "Frameset". Es ist ferner egal, ob Du eines von beiden oder beides nachladen mußt. Genauer: Man kann es so programmieren, daß es egal ist. Und keinesfalls bist Du dabei auf onload geschweige denn einen timeout (==:-o) angewiesen. Versuche nachzuvollziehen, was ich geschrieben habe ...
... oder laß es.
Bei letzterem: Pienz' dann aber nicht 'rum und rechne zukünftig mit einer süffisanten Bemerkung, solltest Du hier weiter öffentlich schreiben, daß man onload & timeout dafür brauchen würde. ;->
Gruß, Cybaer
Hi,
Table ...und ich bin mir der Tatsache dass ein Table kein height-Attribut hat durchaus bewusst.
Aber offensichtlich nicht der Tatsache, daß Browser dieses ihnen ggf. unbekannte Attribut dann auch einfach ignorieren?
Da könntest Du auch das Attibut hoehe verwenden ... =;->
Leider brauche ich Tabellen, die, ungeachtet des Contents, 100% hoch sind und bis dato kenne ich keinen Weg dieses Problem anders zu lösen.
CSS, bzw. mit JavaScript: style.
Ansonsten: Opera hat div. JS-Fehler. So kann man über diese Methode, zumindest bei Operas bis 7.irgendwas nicht die Höhe von Frames ändern, was alle anderen Browser problemlos schaffen.
(Das ist auch der Grund, warum ich es nicht via css oder direkt mit dem Attribut im HTML formatieren kann.
? Nix verstehen! Was ist denn an CSS' height nicht valide?
Gruß, Cybaer
Hi,
Aber offensichtlich nicht der Tatsache, daß Browser dieses ihnen ggf. unbekannte Attribut dann auch einfach ignorieren?
Da könntest Du auch das Attibut hoehe verwenden ... =;->
So gut wie alle Browser interpretieren dieses falsch gesetzte Attribut height in table (ich habe noch keinen gängigen Browser gesehen, der das nicht tut). Wenn es direkt im html stand hat es auch funktioniert. Nur halt nicht wenn ich es nachträglich mit JS übers Dom eingefügt habe und da auch nur in meinem Opera 7.54 nicht, in allen anderen Browsern und Opera Versionen funktionierte es ja.
Nix verstehen! Was ist denn an CSS' height nicht valide?
Hab ich nie geschrieben, dass CSS height nicht valide sein soll, nur html table height ist es nicht.
Jetzt funktionierts ja mit css wie's soll
Grüße
mikeg
Hi,
So gut wie alle Browser interpretieren dieses falsch gesetzte Attribut height in table (ich habe noch keinen gängigen Browser gesehen, der das nicht tut).
Oh, ich schon einige. Ob etwas gültig ist oder nicht, entscheidet sich halt ggf. anhand der DTD. Dafür ist sie ja da. Und ob in der DTD "height" oder "hoehe" *nicht* steht, ist einerlei.
Wenn es direkt im html stand hat es auch funktioniert.
Da hast Du andere Erfahrungen gemacht, als die restlichen User hier. =;-)
Hab ich nie geschrieben, dass CSS height nicht valide sein soll, nur html table height ist es nicht.
Hmm, ich habe wohl "Da ich trotzdem nicht auf einen validen DOM-Parsebaum verzichten will, schiebe ich dieses Attribut erst nachträglich unter. (Das ist auch der Grund, warum ich es nicht via css oder direkt mit dem Attribut im HTML formatieren kann." nicht verstanden ... ;->
Jetzt funktionierts ja mit css wie's soll
q.e.d.! :-)
Gruß, Cybaer
Table ...und ich bin mir der Tatsache dass ein Table kein height-Attribut hat durchaus bewusst. Leider kann ich in diesem Fall dieses Problem nicht anders lösen, als einen solch unangenehmen und unschönen Weg zu gehen, einem table ein solches Attribut unterzuschieben (sobald die css-Eigenschaft min-height unterstützt wird kann ich das ja ändern). Leider brauche ich Tabellen, die, ungeachtet des Contents, 100% hoch sind und bis dato kenne ich keinen Weg dieses Problem anders zu lösen.
Das ist mir auch unklar. 100% ist 100% was spricht dagegen im CSS zu schreiben:
html, body {height:100%;}
body{ margin:0; padding:0; }
table{ height:100%; }
Zumal Opera min-height unterstützt.
Struppi.
Hallo mikeg,
zB. bringt sowas in meinem Opera 7 keinen Effekt: document.getElementById("td1").setAttribute("height", "100%");
sowas hingegen schon:
var t = document.getElementById("test").style.display; alert(t);
wie erwartet alertet opera hier was (sinnvolles).
Laut SELFHTML Bsp. müsste aber obiges auch funktionieren.
Die Methode setAttribute() wird in SELFHTML dreimal beschrieben; zweimal davon mit drei Übergabeparametern (als Methode des style und des All-Objekts, die aber auch in Verbindung mit getElement... funktionieren sollte), einmal als Methode des Node-Objekts mit zwei Übergabeparametern. Außerdem kann man den Wert ja auch noch direkt setzen:
document.getElementById("test").style.height='100%';
oder
document.getElementById("test").height='100%';
Ich bin mir sicher, da findet sich auch was für Opera.
Gruß Gernot
Hi,
Die Methode setAttribute() wird in SELFHTML dreimal beschrieben; zweimal davon mit drei Übergabeparametern (als Methode des style und des All-Objekts, die aber auch in Verbindung mit getElement... funktionieren sollte), einmal als Methode des Node-Objekts mit zwei Übergabeparametern. Außerdem kann man den Wert ja auch noch direkt setzen:
document.getElementById("test").style.height='100%';
oder
document.getElementById("test").height='100%';Ich bin mir sicher, da findet sich auch was für Opera.
nur was... ;-)
auf was ich in meinem Bsp. angespielt habe war die Methode des Node Objects unter (http://de.selfhtml.org/javascript/objekte/node.htm#set_attribute) und genau diese würde ich auch benötigen, da ich aus gegebenen Gründen die Eigenschaft nicht direkt ansprechen kann, da es den Attributknoten noch nicht gibt. Also bin ich darauf angewiesen, diesen über das DOM erst zu erzeugen und dann mit einem Wert zu versehen.
Wenn ich die Beschreibung richtig verstanden habe sollte setAttribute() genau das machen (da, falls es den Attributknoten noch nicht gibt, dieser erst erzeugt wird). In IE und Mozialla Browsern funktioniert das auch wie erwartet... nur dieser Opera will nicht so wie ich es will...
PS: ebenso will Opera auch nicht so in anderen Funktionen, in denen diverse Elemente des Interfaces abgeglichen werden sollen, bei denen ich diese via parent.frames.Framename anspreche. Hier habe ich nicht wirklich verstanden, was Du mir mit Deiner ersten Antwort sagen wolltest (dass ich nur parent.FrameName schreiben kann??? - das funktioniert allerdings nicht). (PPS: Dokument ist kein Frameset sondern die anzusprechenden Objekte sind iframes)
greets
mikeg
Hallo mikeg,
Wenn ich die Beschreibung richtig verstanden habe sollte setAttribute() genau das machen (da, falls es den Attributknoten noch nicht gibt, dieser erst erzeugt wird). In IE und Mozialla Browsern funktioniert das auch wie erwartet... nur dieser Opera will nicht so wie ich es will...
Vielleicht braucht Opera ja eine Extra-Einladung. robier es doch mal in zwei Schritten:
http://de.selfhtml.org/javascript/objekte/node.htm#set_attribute_node
PS: ebenso will Opera auch nicht so in anderen Funktionen, in denen diverse Elemente des Interfaces abgeglichen werden sollen, bei denen ich diese via parent.frames.Framename anspreche.
Das ist nicht üblich, wenn schon, dann eher parent.frames['FrameName']
http://de.selfhtml.org/javascript/objekte/frames.htm
Hier habe ich nicht wirklich verstanden, was Du mir mit Deiner ersten Antwort sagen wolltest (dass ich nur parent.FrameName schreiben kann??? - das funktioniert allerdings nicht). (PPS: Dokument ist kein Frameset sondern die anzusprechenden Objekte sind iframes)
Iframes sind nichts anderes als Frames, man spricht sie geanuso an. Ob es sich beim Mutterdokument um ein Frameset oder seinerseits um eine gewöhnliche HTML-Seite ist egal.
Gruß Gernot
Hallo mikeg,
kanns sein, dass Opera 7 Probleme mit getElementById() oder so Sachen wie parent.frames.Framename macht (...)
Kann es sein, dass es daran liegt, dass das hier __________________________________^^^^^^^ eigentlich in dem Zusammenhang überflüssig ist?
Gruß Gernot